Форум: "WinAPI";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];
ВнизПочему не работает (работает по разному) Sleep Найти похожие ветки
← →
Psibug (2003-04-01 10:07) [0]На одних компах моя прога работает быстрее,
а на других - медленнее. Эта процедура делает (пытается делать) цикл программы стабильным в смысле скорости при помощи вызова 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 глючить будет и по этому поводу.
← →
Cobalt (2003-04-01 13:24) [1]Поясни, зачем ты делаешь Sleep?
Только подробно, с обоснованием.
З.Ы. приоритет процесса не изменял?
З.З.Ы Внедряешься в чужое АП?
← →
MrAngel (2003-04-01 15:35) [2]Видишь ли какая ерунда - комманда sleep указывает микропроцессору какое время он может необрабатывать процесс (или поток)откуда sleep вызван.
По моему на уровне системы не правильно пределяется это время - вывод используй другое.
А вообще я не пойму какая разница на сколько бысрее выполняется твоя программа.
Слушай вот ещё. Может быть что проблема вовсе не в Sleep. а в других строках которые замедляют сам процесс выполнения в зависимости от мощности компьютера.
← →
Psibug (2003-04-01 15:39) [3]>Cobalt
Зачем я делаю Sleep, чтобы на всех компах были одинаковые FPS, чтобы скорость анимации чуваков зависела только в настройках модели, а не от скорости CPU. Ато будет летать программа как "спектрумный" Saboteur - нажмёшь вправо, а чувак пролетел 999 км и упал в пропость. В чужую прогу не влазию (даже в свою:). Приоритет по умолчанию.
← →
i-C3H7OH (2003-04-01 18:43) [4]
> Psibug © (01.04.03 15:39)
сделай лучше так
введи независимое время и чтоб положения обьектов при генерации кадра вычислялись на основании именно этого времени. тогда скорость игры не будет зависеть от FPS, скромный пенек будет выжимать 20 фпс, а к-н П4 -скажем 300 фпс и все будет ок
← →
Psibug (2003-04-01 18:58) [5]Нужно, чтобы цикл программы работал именно 50 раз в секунду.
Я явно это указывю (SleepInterval=24, это типа константа такая).
Каждый раз в момент срабатывания цикла будет генерироваться траффик. А в игре типа Unreal 2D такой трафик должен всеми генериться в одинаковом количестве с _одинаковой скоростью_.
Как это самое независимое время сделать?
← →
Intell (2003-04-01 19:33) [6]Т.е. не зависимо от системы?
← →
Shaman_Naydak (2003-04-01 19:57) [7]Самое примитивное..
От таймера.. ставь, чтобы таймер срабатывал, скажем, через 20 мсек.. ну и в нем выполняй свой Iterate..
← →
Psibug (2003-04-01 21:46) [8]>Shaman_*
<CAUTION! NO VCL ALLOWED!>
>Intell
Да. Иначе на одной системе будет текущий номер итерации 243435, а на другой 243112 и дыижок на разных компах будет находиться в разных состояниях.
← →
Psibug (2003-04-02 13:42) [9]Так что - ниужели никто не знает?
← →
i-C3H7OH (2003-04-02 14:16) [10]
> Psibug © (01.04.03 21:46)
<CAUTION! NO VCL ALLOWED!>
используй АПИ-таймер (SetTimer, KillTimer) или мультемедийный из MMSystem.pas
← →
Psibug (2003-04-03 10:05) [11]Спасибо. На моём компе уже работает. Скоро на чужом проверю.
← →
Psibug (2003-04-04 09:55) [12]Не подходит таймер. Рывками всё.
← →
Intell (2003-04-04 10:09) [13]Есть компонент с изменяющимся приоритетом. Если нужен сообщи:
sergein@nojabrsk.ru
У меня тоже были рывки, поставил его и всё стало прекрастно работать.
← →
i-C3H7OH (2003-04-04 14:28) [14]>Psibug © (04.04.03 09:55)
ты графику по таймеру выводишь? ты не прав.
модель, твоей игры пусть идет по таймеру, а графика пусть обрабатывается в отдельном потоке
← →
nikus (2003-04-05 05:14) [15]Всё вы мудрите что-то и изобретаете велосипед.
И потоки дополнительные городить да ещё им приоритеты высокие присваивать - весьма не эффективно и совсем не нужно для такой задачи.
Обычная практика такая: есть переменная - счётчик времени, есть цикл, в котором отрисовывается графика в зависимости от этого счётчика. Сразу же после отрисовки сцены процесс повторяется без всяких задержек. То есть:
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;
← →
Psibug (2003-04-05 16:11) [16]Всё это здорово, но надо же и другим прогам время дать, да и оконной процедуре, ато винды решат, что моя прога повисла.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.013 c