Подключенная программа DirectX 9 аварийно завершает работу при изменении размера окна, связанного с текстурой

Я использую EasyHook и SlimDX для наложения некоторой графики, используя классы SlimDX Sprite и Texture. Когда я изменяю размер окна, некоторые программы работают нормально, но другие вылетают - например, Winamp MilkDrop 2 выдает неоднозначную ошибку памяти.

Я ожидаю, что это связано с текстурой вторичного рынка, которую я создал. Вопрос в том, какую функцию VTable я должен перехватывать и/или как/когда мне удалять и воссоздавать текстуру? Сбросить наверное?

Если это не очевидно, я мало знаю о DirectX.

edit/ps: я рисую текстуру внутри хука EndScene, но я еще не создал никаких других хуков...


person Community    schedule 03.06.2010    source источник


Ответы (1)


Вам вообще не нужно пересоздавать текстуру, если она была создана в D3DPOOL_MANAGED (параметр D3DPOOL IDirect3DDevice9::CreateTexture).

Если вам абсолютно необходимо использовать D3DPOOL_DEFAULT и вам нужно убить потерянные текстуры, то самым простым способом будет уничтожить все «скоропортящиеся» объекты перед вызовом IDirect3DDevice9::Reset, а затем восстановить после вызова, но только если это было успешно .

Вы также можете отслеживать функции, которые могут возвращать D3DERR_DEVICELOST (их две), но будет проще перехватывать только Reset().

person Community    schedule 03.06.2010
comment
+1 Хороший ответ. Я бы определенно поспорил, что это проблема выбора пула. Не знаю, почему этот вопрос относится к Community Wiki, хотя ... - person Goz; 03.06.2010
comment
Я делаю то, что сказал SigTerm на IDirect3DDevice9::Reset. До этого я пробовал управляемый пул и пул по умолчанию, но в любом случае он выдавал одно и то же. - person Billy Back Bedroom; 04.06.2010