Форум: "Игры";
Текущий архив: 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.041 c