Сбой в ID3DXConstantTable SetFloat/SetVector
У нас есть приложение с движком рендеринга, разработанное в Direct3d/C++. Недавно мы столкнулись с падением (нарушением прав доступа), связанным с ID3DXConstantTable SetFloat/SetVector и показанным внутри D3dx9_42.dll, когда мы подключили отладчик в двоичных файлах выпусков с PDB. Один из способов этого сбоя исчезает, когда мы уменьшаем количество используемых текстур D3dPOOL Rendertarget, но при оценке нагрузки на память графического процессора ее нет почти на половине доступного объема, так как мы используем карты NVIDIA 3 ГБ.
Подозревая, что это были некоторые повреждения кучи из-за перезаписи памяти, мы приступили к проверке кода и следовали тому, что мы использовали Application Verifier вместе с отладчиком для удаления из памяти перезаписей памяти, которые могут произойти сбой на более позднем этапе работы. Мы столкнулись с несколькими проблемами который мы сгладили. Но все же этот сбой остается на самом первом кадре рендеринга ID3DXConstantTable SetFloat/SetVector . Дополнительная информация: Это 32-битное приложение, работающее с флагом LARGEADDRESSAWARE. Есть указатели?
1 ответ
Мгновение спустя только я обнаружил проблему, я выполнил приложение с переключателем реестра MEM_TOP_DOWN(AllocationPreference=0x100000), и оно мгновенно упало в первом местоположении setfloat(). Затем я узнал, что постоянную таблицу нужно было извлечь с помощью D3DXGetShaderConstantTableEx() с флагом D3DXCONSTTABLE_LARGEADDRESSAWARE:) Спасибо