![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DirectX перерисовка сцены [Delphi, Windows]
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;
Сплошной плюс...