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

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

Загрузка процессора [Windows]


Страницы:   1 2 3

DillerXX ©   (2007-01-10 21:24:00) 

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


@!!ex   (2007-01-11 22:05:00) [21]


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

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


DillerXX   (2007-01-11 18:02:00) [22]

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


Da Stranger   (2007-01-11 15:44:00) [23]

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

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


DillerXX   (2007-01-11 13:12:00) [24]


> ors_archangel

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


rts111   (2007-01-11 02:05:00) [25]

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

...
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;
...

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


ors_archangel   (2007-01-11 01:45:00) [26]


> 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
- но оба кода ничерта не делают


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

Нашёл способ как регулировать фпсы вручную.
При 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, подкиньте пожалуйста. Или другая идея.


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

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


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

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

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


DillerXX   (2007-01-10 23:04:00) [30]

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


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

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


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

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


DillerXX   (2007-01-10 22:55:00) [33]

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


@!!ex   (2007-01-10 22:39:00) [34]


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

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


ors_archangel   (2007-01-10 22:31:00) [35]


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

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


DillerXX   (2007-01-10 22:10:00) [36]


> ors_archangel ©

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


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


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

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


ors_archangel   (2007-01-10 22:06:00) [38]


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

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


@!!ex   (2007-01-10 22:04:00) [39]

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

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


DillerXX   (2007-01-10 21:51:00) [40]


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

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


Страницы:   1 2 3

Наверх

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