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, особенно потому, что я, вероятно, прав, и другие люди не будут читать ваш код, как только появится страница.