Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Не могу удалить текстуру в DirectX.

3 views
Skip to first unread message

Daniil Smolyakov

unread,
Sep 30, 2005, 8:10:34 AM9/30/05
to
Hi!

DirectX vs Delphi
Такая штука получается: создается текстура нормально, а вот при удалении:
If Assigned(Texture) then
begin
Texture._Release;
Texture:=nil; <<<<<<< Проблемное место
end;
Возникает ошибка.
Такая же ерунда и при удалении объекта D3D, и при удалении D3DDevice.
Но про D3D и D3DDevice в некой книжке написано, что это, типа особенность
работы Delphi (когда задача запускается из под нее), поэтому нужно
запускать .exe отдельно.
Ну тогда сам объект и устройство удаляются без ошибок, но проблема с
удалением текстуры остается...
Кто-нибудь сталкивался с чем-нибудь подобным?

У меня задача: на место уже существующей текстуры загрузить другую.
Что могло быть проще? Ан нет, блин...
_Release проходит, а при присвоении nil - падает.
Если nil не присваивать, тогда не работает LoadTextureFromFile...

В IDirect3DTexture8 я не нашел метода Restore...
И при потере главной поверхности я думал восстанавливать все данные
путем их убийства и загрузки заново, но с такими вот делами это
вообще не канает.

Или же, из конца-то в конец, кто-нибудь может посоветовать
бесплатную для коммерческих целей 2D (DirectX 8) библиотеку?
Пусть и на Си.
Сам не берусь писать на нем движок полностью в силу малого
опыта работы в Сях. И если сделаю что-то "работающее",
нельзя допустить, чтобы где-то что-то было не стабильно,
в знакомом языке это отследить проще, чем сидя в чужой тарелке.

Кстати, касательно моего прошлого постинга:
И в 7 и 8 DirectX'ах проблема с выводом полигона с текстурой,
использующего XYZRHW структуру - полигон покрывается цветом первой
точки. Плюс ко всему: при RHW не работает освещение (где-то
выхватил, не помню где...). Или это только если нормали не
использовать?.. Но не суть...

Кроме всего прочего, не нашел в DirectX 7 ортогональную проекцию.
И после небольших, надо сказать, умозаключений решил перейти
на DirectX8.
Позже, правда, все-таки нашлась D3DRENDERSTATE_LOCALVIEWER -
вроде как считает все без перспективы... Но поезд уже ушел.

Так что теперь огреб себе другие проблемы в виде DX8+Delphi. :)

Уже третий раз игрулю переписываю. Сама-то игруля играется,
только вот движок все никак успокоится не дает.
Пора бы и за "чистовик" взяться...

Delphi DirectX'сты, откликнитесь!
Кто-то ведь уже написал стабильный DX движок?..

P.S. Есть еще довольно мощная штучка Asphyre v1.1.0 (DirectX 9)
Но там какая-то муть с лицензией.
Да и требовать DX 9 для 2D игрушки стыдно как-то. :-]

Bye!
MoonStone.


Alex Mizrahi

unread,
Sep 30, 2005, 5:44:56 PM9/30/05
to
(message (Hello 'Daniil)
(you :wrote :on '(Fri, 30 Sep 2005 12:10:34 +0000 (UTC)))
(

DS> Такая штука получается: создается текстура нормально, а вот при
DS> удалении:If Assigned(Texture) then
DS> begin
DS> Texture._Release;
DS> Texture:=nil; <<<<<<< Проблемное место
DS> end;
DS> Возникает ошибка.
DS> Такая же ерунда и при удалении объекта D3D, и при удалении D3DDevice.
DS> Но про D3D и D3DDevice в некой книжке написано, что это, типа
DS> особенность работы Delphi (когда задача запускается из под нее),
DS> поэтому нужно запускать .exe отдельно.
DS> Ну тогда сам объект и устройство удаляются без ошибок, но проблема с
DS> удалением текстуры остается...
DS> Кто-нибудь сталкивался с чем-нибудь подобным?

Delphi автоматически следит за COM-объектами. то есть когда нужно (при
присвоении указателя) вызывает Addref, а когда нужно -- Release (например,
при Texture=nil). вручную вызывать Release не нужно, если только ты сам не
делал Addref вручную.
оно в принципе так всё заточено, чтобы работало автоматически и
addref/release вручную вызывать было не нужно. если возникают вопросы --
посмотри что возвращает addref и release, насколько я помню, они количество
ссылок обычно возвращают, так и можно отследить. кроме того, можно
воспользоваться отладчиком уровня дизассемблера (тем не менее, там
встречаются комментарии, так что обычно можно разобраться что к чему) чтобы
узнать что происходит на самом деле.

DS> Сам не берусь писать на нем движок полностью в силу малого
DS> опыта работы в Сях. И если сделаю что-то "работающее",
DS> нельзя допустить, чтобы где-то что-то было не стабильно,
DS> в знакомом языке это отследить проще, чем сидя в чужой тарелке.

это для тебя знакомый язык, что ты не можешь разобраться что происходит,
списываешь на какие-то особенности работы Delphi? никаких особенностей быть
не может, всё должно работать как нужно вполне определённым образом, и если
что-то не понятно -- можно разобраться отладчиком. конечно, драйвера
отлаживать так будет сложновато :), но вот пользовательский код..

в общем, ты лучше потрать немного времени на освоение C++. там по крайней
мере smart-pointer'ы реализуются как шаблоны, так что видно как они
работают -- а не чудесным образом фигашатся компилятором. мне особенно
понравилось как оно сигнатуру функции изменило, увидев что там передаются
COM-объекты, не сказав при этом ни слова, так что на какую оно сигнатуру
изменило пришлось догадываться по дизасму.

)
(With-best-regards '(Alex Mizrahi) :aka 'killer_storm)
"People who lust for the Feel of keys on their fingertips (c) Inity")


0 new messages