CG 3.0 протекает? - PullRequest
       4

CG 3.0 протекает?

4 голосов
/ 18 сентября 2011

Я обнаружил, что CG имеет утечку памяти.Я отправил отчет через nvidia.com, но если вы попробуете это здесь :

Если вы удалите строку с надписью

cgD3D11SetTextureParameter( g.theTexture, g.sharedTex ) ;

Утечка прекращается.

Действительно ли CG 3.0 протекает?

Использование 64-разрядной графической карты ATI Radeon 5850 / Windows 7.

Ответы [ 3 ]

3 голосов
/ 29 декабря 2011

Да, это утечка.Внутренне он создает ShaderResourceView при каждом вызове и никогда не освобождает его.Я думаю, что API плохо спроектирован, они должны были использовать ShaderResourceView * в качестве параметра этой функции, а не просто Resource *.

Я писал об этом на форумах nvidia около 6 месяцев назад и никогда не получалответ

Публикуется ли ваш отчет публично?Или какой-то частный билет поддержки?

1 голос
/ 30 мая 2013

Да, Cg 3.0 протекает каждый раз, когда вы вызываете cgD3D11SetTextureParameter (), что приводит к увеличению использования памяти вашим приложением.К сожалению, это делает Cg 3.0 с D3D11 совершенно непригодным для использования.Одним из симптомов этого является то, что через некоторое время вашего приложения оно прекратит рендеринг, и экран просто станет черным.Я потратил много времени, пытаясь выяснить причину этого, прежде чем обнаружил ошибку Cg.

Если кто-то задается вопросом, почему этого не видно в демоверсиях Cg D3D11, то это потому, что немногие, которые на самом деле используют текстуры,настолько просто, что им может сойти с рук только вызов cgD3D11SetTextureParameter () один раз в начале.

Эта же ошибка остается в Cg Toolkit 3.1 (апрель 2012 г.).

0 голосов
/ 24 сентября 2011

jmp [ОБНОВЛЕНИЕ] ;;пропустить устаревший текстовый сегмент

Может ли быть так, что Cg уничтожается после d3d, поэтому он не освобождает ссылку вовремя?Или наоборот?например, функция, получающая текстуру, но не освобождающая ее до закрытия d3d, потому что когда вы устанавливаете текстуру для шейдера, текстура получается до тех пор, пока ресурсы шейдера не будут каким-либо образом освобождены.Вы разрушаете контекст d3d, здесь: SAFE_RELEASE (g.d3d);SAFE_RELEASE (g.gpu);Позже вы освобождаете шейдер следующим образом CleanupCg (): cgDestroyProgram (g.v_vncShader);checkForCgError («уничтожение вершинной программы»);cgDestroyProgram (g.px_vncShader);checkForCgError («программа уничтожения фрагментов»);Попробуйте изменить порядок вызовов так, как вы сначала высвободите все ресурсы из cg и d3d, вот что: cgD3D11SetDevice( g.cgContext, NULL ); также следует вызывать перед освобождением контекста d3d, на всякий случай.

ОБНОВЛЕНИЕ:

Это должно отличаться внутри WinMain():

initD3D11() ;  // << FIRST you init D3D
initCg() ;     // << SECOND you init CG with the D3D pointers

initD2D1() ;   // 
initVBs() ;

// Main message loop    
while( WM_QUIT != msg.message ){ /* loop code */ }

CleanupDevice();   //// << FIRST you release all D3D, when Cg is still referencing it (why?). 
CleanupCg();       //// << SECOND if something in the Cg runtime depend on d3dcontext which you just destroyed, it will crash or leak or do whatever it wants

, поэтому вы должны поменять их местами, чтобы Cg освободил любой указатель d3d:

CleanupCg();       //// << FIRST release Cg to ensure it's not referencing D3D anymore. 
CleanupDevice();   //// << SECOND D3D isn't either referencing or being referenced by Cg, so just release it all

Вы могли бы также предоставить выходные данные отладчика и другую информацию, как я там спросил, потому что вы в основном говорите: «Cg, похоже, не работает, это весь код, посмотрите строку ###, он не работает?»но в вашем файле содержится более тысячи строк (1012) кода C, C ++ и шейдера, вы в основном не предоставляете никакой информации, но легко указываете на ошибку Cg (основанную на ... что?), которая, конечно, если выВы уверены, зачем кому-то смотреть на код, если код в порядке?Что, кстати, не то, что мне это не нравится, но ... у него есть такие мелочи, как упорядочение вызовов, которые являются глупыми ошибками, но которые могут сделать отладку настоящим адом, это явная ошибка, и яможет также подумать, что если я просто загляну в Main и обнаружу ошибку, то до вызова рендера и реализации Cg еще далеко, не так ли?Я не могу запустить приложение на WinXP, но эти ошибки находятся в самых предсказуемых местах:)

Итак ... когда ваш код очищен от каких-либо ошибок ... ооо!смотреть!то, что я только что нашел ..

~VertexBuffer()
{
  SAFE_RELEASE( vb );
  SAFE_RELEASE( layout ) ;
}

получается в конструкторе VertexBuffer, который вы называете iD3D->GetImmediateContext( &gpu ); и храните указатель в приватном члене, так что ... не следует ли добавлять:

SAFE_RELEASE( gpu ); // ? there are 3 VertexBuffers instances, so that's another memory leak.

Хорошо, есть некоторые вещи, которые вы должны исправить в своем коде, которые вызывают утечку памяти, и я просто взглянул на это, чтобы вы на самом деле не пытались.С другой стороны, кажется, что ваш код ясен и полон объяснений, и мне нужно изучить DX11, так что на самом деле я должен поблагодарить вас за это.Хотя это было несколько грубо: P, особенно потому, что я, вероятно, прав, и другие люди не будут читать ваш код, как только появится страница.

...