Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.041 c
14-1107197461
pika
2005-01-31 21:51
2005.02.20
медия форматы


8-1099486333
avlan
2004-11-03 15:52
2005.02.20
DVD выводится в отдельной форме (DSPack)


3-1106254535
Некто
2005-01-20 23:55
2005.02.20
Ограничения реализованные в триггерах (чисто теоретически)


4-1105357078
Norny
2005-01-10 14:37
2005.02.20
Изменение обоев Рабочего стола


1-1107472221
Vah
2005-02-04 02:10
2005.02.20
Загрузка кода в память





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский