Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.20;
Скачать: CL | DM;

Вниз

Direct3D - Проблема потерянных устройств.   Найти похожие ветки 

 
Zak3D[@Tm] ©   (2004-11-13 14:41) [0]

Здравствуйте мастера, вот какая у меня проблема:
по нажатии alt+tab моя прога иногда не хочет сворачиваться, вместо этого как бы поверх всего, что в данный момент находится на рабочем столе продолжает рисовать... Я думаю всё дело в состоянии активности программы, я делаю так -
WM_ACTIVATE :  begin
case Lo(wParam) of
WA_ACTIVE,WA_CLICKACTIVE : ActiveProgram:=True;  //Установка флага активности программы
                    WA_INACTIVE            : ActiveProgram:=False; //Перешли на другую задачу, окно не активно!
                    end;//case Lo(wParam)
                  End;
Вот... перед отрисовкой очередной сцены проверяю активно ли окно (ActivateProgram=true)
........ ну вроде всё.... где ошибка понять не могу, вот наверно следует ещё участок кода где востановление показать :
function RestoreAll : HRESULT;
begin
 if Assigned(FD3DVB) then
 begin
   FD3DVB._Release;
   FD3DVB := nil;
 end;
 SetVideoMode;
 RESULT := InitPoints;
end;

--------------------------
Заранее очень признателен.


 
VolanD666   (2004-11-14 05:10) [1]

Статья из книги:
В прошлом уроке мы научились с вами создавать полноэкранные приложения D3D8. Но теперь мы столкнулись с одной проблемой (спасибо Tony McMahon - он указал мне на это упущение в моем коде, и благодаря этому появился этот урок) - проблемы потерянных устройств. Когда пользователь нажимает в полноэкранном приложении Alt+Tab и сворачивает свою программу, и после того как он возвращается к своему приложению, его устройство D3D8 оказывается потерянным. Эта проблема достаточно легко решается, так что этот урок будет не большим.

Покопавшись в документации я нашел, как решить данную проблему и теперь предлагаю ее решение вам.

Во первых - в самом начале в функции RenderScreen() мы вставляем несколько строк :

HRESULT hr;
hr=p_d3d_Device->TestCooperativeLevel()))
if(hr==D3DERR_DEVICELOST) return;
if(hr==D3DERR_DEVICENOTRESET) p_d3d_Device->Reset(&d3dpp);

Здесь мы проверяем уровень кооперации нашего приложения, и затем мы имеем два варианта :

-- если у нас устройство оказывается потерянным то мы ничего не можем сделать и выходим из функции (затем мы снова возвращаемся в нее, проверяем уровень кооперации и так далее, пока не получим второй вариант)
-- второй вариант - мы получаем информацию, что наше устройство не "сброшено" (reset), и мы сбрасываем его параметры методом p_d3d_Device->Reset(&d3dp);

Теперь второй шаг - при создании нашего буфера вершин мы использовали флаг D3DPOOL_DEFAULT - этот флаг показывает D3D8, что бы он установил менеджер ресурсов в состояние по умолчанию (как он работает, в данном случае не важно) на важно то, что в данном случае при потере устройства мы теряем данные, и нам, перед вызовом p_d3d_Device->Reset(&d3dp); необходимо их удалить и создавать заново.

Но, опять же покопавшись в документации, я нашел что вместо этого флага можно использовать другой - D3DPOOL_MANAGED - он позволяет D3D8 самому управлять ресурсами, и при потере устройства такие ресурсы не теряются, и нам их пересоздавать не нужно.

В данном виде ваша строка создания буфера вершин должна выглядеть следующим образом :

p_d3d_Device->CreateVertexBuffer (6*sizeof(CUSTOMVERTEX),
   0, D3DFVF_CUSTOMVERTEX,
   D3DPOOL_MANAGED,
   &p_VertexBuffer);

Теперь вы можете безбоязненно нажимать Alt+Tab и все будет в порядке...


 
Zak3D[@Tm] ©   (2004-11-14 10:04) [2]

VolanD666 Пасиба : ) Эту статью я уже читал, и это у меня сделано, вот как я это осуществил :
//Ф-ция отрисовки
var
 hRet : HRESULT;
begin
 //Тестируем доступность устройства вывода
 hRet := FD3DDevice.TestCooperativeLevel;
 if hRet = D3DERR_DEVICELOST then RestoreAll;
 if hRet = D3DERR_DEVICENOTRESET then FD3DDevice.Reset(d3dpp);
//Как мне кажется, ошибка в этой строке (if hRet = D3DERR_DEVICELOST then RestoreAll;) т.к. я использую не return(C/C++), а ф-цию RestoreAll(написанную мной)... Подскажите, есть ли в Паскале аналог Сишного return?


 
fij   (2004-11-14 13:40) [3]

exit;


 
Zak3D[@Tm] ©   (2004-11-14 15:30) [4]

ммммм Обобщю немного вопрос:
Что мне вообще нужно востанавливать при переходе через alt+tab?
Нужно ли пересоздавать главный объект? Буфер вершин? Освобождать объекты связанные с главным объектом?(Device,VertexBuffer...)


 
bobomen_   (2004-11-14 16:19) [5]

иди отсюда дурачок


 
VolanD666   (2004-11-14 16:46) [6]


> bobomen_

Ну, зачем же так? Лучше что-нить умного бы сказал!


 
Zak3D[@Tm] ©   (2004-11-14 21:51) [7]

bobomen_ по моему, это тебя пора убрать с этого сайта...



Страницы: 1 вся ветка

Текущий архив: 2005.02.20;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.055 c
6-1102415874
Prankster.
2004-12-07 13:37
2005.02.20
Получение файла из сети


1-1106647048
Muh
2005-01-25 12:57
2005.02.20
Помогите с инсталятором


14-1106747786
}|{yk
2005-01-26 16:56
2005.02.20
Требуется программист!


8-1098811987
Artemka
2004-10-26 21:33
2005.02.20
Проблема с выводом изображения на канву формы...


3-1106129038
denis24
2005-01-19 13:03
2005.02.20
DbgridEH ..footer