Текущий архив: 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.47 MB
Время: 0.046 c