← All posts tagged Directx

iorlas

Сколько не сижу на венде, не пишу под ней и для неё, всё диву даюсь как на этом ещё кто-то сидит, как оно стало популярно и как вообще MS хватает терпения писать и поддерживать такое, простите, дерьмище. Дерьмище, оно же ВСЁ, всё что пишут MS.
Чуть больше конкретики:
Все знают, что не редко приложение может терять контекст, устройство Direct3D. После его потери, необходимо произвести восстановление как ресурсов, так и самого устройства. Алгоритм прост:
1) Удалить D3D ресурсы(Release или OnLostDevice)
2) Восстановить устройство(Reset)
3) Восстановить ресурсы(с нуля создать или OnResetDevice)

Но вот есть одна проблема. Если хоть ОДИН из ресурсов не будет удалён до Reset, но будет использован для рендера до потери устройства, то Reset будет невозможен, а иногда даже может вызывать Access Violation Exception, который, обычно, не хендлится приложением, так как это SEH-исключение.
А знаете что хуже всего? Отловить где же и почему это исключение появилось — не реально. Как и не реально узнать, какой ресурс, а главное где, не был релизнут. Приходится отрубать куски кода, пока не заработает.

iorlas

Не все знают, но функция c_str() возвращает всегда новый объект, при этом он живёт только в текущем скоупе. Вызвали в функции, вышли из ней — и всё, указатель уже инвалиден. В связи с этим может появиться такой вот баг с DrawText:
1) Создаётся строка wstring до рендерринга.
2) Начинается рендерринг
3) Вызывается DrawText(str.c_str())
4) Включается какой-нибудь хитрый дебаггер.
5) Выход из тела функции рендерринга.
6) Рендерринг текста во внутреннем цикле D3D.
7) Эксепшн.

iorlas

Как и обещал, выкладываю готовую D3D9 прокси-длл — github.com
Суть проста:
Одна функция для хукинга — первый аргумент — оффсет функции в vtable(можно взять из enum'а в common.h), вторая — ссылка на функцию-хук.
Одна для анхукинга — то же самое, но без ссылки на функцию.
Пока всё очень скомканно и только для функции EndScene, но этого хватает.

iorlas

Джава и C# это как OpenGL и DirectX: вроде как джава кроссплатформенная, её любят многие члены FOSS-коммьюнити, она хорошая и даёт что нужно, но при этом, C# моднее, красивее, удобнее, фичастее, современнее.