![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему не работает (работает по разному) Sleep [D6, WinXP]
Psibug © (2003-04-01 10:07:00)На одних компах моя прога работает быстрее,
а на других - медленнее. Эта процедура делает (пытается делать) цикл программы стабильным в смысле скорости при помощи вызова Sleep.
Вот код:
.
procedure startprogram2(const SleepInterval:cardinal);
var msg:TagMSG;
//bcontinue:boolean;
begin
if bisprogramstarted then exit;
ZeroMemory(@msg,sizeof(msg));
peekmessage(msg,hwnd,0,0,PM_REMOVE);
bPrimaryLoopContinue:=true;
try
bisprogramstarted:=true;
while bPrimaryLoopContinue{msg.message <> WM_QUIT} do
if PeekMessage(msg,hwnd,0,0,PM_REMOVE) then
begin
if msg.message= WM_QUIT then break;
//TranslateMessage(Msg);
DispatchMessage(msg);
biswndactive:=(GetActiveWindow()=hwnd);
end
else
begin
if GetAsyncKeyState(VK_F10)<0 then
break
else
begin
if Assigned(PIterate) then PIterate(bPrimaryLoopContinue);
//Вот вызов Sleep
if bPrimaryLoopContinue then Sleep(SleepInterval){continue} else break;
end;
end;
finally
freesysres;
bisprogramstarted:=false;
// ExitProcess(0); {PostQuitMessage(0);}
end;
end;
Срочно помогите, Мастера! А то Unreal Flat Project глючить будет и по этому поводу.
Psibug (2003-04-05 16:11:00) [1]Всё это здорово, но надо же и другим прогам время дать, да и оконной процедуре, ато винды решат, что моя прога повисла.
nikus (2003-04-05 05:14:00) [2]Всё вы мудрите что-то и изобретаете велосипед.
И потоки дополнительные городить да ещё им приоритеты высокие присваивать - весьма не эффективно и совсем не нужно для такой задачи.
Обычная практика такая: есть переменная - счётчик времени, есть цикл, в котором отрисовывается графика в зависимости от этого счётчика. Сразу же после отрисовки сцены процесс повторяется без всяких задержек. То есть:
StartTime := GetTickCount;
LastTime := 0;
while not finished do begin
ProcessKeys; {процедурка обработки нажатия клавиш}
LastTime := GetTickCount - StartTime;
StartTime := GetTickCount;
{в переменной LastTime имеем число мс, прошедших при отрисовке предыдущего кадра}
Draw; {рисуем что хотели с учётом LastTime. Все XYZ передвижения объекта должны быть пропорциональны прошедешему времени, => если объект должен нарастить координату X втечении секунды на 50, то ты должен смещать объект каждый кадр на(LastTime/1000)*50 и всё!}
end;
i-C3H7OH (2003-04-04 14:28:00) [3]>Psibug © (04.04.03 09:55)
ты графику по таймеру выводишь? ты не прав.
модель, твоей игры пусть идет по таймеру, а графика пусть обрабатывается в отдельном потоке
Intell (2003-04-04 10:09:00) [4]Есть компонент с изменяющимся приоритетом. Если нужен сообщи:
sergein@nojabrsk.ru
У меня тоже были рывки, поставил его и всё стало прекрастно работать.
Psibug (2003-04-04 09:55:00) [5]Не подходит таймер. Рывками всё.
Psibug (2003-04-03 10:05:00) [6]Спасибо. На моём компе уже работает. Скоро на чужом проверю.
i-C3H7OH (2003-04-02 14:16:00) [7]
> Psibug © (01.04.03 21:46)
<CAUTION! NO VCL ALLOWED!>
используй АПИ-таймер (SetTimer, KillTimer) или мультемедийный из MMSystem.pas
Psibug (2003-04-02 13:42:00) [8]Так что - ниужели никто не знает?
Psibug (2003-04-01 21:46:00) [9]>Shaman_*
<CAUTION! NO VCL ALLOWED!>
>Intell
Да. Иначе на одной системе будет текущий номер итерации 243435, а на другой 243112 и дыижок на разных компах будет находиться в разных состояниях.
Shaman_Naydak (2003-04-01 19:57:00) [10]Самое примитивное..
От таймера.. ставь, чтобы таймер срабатывал, скажем, через 20 мсек.. ну и в нем выполняй свой Iterate..
Intell (2003-04-01 19:33:00) [11]Т.е. не зависимо от системы?
Psibug (2003-04-01 18:58:00) [12]Нужно, чтобы цикл программы работал именно 50 раз в секунду.
Я явно это указывю (SleepInterval=24, это типа константа такая).
Каждый раз в момент срабатывания цикла будет генерироваться траффик. А в игре типа Unreal 2D такой трафик должен всеми генериться в одинаковом количестве с _одинаковой скоростью_.
Как это самое независимое время сделать?
i-C3H7OH (2003-04-01 18:43:00) [13]
> Psibug © (01.04.03 15:39)
сделай лучше так
введи независимое время и чтоб положения обьектов при генерации кадра вычислялись на основании именно этого времени. тогда скорость игры не будет зависеть от FPS, скромный пенек будет выжимать 20 фпс, а к-н П4 -скажем 300 фпс и все будет ок
Psibug (2003-04-01 15:39:00) [14]>Cobalt
Зачем я делаю Sleep, чтобы на всех компах были одинаковые FPS, чтобы скорость анимации чуваков зависела только в настройках модели, а не от скорости CPU. Ато будет летать программа как "спектрумный" Saboteur - нажмёшь вправо, а чувак пролетел 999 км и упал в пропость. В чужую прогу не влазию (даже в свою:). Приоритет по умолчанию.
MrAngel (2003-04-01 15:35:00) [15]Видишь ли какая ерунда - комманда sleep указывает микропроцессору какое время он может необрабатывать процесс (или поток)откуда sleep вызван.
По моему на уровне системы не правильно пределяется это время - вывод используй другое.
А вообще я не пойму какая разница на сколько бысрее выполняется твоя программа.
Слушай вот ещё. Может быть что проблема вовсе не в Sleep. а в других строках которые замедляют сам процесс выполнения в зависимости от мощности компьютера.
Cobalt (2003-04-01 13:24:00) [16]Поясни, зачем ты делаешь Sleep?
Только подробно, с обоснованием.
З.Ы. приоритет процесса не изменял?
З.З.Ы Внедряешься в чужое АП?