Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.30;
Скачать: CL | DM;

Вниз

Загрузка процессора   Найти похожие ветки 

 
DillerXX ©   (2007-01-10 21:24) [0]

Пишу тут скриптсейвер. Если делать основной цикл без слипов, то картинка движется правно, всё хорошо. Но, загрузка проца 100%, это как-то не этично, да и вообще, делают же люди по-нормальному. В любых играх, например ElastoMania, в меню загрузка проца маленькая, хотя шарики там бегают. Если поставить хоть Sleep(1), загрузка уменьшается до 0%, но появляются дёрганья, слишком мало управления получает поток :( Как этого можно избежать? Изменение приоритета нити(потока) процесса никак не помогает...


 
grisme ©   (2007-01-10 21:31) [1]

В Quake 3, например, загрузка 100%. ID Software - это не нормальные люди? :P


 
@!!ex ©   (2007-01-10 21:40) [2]

варианты решения:
1) Фиксированный ФПС(VertSync отлично это дело правит)
2) Меньше приоритет.(Но если у тебя RAR  в фоне пакутеся, не поиграеш)


 
@!!ex ©   (2007-01-10 21:48) [3]

P.S.
Как вариант, если у тебя не сликшом динамичная сцена, то отрисовывать ее, только если что-то изменилось.

P.P.S.
Игрока обычно не особо напрягает, что гейма скушала 100% проца.
Главное что если окно в фоне, оно жрать не должно.

P.P.P.S
Изменения приоритета никак не сказывается, потому что нету других процессов жрущих проц, поэтому весь проц опять же отадется твоему низкоприоритетному потоку.


 
@!!ex ©   (2007-01-10 21:48) [4]

*процессу.


 
@!!ex ©   (2007-01-10 21:48) [5]

*процессу.


 
DillerXX ©   (2007-01-10 21:50) [6]


> VertSync отлично это дело правит

Поподробнее? Ничего не нашёл по этой строчке


 
DillerXX ©   (2007-01-10 21:51) [7]


> Пишу тут скриптсейвер

Просто не хочется чтобы все процессы выполняющиеся в фоне сильно тормозились...


 
@!!ex ©   (2007-01-10 22:04) [8]

VSync
Вертикальная синхронизация
Синхронизирует вывод картинки с частотой монитора.

Если не хочешь, чтобы тормозились фоновые порцессы - уменьши приоритет.


 
ors_archangel ©   (2007-01-10 22:06) [9]


> > Пишу тут скриптсейвер

Скрипт, извини, что?
Если ScreenSaver - то он ни в коем случае не должен жрать проц - я например, такие SS сразу удаляю: прикинь: пакуешь что-нить в WinRAR, отошёл попить кофе, запускается твой SS - всё, больше ничего не пакуешь - прорисовываешь картинки :( Соверменные vcrads позволяют делать low-cpu-load прораммы - это уж точно - нахрена же нам тогда шина AGP (правда теперь PEG, ну да ладно) и отдельная PCI-плата со своей памятью на борту! Обязательно что-нибудь придумай


 
ors_archangel ©   (2007-01-10 22:08) [10]


> В Quake 3, например, загрузка 100%. ID Software - это не
> нормальные люди? :P

Не слышал про такой скринсейвер - Quake 3, может http дашь?


 
DillerXX ©   (2007-01-10 22:10) [11]


> ors_archangel ©

Знаем знаем, именно поэтому и озаботился загрузкой


 
ors_archangel ©   (2007-01-10 22:31) [12]


> Знаем знаем, именно поэтому и озаботился загрузкой

Делай фиксированный fps - и лучше чтобы настраивался :)
Рисуешь frame (кадр по-русски), при этом засекаешь, сколько времени на него ушло, в простейшем случае через GetTickCount (это WinAPI, в курсе, да?), дальше смотришь, какой Sleep нужно делать между кадрами, чтобы fps был такой-то. Можно ещё поэксперементировать с приоритетом: fps очень крутой получается - опускаем приоритет, подождём немного, проверяем, дальше корректируем время на frame через Sleep. Синхронизироваться с обновлением монитора вроде можно через OpenGl/DirectX, но имхо это слишком часто и ненастраивается


 
@!!ex ©   (2007-01-10 22:39) [13]


> и ненастраивается

Настраваеться вроде, хотя я не помню, никогда не интересовался этим.
Sleep - не вариант. Слишком хреново он дейстует.


 
DillerXX ©   (2007-01-10 22:55) [14]

На счёт VSync - ничего мне не дало, нашёл в модулях Studio упоминание, но никакого положительного эффекта не дало. Можно пример с его использованием? Если синхронизация в данном случае единственный выход


 
@!!ex ©   (2007-01-10 23:00) [15]

Ставь приоритет ниже среднего и забей.


 
@!!ex ©   (2007-01-10 23:00) [16]

Ставь приоритет ниже среднего и забей.


 
DillerXX ©   (2007-01-10 23:04) [17]

Ок, в таком случае для 100% равномерного движения поставлю GetTickCount в while цикл без слипа.


 
DillerXX ©   (2007-01-11 00:06) [18]

const myDelay = 1;
....
while (GetTickCount() - lastTime < myDelay) { }
lastTime = GetTickCount();

Это тормозит точно так же как Sleep(1), никаких отличий во времени, так же дёргается картинка.. Блин, что же делать?


 
@!!ex ©   (2007-01-11 00:09) [19]

Там может у тебя просто картинка хреново рисутеся? :))
Я в своем двигле спокойно вставляю слип и все замечательно... ну появляется заметная дискретность, но и не более того.


 
DillerXX ©   (2007-01-11 00:41) [20]

Нашёл способ как регулировать фпсы вручную.
При Sleep(1) фпс = 65 (VSync"a нету, и видимо в обновление моника не попадаем, видна дискретность).

Без слипа фпс = 1071. Это наверное многовато (улыбка), и значение будет сильно колбасить на разных компутерах.

С применением следующего кода:
const myDelay = 15000000;
....
QueryPerformanceCounter(&cur_time);
while (cur_time.QuadPart - last_time.QuadPart < myDelay)
QueryPerformanceCounter(&cur_time);
last_time = cur_time;

С учётом понижения приоритета нити до THREAD_BASE_PRIORITY_IDLE стабильно даёт фпс 200. Видимо оптимальная частота обновления, правда проц грузит на 100%. Но с учётом PRIORITY_IDLE, это по идее не должно мешать другим процессам. Надо всё же будет раскопать VSync, и поставить Sleep(1) с 0% уровнем загрузки..  может всё же есть у кого кода для OpenGL, подкиньте пожалуйста. Или другая идея.


 
ors_archangel ©   (2007-01-11 01:45) [21]


> while (cur_time.QuadPart - last_time.QuadPart < myDelay)

С учётом PRIORITY_IDLE в этом цикле нет смысла, в нём вообще нет смысла, потому что такой "холостой" цикл загружает систему так же как и прорисовка или даже больше, лучше тогда уж непрерывно рисовать - "дискретности" не будет. Sleep замораживает поток, полностью отбирая у него процессорное время, а любой цикл, в котором нет Sleep, GetMessage, WaitForXXX или подобных функций (+ некоторые другие) будет обязательно 100% грузить проц, причём не важно что за ерунда внутри этого цикла, твоё:

while (cur_time.QuadPart - last_time.QuadPart < myDelay)
  QueryPerformanceCounter(cur_time);

или

 while (x < 10000000000) x++;

Вот такие мои замечания, имхо, просто цикл-ожидание - бессмысленен:
Sleep(1000) = 0% CPU Load
t=GetTickCount(); while (GetTickCount()-t < 1000); = 100% CPU Load
- но оба кода ничерта не делают


 
rts111 ©   (2007-01-11 02:05) [22]

Вроде так надо:

...
QueryPerformanceCounter(&cur_time);
while (cur_time.QuadPart - last_time.QuadPart < myDelay) do
begin
Sleep(1); //Sleep(0); ?
QueryPerformanceCounter(&cur_time);
end;
last_time = cur_time;
...

или я вообще не о том?


 
DillerXX ©   (2007-01-11 13:12) [23]


> ors_archangel

Тоесть ты предлагаешь мне вообще не пользоваться ожиданием, и рисовать картинку со скоростью 1000 кадров в секунду? Но ведь это значение будет очень сильно колбасить для различных компьютеров. Можно ввести конечно коэффициент прошедшего времени, и на него умножать все движения на экране... Но с помощью моего последнего кода мы стабилизируем прорисовку до 200 герц для любых компьютеров, что мне кажется очень удобно. Кстати, GetMessage окажет тот же эффект что и Sleep? Тоесть слишком сильную задержку?


 
Da Stranger ©   (2007-01-11 15:44) [24]

> Можно ввести конечно коэффициент прошедшего времени, и на него умножать все движения на экране... Но с помощью моего последнего кода мы стабилизируем прорисовку до 200 герц для любых компьютеров, что мне кажется очень удобно.

Именно так все и делают, то есть домножают базовую скорость на время между прорисовками. Потому что, если у тебя рисуется в 200 FPS, ещё не значит, что на P3 Celeron будет рисоваться с той же скоростью.


 
DillerXX ©   (2007-01-11 18:02) [25]

Хорошо. Сделаю так.


 
@!!ex ©   (2007-01-11 22:05) [26]


> DillerXX ©   (11.01.07 18:02) [25]

Хм... Так у тебя нету привязки ко времени???
Не ожидал...
Не удивительно что при Слипе кадры дергаются...


 
DillerXX ©   (2007-01-11 22:21) [27]


> @!!ex

Нету привязки. Я только потом про неё подумал, т.к. писать графические программы начал только позавчера. И об элементарных правилах этого дела не знал. Да и сейчас собственно не знаю, но изучаю :) Рабочая модель уже готова. Нужно исправить в ней выявившиеся деффекты, и затем перевести на динамический фпс (с привязкой ко времени естественно).

> Не удивительно что при Слипе кадры дергаются...

А вот это для меня не очевидно, почему не удивительно? Слип позволяет делать лишь 65 фпс, что недостаточно. Дерганий не будет либо при синхронизации с монитором, либо при уменьшении скорости движения. Но последнее неприятно. А первое так вообще даже не знаю, на сколько я понял это cв-во драйверов конкретной видюхи, а значит ненастраиваемо для меня.


 
@!!ex ©   (2007-01-11 22:54) [28]


> Нету привязки. Я только потом про неё подумал, т.к. писать
> графические программы начал только позавчера. И об элементарных
> правилах этого дела не знал. Да и сейчас собственно не знаю,
>  но изучаю :) Рабочая модель уже готова. Нужно исправить
> в ней выявившиеся деффекты, и затем перевести на динамический
> фпс (с привязкой ко времени естественно).

Как привязку ко времени делать - в курсе?


>  вот это для меня не очевидно, почему не удивительно? Слип
> позволяет делать лишь 65 фпс, что недостаточно. Дерганий
> не будет либо при синхронизации с монитором, либо при уменьшении
> скорости движения. Но последнее неприятно. А первое так
> вообще даже не знаю, на сколько я понял это cв-во драйверов
> конкретной видюхи, а значит ненастраиваемо для меня.

Чтож у тебя за задача, что 65 фпс не достаточно? :))
Вспомни любую игру. Как она себя ведет при 30 кадрах в секунду?
Видно дискретность? Нифига.
Что за проекто делаеш? Хоть скин кинь.
Интересно ж.


 
DillerXX ©   (2007-01-11 23:23) [29]


> Как привязку ко времени делать - в курсе?

Да потом уже догадался что надо и как, так что вкурсе. Проблема будет при проверке коллизий, т.к. при большом фпсе фактическое передвижение объектов за квант времени будет очень мало, а значит столкновение может просчитаться ещё раз... Я тебе даже могу ехе"s скинуть с 65 фпс и 300 фпс. Заметна разница будет.
http://dillerator.chat.ru/circles_fps_diff.rar  скачивать либо качалкой либо FireFox"om или Oper"oй, а то IE что-то глючит на это серве. Там будет вестись output.txt файл с фпс за каждую секунду. Если кому интересно можете посмотреть. Потом добавлю разные красивости, расчёт трения-вращения, текстуру с альфа-каналом, фон, может быть звуки ну и так далее.. очки двойных столкновений, бонусный шарик )) или управление мышкой.
Модель пока начальная, погоняйте примерно 2-3 минуты файл с 300 фпс, там 2 шарика в конце сцепятся и будут вальс танцевать... :)) Кстати прикольно, сотая доля начального угла полёта одного шарика в корне поменяет всю дальнейшую судьбу системы. Терия Хаоса прям...


 
DillerXX ©   (2007-01-11 23:29) [30]

Забыл добавить :) Особая гордость - расчёт столкновений делал полностью сам, не пользуясь формулой которая валяется на каждом углу (понять её так и не смог, поэтому расчитал сам). Курс векторной алгебры не прошёл напрасно ;)


 
ors_archangel ©   (2007-01-12 07:32) [31]


> >  вот это для меня не очевидно, почему не удивительно?
> Слип > позволяет делать лишь 65 фпс, что недостаточно. Дерганий
> > не будет либо при синхронизации с монитором, либо при
> уменьшении > скорости движения. Но последнее неприятно.
> А первое так > вообще даже не знаю, на сколько я понял это
> cв-во драйверов > конкретной видюхи, а значит ненастраиваемо
> для меня.
> Чтож у тебя за задача, что 65 фпс не достаточно?

Присоединяюсь - 30 fps всегда хватало с головой


 
Da Stranger ©   (2007-01-12 11:41) [32]

Проверку столкновений, движение и прочую физику можно делать чаще чем текущий FPS. То есть выбираешь минимальный нужный FPS, обычно это 30, можно 60, помню мне как-то нужна была точность в 1000 FPS для расчёта FPS-независимой инерции, а дальше делаешь так (в процедуре прорисовке кадра):

procedure Proceed(DeltaTime: Single);
const
 MIN_DELTA = 0.1; //10 FPS
begin
 while DeltaTime > MIN_DELTA do
 begin
   DoMove(MIN_DELTA);
   DoCollisionCheck(..);
   DoSmthElse(MIN_DELTA);
   DeltaTime := DeltaTime - MIN_DELTA;
 end;

 DoMove(DeltaTime);
 DoCollisionCheck(..);
 DoSmthElse(DeltaTime);
end;


 
DillerXX ©   (2007-01-12 17:11) [33]

Вы посмотрите файлы, невооружённым глазом с двух метров видно что 65 фпс слишком мало.


 
@!!ex ©   (2007-01-12 18:42) [34]

1) Запустил версию с 65 фпс. ИМХо все замечательно. Движение плавное, никаких дерганий не заметил.
варианта три:
а) со зрением проблемы(врядли, в своем проекте вроде даже дергание отдельных пикселей вижу)
б) проблемка в разнице оборудования.
в) автор гонит.

2) Версия с 300 фпс благополучно отрисовывала 1 кадр в секунду(по показаниям Fraps"a).

3) пересечение двух сфер - этож вроде банальность, нафиг курс векторной алгебры? Если расстояние между центрами меньше суммы радиусов - значит коллизия есть, сила тож вродь не сложно считается...

4) То что сферы слепялются судя по тому что я вижу - это баг?
Кстати, через несколько секунд после сцепления они подъехали к краю сцены, большая сфера остановилась, а меньшая начала дергаться между стеной и большей сферой....

5) Это вообще что подразумевается?


 
Vga ©   (2007-01-13 04:03) [35]

> [33] DillerXX ©   (12.01.07 17:11)

circles_fps65 - хорошо работает, плавное движение
circles_fps300 - FPS менее единицы на взгляд...
65FPS - для плавного движения более чем достаточно, ТВ хватает 25FPS. Рывки наверняка из-за нестабильности временных интервалов между кадрами.
А по теме - используй вертикальную синхронизацию. В openGL она вполне управляема. Работает естественно только при двойной или более буферизации.
Сама вертикальная синхронизация у меня сделана так:

   if WGL_EXT_swap_control and (FVSync<>wglGetSwapIntervalEXT)
     then wglSwapIntervalEXT(FVSync);
   SwapBuffers(FDC);

Это в конце отрисовки. FVSync - целочисленная, при 1 вертикальная синхронизация включена, при 0 - выключена.


 
@!!ex ©   (2007-01-13 09:42) [36]

А зафиг ее каждый кадр трогать?
Вроде достаточно один раз установиьт в начале работы приложения.


 
Vga ©   (2007-01-13 11:27) [37]

> [36] @!!ex ©   (13.01.07 09:42)

У меня такие же сомнения... Зачем сделал именно так уже и сам не помню... Вроде какая-то причина была.


 
Piroxyline ©   (2007-01-13 11:53) [38]

Sleep(0) попробуйте еще


 
Rouse_ ©   (2007-01-13 12:02) [39]

я что-то не понял, CIRCLES_fps300.exe дает нагрузку от нуля до двух процентов на проц, CIRCLES_fps65.exe от нуля до единицы. Что за проблему вы обсуждаете?


 
DillerXX ©   (2007-01-13 12:40) [40]


> circles_fps300 - FPS менее единицы на взгляд...


> Версия с 300 фпс благополучно отрисовывала 1 кадр в секунду(по
> показаниям Fraps"a).

Я не понял, тоесть 1 обновление экрана за секунду?! Ужас... Как это вообще может быть...

> Sleep(0) попробуйте еще

Не помогает.

> я что-то не понял, CIRCLES_fps300.exe дает нагрузку от нуля
> до двух процентов на проц

Фигасе, как это как может быть... Там же не слипов, должна быть загрузка 100%. Как у тебя с движением в обоих программах?



Страницы: 1 2 вся ветка

Текущий архив: 2008.03.30;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.036 c
15-1203244125
avptt
2008-02-17 13:28
2008.03.30
подхватил троян


15-1200944466
TwentyThird
2008-01-21 22:41
2008.03.30
Пресловутая борьба с курением


3-1194339022
webpauk
2007-11-06 11:50
2008.03.30
Оптимизация запроса


2-1204633595
Kolan
2008-03-04 15:26
2008.03.30
Как из символя получить код клавиши.


2-1204393736
Alex
2008-03-01 20:48
2008.03.30
Как вывести в Edit переменную Integer?