Проблема потерянных устройств

В прошлом уроке мы научились с вами создавать полноэкранные приложения 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 и все будет в порядке...



Опубликовал admin
28 Окт, Четверг 2004г.



Программирование для чайников.