Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DirectX перерисовка сцены [Delphi, Windows]


Страницы:   1 2

String ©   (2005-06-08 04:20:00) 

Приветствую мастера! Поделитесь опытом по какому событию лучше расчитывать/перерисовывать сцену: по таймеру (onTimer) или по бездействию программы (onIdle)? какие плюсы/минусы?


cyborg   (2005-06-08 21:38:00) [21]


> [12] keal   (08.06.05 17:24)



PROGRAM SAPOG_BANANA;

Var
 тумба-юмба : переменная;
 угадай_с_трёх_раз : переменная;
BEGIN

 while not Quit do
 begin

  while PeekMessage(@Msg,0,0,0,PM_REMOVE) do
  if (WM_QUIT = Msg.message) then Quit:=True else
   begin
     TranslateMessage(Msg);
     DispatchMessage(Msg);
   end;

   Update;
   Draw;

 end;

END.


keal   (2005-06-08 17:24:00) [22]

XProger ©я смотрел, только где функцию надо вызывать первый раз?

Никто не пробовал мультимедийный таймер?


XProger   (2005-06-08 16:36:00) [23]

Я чёт не понял... вы мой код кто-нибудь смотрел? ;)


Sapersky   (2005-06-08 11:25:00) [24]

OnIdle с Done := False работает очень даже хорошо. Так же как и цикл WinAPI:

While (not bQuit) do
 If PeekMessage(msg, handle, 0, 0, PM_REMOVE) then begin
   TranslateMessage(msg);
   DispatchMessage(msg);
 end else
   If (bActive) then Draw;

Разумеется, процессор в обоих случаях грузится на 100%. Но для игры это нормально.


cyborg   (2005-06-08 10:15:00) [25]


> [7] String   (08.06.05 10:05)

Если ты следишь за ходом обсуждения, то объяснять тут ничего не нужно, тебе уже всё рассказали.


> [1] XProger ©   (08.06.05 04:22)
> [2] String   (08.06.05 05:17)
> [4] Xeno ©   (08.06.05 06:15)


Zer0   (2005-06-08 10:15:00) [26]

ВСЕ приложения в которых нужна настоящая независимость от скорости процессора ДОЛЖНЫ использовать аппаратныеТАЙМЕРЫ. то что обзывается в маздаине таймером - это уже программная оболочка тех самых аппаратных средств.

таймеры аппаратные - работают независимо от процессора или имеют коэффициенты пересчета компенисирующие изменения (как от процессора к процессору, так и в случае различных оверклокингов) тактовой частоты.

практически все игры (как интерактивные приложения) должны использовать таймеры в том или ином виде:
* для формирования задержек на опрпеделенное время (в случае dynamic LOD - установку больших значений детализации), чтобы поддерживать постоянный fps.
*для опеределения dt - кванта игрвого времени. при помощи этой величины и происходит в основном расчет всех внутри-игровых процессов.

onIdle помойму имеет ничего общего с правильно написанными real-time(работающими реальном времени) играми, и использоваться должен для совсем других нужд.

кстати как именно аффтар сабирается юзать этот самый onIdle?


String   (2005-06-08 10:05:00) [27]

>[6] cyborg ©
не пиши таких заявлений не объясняя :)


cyborg   (2005-06-08 09:56:00) [28]


> [5] String   (08.06.05 09:14)

:) не пиши больше таких заявлений


String   (2005-06-08 09:14:00) [29]

вопрос не в том как этим пользоваться, а что лучше.

>Xeno ©
твой цикл так вообще только с таймером использовать можно


Xeno   (2005-06-08 06:15:00) [30]

>String
...
 while GetMessage(Msg, 0, 0, 0) do
 begin
   TranslateMessage(Msg);
   DispatchMessage(Msg);
 end;
...
Изучай WinAPI...


XProger   (2005-06-08 06:06:00) [31]


function GetTimer: integer;
var
T, F : LARGE_INTEGER;
begin
QueryPerformanceFrequency(int64(F));
QueryPerformanceCounter(int64(T));
Result := trunc(1000 * T.QuadPart/F.QuadPart);
end;
...
while not Engine_isQuit do
begin
// Обработка WM_ сообщений
// ...

Time       := GetTimer;
Time_Delta := Time - Time_Old;

flag := false;
for i := 1 to Time_Delta div (1000 div Engine_GetUPS) do
 begin
 Engine_Update; //Обновление
 flag := true;
 end;

if flag = true then
 Time_Old := Time - (Time_Delta mod (1000 div Engine_GetUPS));
Engine_Draw;
end


Engine_GetUPS - кол-во обновлений в секунду :)


String   (2005-06-08 05:17:00) [32]

да, но хотелось бы еще системные сообщения не пропускать


XProger   (2005-06-08 04:22:00) [33]

"мёртвым" циклом!

while not Quit do
begin
Update;
Draw;
end;

Сплошной плюс...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо