Модераторы: Rickert

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FPS и игровой цикл, в Delphi 
:(
    Опции темы
DragonFire
Дата 20.4.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: 5
Всего: 9



Помогите разобратся в коде, позволяющем определить FPS окна и в цикле - сколько раз этот цикл проходит? Это и есть FPS? И как это работает... Хотя бы коментарие не моглы бы на русском расставить плиз.. Сразу скажу, что понимаю тока обработку сообщений и описание класа для окна smile
Код

program PWindowApi;

uses
  Windows,
  Messages;

const
  FPS_TIMER = 1; 
  FPS_INTERVAL = 1000;

var
  Window:HWND; 
  HDC:HDC;     
  HRC:HGLRC;   
  FPSCount : Integer = 1;           
  ElapsedTime : Integer;            
  keys : Array[0..255] of Boolean;  


function WndProc(hWnd: HWND; Msg: UINT;  wParam: WPARAM;  lParam: LPARAM): LRESULT; stdcall;
begin
  case (Msg) of
    WM_CLOSE:
      begin
        PostQuitMessage(0);
        Result := 0
      end;
    WM_KEYDOWN:      
      begin
        keys[wParam] := True;
        Result := 0;
      end;
    WM_KEYUP:         
      begin
        keys[wParam] := False;
        Result := 0;
      end;
   WM_TIMER :                     
      begin
        if wParam = FPS_TIMER then
        begin
          FPSCount :=Round(FPSCount * 1000/FPS_INTERVAL);   
          SetWindowText(h_Wnd, PChar(WND_TITLE + '   [' + intToStr(FPSCount) + ' FPS]'));
          FPSCount := 0;
          Result := 0;
        end;
      end;
    else
      Result := DefWindowProc(hWnd, Msg, wParam, lParam);    
  end;
end;


procedure glKillWnd(Fullscreen : Boolean);
begin
  DestroyWindow(h_Wnd);
  UnRegisterClass('OpenGL', hInstance);
end;


function glCreateWnd(Width, Height : Integer; Fullscreen : Boolean; PixelDepth : Integer) : Boolean;
var
  wndClass : TWndClass;       
  dwStyle : DWORD;              
  dwExStyle : DWORD;           
  dmScreenSettings : DEVMODE;   
  h_Instance : HINST;          
begin
  h_Instance := GetModuleHandle(nil);      
  ZeroMemory(@wndClass, SizeOf(wndClass));  

  with wndClass do                    
  begin
    style         := CS_HREDRAW or    
                     CS_VREDRAW or    
                     CS_OWNDC;        
    lpfnWndProc   := @WndProc;        
    hInstance     := h_Instance;
    hCursor       := LoadCursor(0, IDC_ARROW);
    lpszClassName := 'OpenGL';
  end;

    dwStyle := WS_OVERLAPPEDWINDOW or     
               WS_CLIPCHILDREN or         
               WS_CLIPSIBLINGS;           
    dwExStyle := WS_EX_APPWINDOW or       
                 WS_EX_WINDOWEDGE;        


  h_Wnd := CreateWindowEx(dwExStyle, 'OpenGL',WND_TITLE,dwStyle,0, 0, Width, Height,0, h_Instance,nil);          

  SetTimer(h_Wnd, FPS_TIMER, FPS_INTERVAL, nil);

  ShowWindow(h_Wnd, SW_SHOW);
  SetForegroundWindow(h_Wnd);
  SetFocus(h_Wnd);

  Result := True;
end;

function WinMain(hInstance : HINST; hPrevInstance : HINST;
                 lpCmdLine : PChar; nCmdShow : Integer) : Integer; stdcall;
var
  msg : TMsg;
  finished : Boolean;
  DemoStart, LastTime : DWord;
begin
  finished := False;

  if not glCreateWnd(800, 600, FALSE, 32) then
  begin
    Result := 0;
    Exit;
  end;

  DemoStart := GetTickCount();            

  while not finished do
  begin
    if (PeekMessage(msg, 0, 0, 0, PM_REMOVE)) then 
    begin
      if (msg.message = WM_QUIT) then    
        finished := True
      else
      begin                              
    TranslateMessage(msg);
        DispatchMessage(msg);
      end;
    end
    else
    begin
      Inc(FPSCount);                      

      LastTime :=ElapsedTime;
      ElapsedTime :=GetTickCount() - DemoStart;    
      ElapsedTime :=(LastTime + ElapsedTime) DIV 2;

      if (keys[VK_ESCAPE]) then           
        finished := True
      else
        ProcessKeys;                      
    end;
  end;
  glKillWnd(FALSE);
  Result := msg.wParam;
end;


begin
  WinMain( hInstance, hPrevInst, CmdLine, CmdShow );
end.
   


--------------------
PM MAIL ICQ   Вверх
Exekutor
Дата 20.4.2006, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 1.11.2005
Где: Казахстан. Костан ай

Репутация: нет
Всего: 4



Похоже, что здесь тока код обработки сообщений и, собсно, класа окна. 


Код

while not finished do   //АНГЛИЙСКИМ ЖЕ ЯЗЫКОМ НАПИСАНО - ЦИКЛ БЕГАЕТ ПОКА НЕ ПОЛУЧЕНО СООБЩЕНИЕ WM_QUIT ИЛИ keys[VK_ESCAPE
  begin
    if (PeekMessage(msg, 0, 0, 0, PM_REMOVE)) then 
    begin
      [color=red]if (msg.message = WM_QUIT) then    
        finished := True[/color]      else
      begin                              
    TranslateMessage(msg);
        DispatchMessage(msg);
      end;
    end
    else
    begin
      Inc(FPSCount);                      

      LastTime :=ElapsedTime;                                             //ТУТ ТА И ПРОИСХОДИТ РАСЧЕТ FPS
      ElapsedTime :=GetTickCount() - DemoStart;                //ТОКА ЭТИ ФУНКЦИИ ВЫЗЫВАЮТСЯ, А КОД ИХ НЕ ПРИВЕДЕН... 
      ElapsedTime :=(LastTime + ElapsedTime) DIV 2;

      if (keys[VK_ESCAPE]) then           
        finished := True
      else
        ProcessKeys;                      
    end;
  end;


  

Это сообщение отредактировал(а) Exekutor - 20.4.2006, 15:16


--------------------
[color=blue][size=2]En taro addun, ma sol larinas[/size][/color]
PM MAIL   Вверх
DragonFire
Дата 20.4.2006, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: 5
Всего: 9



Это я и сам знаю, а с какой скоростью бегает этот цикл??? Тут же от таймера ничего не зависит. И вообще что такое это ФПС и зачем оно нужно? И как работает? 
 smile  smile  smile  smile  smile  smile  smile  


--------------------
PM MAIL ICQ   Вверх
Exekutor
Дата 21.4.2006, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 1.11.2005
Где: Казахстан. Костан ай

Репутация: нет
Всего: 4



FPS - это кол-во кадров в секунду. В данном случае, сколько раз происходит перерисовка окна в секунду. Скорость цикла зависит от скорости проца. 


--------------------
[color=blue][size=2]En taro addun, ma sol larinas[/size][/color]
PM MAIL   Вверх
DragonFire
Дата 21.4.2006, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: 5
Всего: 9



Ага, понятно, значит цикл бегает сам по себе, а эти ФПС только отслеживает сколько раз он бегает, и не влияен на скорость его бега? 
Тоесть если я уберу вообще строки ФПС из цикла - скорость его от этого не изменится? или этот вызов ФПС тормозит цикл (служит в качестве задержки) ?   

Это сообщение отредактировал(а) DragonFire - 21.4.2006, 08:35


--------------------
PM MAIL ICQ   Вверх
Exekutor
Дата 21.4.2006, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 1.11.2005
Где: Казахстан. Костан ай

Репутация: нет
Всего: 4



ну, конечно, дополнительные вычисления тормозят цикл, но это как побочное явление. FPS - это просто число, характеризующее среднее число вывода кадров в секунду. Ясли ты их уберешь то скорость цикла изменится не значительно.
Сам цикл - это стандартный цикл обработки сообщений, присущий любой программе винды. 

Это сообщение отредактировал(а) Exekutor - 21.4.2006, 09:14


--------------------
[color=blue][size=2]En taro addun, ma sol larinas[/size][/color]
PM MAIL   Вверх
DragonFire
Дата 21.4.2006, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: 5
Всего: 9



Значит ФПС вводят в программу только для проверки быстроты работы?
 


--------------------
PM MAIL ICQ   Вверх
Exekutor
Дата 21.4.2006, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 1.11.2005
Где: Казахстан. Костан ай

Репутация: нет
Всего: 4



Ну, что-то вроде. FPS актуальна в играх и проч. что связано с 3D графикой 


--------------------
[color=blue][size=2]En taro addun, ma sol larinas[/size][/color]
PM MAIL   Вверх
DragonFire
Дата 21.4.2006, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: 5
Всего: 9



А можешь объяснить смысл таймера, констант (для ФПС) и функций ФПС в игровом цикле?  smile  


--------------------
PM MAIL ICQ   Вверх
Exekutor
Дата 21.4.2006, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 1.11.2005
Где: Казахстан. Костан ай

Репутация: нет
Всего: 4



Могу предположить, что FPS_INTERVAL означает число миллисекунд, за период временип которых, подсчитываются кол-во кадров. 

FPS_TIMER - это параметр сообщения WM_TIMER. 

Вот, собственно, и расчет FPS:
Код

FPSCount :=Round(FPSCount * 1000/FPS_INTERVAL);   
SetWindowText(h_Wnd, PChar(WND_TITLE + '   [' + intToStr(FPSCount) + ' FPS]'));
FPSCount := 0;


похоже, что здесь происходит вычисление среднего кол-ва тиков. Секунды.
Код

LastTime :=ElapsedTime;                                             //ТУТ ТА И ПРОИСХОДИТ РАСЧЕТ FPS //эти коменты не верны, я просто плохо посмотрел
ElapsedTime :=GetTickCount() - DemoStart;                //ТОКА ЭТИ ФУНКЦИИ ВЫЗЫВАЮТСЯ, А КОД ИХ НЕ ПРИВЕДЕН... 
ElapsedTime :=(LastTime + ElapsedTime) DIV 2;
 


--------------------
[color=blue][size=2]En taro addun, ma sol larinas[/size][/color]
PM MAIL   Вверх
DragonFire
Дата 21.4.2006, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: 5
Всего: 9



Ну это все общие слова, а кто может конкретно описать механихм работы? 


--------------------
PM MAIL ICQ   Вверх
Rpahut
Дата 21.4.2006, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 9.4.2006

Репутация: 5
Всего: 7



ФПС часто используется для контроля игровых процессов, зависящих от времени.
Например, есть объект, который должен двигаться со скоростью 1м/с. Например, у тебя на компе прога отрисовывает 100 кадров в секунду. Тогда ты можешь в каждом кадре сдвигать объект на 1см и за секунду он переместится ровно на один метр. 
А на другом компе та же прога отрисовывает к примеру 200 кадров - за секунду объект сдвинется не на метр , а на два. Это хреново. Вот чтобы такого небыло, вычисляется время, затрачиваемое на цикл, вычисляется на какое расстояние объект должен переместиться за это время, и объект перемещается.
Применяется такой контроль не только в 3Д, но и везде где приходится что-то анимировать. 
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
DragonFire
Дата 21.4.2006, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: 5
Всего: 9



Вот, это уже яснее...
А теперь можно поконкретнее, как это делается - что зачем вызывается в программе. 


--------------------
PM MAIL ICQ   Вверх
Rpahut
Дата 22.4.2006, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 9.4.2006

Репутация: 5
Всего: 7



DragonFire, это...
у меня на двоих мозга не хватит, так что если ты свой использовать не собираешься, то лучше забей сразу...

SetTimer(h_Wnd, FPS_TIMER, FPS_INTERVAL, nil);
- судя по имени инициализирует таймер

GetTickCount()
- опять же судя по имени возвращает текущее время

все остальные вычисления - 
LastTime :=ElapsedTime;
ElapsedTime :=GetTickCount() - DemoStart;    
ElapsedTime :=(LastTime + ElapsedTime) DIV 2; 
- нужны только для того чтобы получать среднее время прохода цикла

В заголовок только кол-во проходов цикла выводится. Зачем константы и что такое FPSCount нужно спросить у того кто этот код писал... 
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
DragonFire
Дата 22.4.2006, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: 5
Всего: 9



А нельзя сделать просто так: каждый раз при прохождении цикла повышать счетчик, а каждый раз в секунду его выводить на экран и обнулять, вроде тоже самое? 


--------------------
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.