Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему не работает (работает по разному) 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?
Только подробно, с обоснованием.
З.Ы. приоритет процесса не изменял?
З.З.Ы Внедряешься в чужое АП?


Наверх

Титульная страница Поиск, карта сайта Написать письмо