![]() |
|
Модераторы: Rickert, Alexeis, BorisVorontsov |
![]()
|
|
| EgoBrain |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: нет Всего: 2 |
Здравствуйте. Собственно требуется предпринять какие-то действия к объекту ID3DXFont после сброса устройства, так как метод DrawText вызывает исключение. Что нужно делать и почему я не знаю..
На всякий случай тект ошибки (хотя что он даст...):
Это сообщение отредактировал(а) EgoBrain - 21.5.2013, 08:40 |
||||
|
|||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 1 Всего: 27 |
Уф давно уже не мучал директ, но если мне не изменяет память, то после сброса нужно пересоздать вообще все объекты, в том числе и iDevice, а следом за ним и g_font. Вы так и делаете?
Access violation всего лишь означает что вы обратились к объекту, который больше не существует или существует уже в другом месте. Так что нужно заново создать и проинициализировать все объекты после сброса. |
|||
|
||||
| EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: нет Всего: 2 |
Дело в том что я плохо знаком с членами ID3DXFont, но вроде как многие интерфейсы Direct3D включают в себя автоматизированные средства (или просто стандартные обработчики событий) для штатных ситуаций типа сброса/потери устройства. Устройство пересоздавать не нужно после сброса (IDirect3DDevice9::Reset).
Пересоздание - решение в лоб, но не вижу в нём ничего плохого, нужно попробовать.. Добавлено через 6 минут и 34 секунды
Как проверить доступность этого объекта? |
|||
|
||||
| EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: нет Всего: 2 |
Немного доработал код, и вроде помогло, но почему то чайник перестал отображаться. Все равно непокидает чувство что что-то не так, не доведено до ума..
Есть статья msdn касательно потери устройства (Reset() инициирует потерю), есть перевод. Но все же не понятно что за методы OnLostDevice и OnResetDevice, когда их вызывать.. |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 1 Всего: 27 |
К сожалению никак, разве что отлавливать исключение типа try...catch и по нему судить, но это костыль. В 9м директе потеря устройства происходит, например, при переключении разрешения экрана. В этом случае пересоздавать устройство ОБЯЗАТЕЛЬНО. Кроме того при использовании Reset, точнее перед его использованием, вы ОБЯЗАНЫ удалить все буферы вершин, цепочки состояний, и тд и создать все это заново. Это обязательно, потому что при выполнении Reset, происходит утрата всех текстур, всех данных о вершинах в видеопамяти, а так же всех настроек рендера. Я не вижу этого у вас в коде, отсюда и ваши ошибки |
|||
|
||||
| kurlyak |
|
||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 7.11.2007 Репутация: 1 Всего: 3 |
От шо мне нравиться- все по- облому разобраться в проблеме. Лишь бы вставить свои 5 копеек.
Процедура рендеринга:
А при переключении- из Lost или Reset Device:
|
||||||||
|
|||||||||
| EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: нет Всего: 2 |
kurlyak, то есть пересоздавать ресурсы не нужно?
Зачем тормозить поток? оО onLostDevice и onResetDevice до и после ресета устройства вызывать только при переключении в фулскрин, а если я сглаживание или разрешение хочу поменять? З.Ы. Просто из приведенного кода все равно не понятно как он поможет не терять ресурс pFont... Может я просто pFont->OnLostDevice()/OnResetDevice() не в том месте и не в то время вызывал... Добавлено @ 04:45 А, и еще вопрос, хорошо ли постить сообщения окну для выхода в функции проверки устройства, может лучше ее результат получить из вызывающего блока и вдругом месте принимать решение...? Добавлено позже Кроме ID3DXFont у меня еще ID3DXMesh объект есть, он почему то после сброса не рисуется, даже после пересоздания (использовал тот же самый указатель). Это сообщение отредактировал(а) EgoBrain - 11.6.2013, 07:59 |
|||
|
||||
| EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: нет Всего: 2 |
Mesh пересоздавать не требуется. Моя ошибка был в том, что я матрицу проекции не переустанавливал из-за чего не видно было сетку.
Устройство сброшено, значит сбросились все рендерстейты. Но все равно некоторые вопросы и непонятки остаются. Хотелось бы полноценной статьи по вопросу сброса/потери |
|||
|
||||
![]()
|
| Вы можете найти полезным что... | |
|
|
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |