Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.009 c
1-3010
Xeon
2003-05-22 00:03
2003.06.02
Удаление файла


6-3040
Pokotskiy
2003-03-31 13:37
2003.06.02
Services+Socket?


1-2962
Dracula2000
2003-05-21 10:01
2003.06.02
Главное окно...


1-2898
OldRick
2003-05-22 19:36
2003.06.02
форматирование кода реализации класса


14-3114
dataMaster
2003-05-14 12:03
2003.06.02
TheBAT! - проверка почты





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский