Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.045 c
2-1129100144
Smolin
2005-10-12 10:55
2005.11.06
Вычитание дат


14-1129355243
Машка
2005-10-15 09:47
2005.11.06
Как стать мастерицей Delphi?


14-1129447109
Kerk
2005-10-16 11:18
2005.11.06
С днем рожденья! 16 октября


4-1125644715
Bobby
2005-09-02 11:05
2005.11.06
TRegIniFile.Read(Write)Integer


1-1129273540
ой
2005-10-14 11:05
2005.11.06
TGroupBox + скроллинг





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский