Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2010, 04:01   #1
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию Как реанимировать D3DX8 после операции свернуть/развернуть

Имеется игрушка, в принципе до завершения ее еще далеко но встал уже такой вопрос. В полноэкранном режиме после операции свернуть развернуть больше ни чего не выводится. показывает черный экран. Использую direct3d. На настоящий момент с проблемой справился следующим образом: убиваю все объекты directx: Sprite, texture, Device, D3D; и создаю их заново. Что то мне кажется что должен быть более гуманный метод.
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 27.01.2010, 04:44   #2
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Вообще, таким вопросом задавался, но на этом всё и ограничивалось. Но судя по тому, как долго сворачиваются/разворачиваются игры в полноэкранном режиме, там всё связанное с графикой, звуком, сетью, видео уничтожается при сворачивании и заново создаётся при разворачивании.

Ведь нужно как минимум создать/уничтожить корневые объекты (главный объект и девайс). Директ работает по принципу сервера, тогда логично, что созданные в другом сеансе объекты не будут работать.

Последний раз редактировалось Carbon; 27.01.2010 в 04:48.
Carbon вне форума Ответить с цитированием
Старый 27.01.2010, 05:01   #3
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

ну да при создании текстуры она привязывается к устройству

D3DXCreateTextureFromFileEx( g_device, pchar(Path), 0, 0,
D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT,
D3DX_FILTER_NONE, D3DX_FILTER_NONE,
0, nil, nil, g_texture[free_slot_num] );

так что при уничтожении устройства я так понял уничтожаются и текстуры.

Может все таки есть способы что бы восстановить работоспособность без уничтожения объектов. Ведь если взять крупные игры я сомниваюсь что там все ресурсы загружаются вновь.
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 27.01.2010, 17:41   #4
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от Swarog Посмотреть сообщение
Может все таки есть способы что бы восстановить работоспособность без уничтожения объектов. Ведь если взять крупные игры я сомниваюсь что там все ресурсы загружаются вновь.
Вряд ли. При сворачивании происходит потеря устройства, т.е. указатели на объекты становятся недействительными.
Я и не говорил, что в играх все ресурсы вновь загружаются. К примеру карты, скрипты, тексты шейдеров, ландшафтные сетки, расположение объектов и связанные с ними данные и т.д. Ведь при разворачивании ты начинаешь игру с того места, где остановился, а не заново.
Carbon вне форума Ответить с цитированием
Старый 28.01.2010, 22:56   #5
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

Под ресурсами я имел ввиду текстуры.

Кстати у устройства есть функция Reset. Пытаюсь ее вызвать при развернутом экране, она возвращает что все хорошо, но тем не менее на BeginScene() вылетает ошибка в модуле D3DX8.dll
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 28.01.2010, 23:12   #6
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Код:
 // (1) Verify conditions.
 if (not FInitialized) then
  begin
   Result:= False;
   Exit;
  end;

 // (2) Present the scene.
 Res:= Direct3DDevice.Present(nil, nil, 0, nil);

 // (3) Device has been lost?
 if (Res = D3DERR_DEVICELOST) then
  begin
   // notify everyone that we've lost our device
   if (not NotifiedLost) then
    begin
     Notify(msgDeviceLost);
     NotifiedLost:= True;
    end;

   // can the device be restored?
   Res:= Direct3DDevice.TestCooperativeLevel();

   // try to restore the device
   if (Res = D3DERR_DEVICENOTRESET) then
    begin
     Res:= Direct3DDevice.Reset(PresentParams);
     if (Succeeded(Res))and(NotifiedLost) then
      begin
       Notify(msgDeviceRecovered);
       NotifiedLost:= False;
      end;
    end;
  end;

 // (4) Driver error? try resetting...
 if (Res = D3DERR_DRIVERINTERNALERROR) then
  begin
   Res:= Direct3DDevice.Reset(PresentParams);
   // if cannot reset the device - we're done, finalize the device
   if (Failed(Res)) then Finalize();
  end;

 // (5) Verify the result.
 Result:= Succeeded(Res);
Это из асфира, на 2dgames вот такое советуют:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  res: HRESULT;
begin
  res:=pD3DDevice.TestCooperativeLevel;
  if res=D3DERR_DEVICELOST then exit;
  if res=D3DERR_DEVICENOTRESET then
  begin
    //освобождаем ресурсы
    pD3DDevice := nil;
    pD3D := nil;
    //еще нужно все текстуры освободитеь
    pic:=nil;
    //заново инициализирум Direct3D
    D3DXInit(pD3D,pD3DDevice,Handle,800,600,32,false,false);
    //и загружаем все картинки
    LoadTextureFromFile('FileName.tga',pic);
  end;
  //чистим экран
  pD3DDevice.Clear(1, nil, D3DCLEAR_TARGET, D3DCOLOR_XRGB(200,200,200), 1.0, 0);
  //начало сцены
  pD3DDevice.BeginScene();
    Draw(FRect(0,0,1280,1024),0,pic);
  //конец сцены
  pD3DDevice.EndScene();
  pD3DDevice.Present(nil, nil, 0, nil);
end;
пыщь

Последний раз редактировалось JTG; 28.01.2010 в 23:17.
JTG вне форума Ответить с цитированием
Старый 29.01.2010, 01:57   #7
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

сделал так
Код:
  // выводим содержимое кадрового буфера на экран
  hr := g_device.Present( nil, nil, 0, nil );
   if FAILED(hr) then
      if (D3DERR_DEVICELOST = hr) then
       Begin
        hr := g_device.TestCooperativeLevel;
        if (hr = D3DERR_DEVICENOTRESET) then
          begin
           hr := g_device.Reset(d3dpp);
          end;
        if (hr = D3DERR_DRIVERINTERNALERROR) then
         begin
          hr := g_device.Reset(d3dpp);
          if Failed(hr) then
           Begin
            ReleaseDirect3D();  // придеться все убить
            InitDirect3D( window );    // и создать заново
            loading_data();
           End;
         end;
       End;
Ошибка по прежнему вылетает на BeginScene(), reset возвращает 0
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Баг в цикле: программно развернуть - свернуть - восстановить окно chandrasecar Общие вопросы Delphi 23 02.12.2011 16:05
как свернуть и развернуть форму? blackstersl Общие вопросы Delphi 7 25.06.2009 09:20
как развернуть окно? Sergeu Общие вопросы Delphi 2 19.01.2009 17:02
Свернуть, развернуть, восстановить окно chandrasecar Win Api 1 15.10.2008 00:13
Как развернуть ячейки? alibaba Microsoft Office Excel 2 28.11.2007 11:05