Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

DirectX перерисовка сцены   Найти похожие ветки 

 
String   (2005-06-08 04:20) [0]

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


 
XProger ©   (2005-06-08 04:22) [1]

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

while not Quit do
begin
Update;
Draw;
end;

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


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

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


 
XProger ©   (2005-06-08 06:06) [3]


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 - кол-во обновлений в секунду :)


 
Xeno ©   (2005-06-08 06:15) [4]

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


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

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

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


 
cyborg ©   (2005-06-08 09:56) [6]


> [5] String   (08.06.05 09:14)

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


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

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


 
Zer0 ©   (2005-06-08 10:15) [8]

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

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

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

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

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


 
cyborg ©   (2005-06-08 10:15) [9]


> [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)


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

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%. Но для игры это нормально.


 
XProger ©   (2005-06-08 16:36) [11]

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


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

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

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


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


> [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.


 
String   (2005-06-09 03:17) [14]

Есть одна проблема с таким видом циклов - вывод модальных диалоговых окон в которых используется собственный цикл обработки сообщений. При этом главное окно перестает перерисовываться. Как вы эту проблему обходите?


 
XProger ©   (2005-06-09 03:24) [15]

Нет такой проблемы! Цикд один единственный...


 
String   (2005-06-09 03:35) [16]

а модальное окно как вывести?


 
XProger ©   (2005-06-09 03:43) [17]

String, для начала создай его... а далее абсолютно тоже самое что и с главным окном-родителем


 
String   (2005-06-09 03:52) [18]

окно то я создал, только цикл обработки сообщений родительского окна останавливается и оно не перерисовывается. Само модальное окно конечно же при этом работает нормально


 
XProger ©   (2005-06-09 05:04) [19]

http://timeforkill.mirg.ru/files/other/XChat_src.rar
Посмотри как я такие вещи вытворял :)


 
String   (2005-06-09 05:41) [20]

>XProger ©
ничего нового я там не нашел
а где модальное окно и как этот пример соотносится с темой?


 
XProger ©   (2005-06-09 07:13) [21]

MDI структура по-твоему не является модальной?


 
String   (2005-06-09 08:53) [22]

нет, в MDI я могу переключаться с окна на окно


 
Sphinx ©   (2005-06-09 10:01) [23]

А из модального окна, на худой конец отослать SendMessage(ParentHandle, WM_PAINT, 0, 0) что мешает ???


 
String   (2005-06-09 11:05) [24]

>Sphinx ©
см. выше - то, что цикл обработки сообщений родительского окна останавливается


 
Sphinx ©   (2005-06-09 11:09) [25]

SendMessage - посылает сообщение и ждет пока оно не будет отработано, если цикл действительно останавливается, сочувствую - программа зависнет :) а если не зависнет - то ищи у себя ошибку...


 
keal   (2005-06-09 11:14) [26]

cyborg ©
прога не будет сильно зависить от производительности и загрузки системы.


 
cyborg ©   (2005-06-09 19:17) [27]


> [26] keal   (09.06.05 11:14)

Не понял смысл написанного.


 
keal   (2005-06-15 14:37) [28]

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


 
cyborg ©   (2005-06-15 14:45) [29]


> [28] keal   (15.06.05 14:37)

Делать нужно не на таймерах! Забудь слово таймер.


 
keal   (2005-06-15 14:50) [30]

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


 
cyborg ©   (2005-06-15 15:12) [31]


> [30] keal   (15.06.05 14:50)
> а что кто думает про этот таймер

А ты как бы не понял?


 
keal   (2005-06-15 15:19) [32]

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

но в vcl прогах без таймера не обойтись. и сравниваю его не мертвым циклом, я с другими таймерами.


 
XProger ©   (2005-06-15 18:55) [33]

keal, ты понимаешь что мм таймер - отдельный поток, но ты видимо не до конца осознаёшь всех "прелестей" необъяснимого (непредсказуемого) происхождения которые он тебе готовит...



Страницы: 1 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.026 c
2-1129124296
msguns
2005-10-12 17:38
2005.11.06
Барабашка в TADOCommand


6-1122299778
maxwellz
2005-07-25 17:56
2005.11.06
перехват TCP/IP пакетов


1-1129052350
SergProger
2005-10-11 21:39
2005.11.06
Типы файлов. Иконка файла.


3-1127564247
erika
2005-09-24 16:17
2005.11.06
формирование запроса


4-1125582840
Пантелеев Иван
2005-09-01 17:54
2005.11.06
Focus