Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2011, 10:50   #1
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию Timer или While?

Делаю игрушку.

сейчас используется 2 таймера - основной цикл и анимация перемещения.
из приятных моментов - проц почти не грузит.
из неприятных - неприятная неопределенность как два таймера будут влиять друг на друга,
а именно один из таймеров может менять переменные, которые использует второй таймер.
а так же есть еще один баг с управлением, который я пока не допер как исправить,
но мне кажется что это из-за использования 2х таймеров.

с другой стороны, в большинстве исходников для игр, которые я скачивал
весь игровой процесс запёхан в цикл while.
типа while not Terminated do ...
казалось бы - то что надо, но несколько напрягает в таком случае загрузка проца на 99%,
даже если ничего тяжелого прога не делает.

хотелось бы услышать комментарии по поводу использования таймера,
и насколько адекватно использовать while, используют ли его в играх,
или это халявный вариант в примерах?

заранее спасибо всем ответившим.
xrob вне форума Ответить с цитированием
Старый 24.08.2011, 11:23   #2
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Цитата:
хотелось бы услышать комментарии по поводу использования таймера,
и насколько адекватно использовать while, используют ли его в играх,
или это халявный вариант в примерах?
код хотябы покажи
bulldog5293 вне форума Ответить с цитированием
Старый 24.08.2011, 11:39   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
а именно один из таймеров может менять переменные, которые использует второй таймер.
и что?
таймеры не паралельны.

PS: посмотрите тему "как вы относитесь к созданию игр на делфи" в разделе игр.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.08.2011, 12:01   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
while not Terminated do ...напрягает .. загрузка проца на 99%
Почаще насколько это возможно переходи в kernel-time - загрузка снизится до минимума.

Код:
while .. do
begin
  DoSomething; // пошустрее сделал свои дела : чем шустрее - тем меньше будет загрузка CPU твоим процессом
  Sleep(1); // и перешел на, скажем, 1мс в kernel-time
end;
Цитата:
комментарии по поводу использования таймера
Одного вполне достаточно.
Но даже если их будет дюжина в одном и том же потоке, обработчики их событий будут вызываться гарантированно последовательно.
mss вне форума Ответить с цитированием
Старый 24.08.2011, 12:27   #5
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

bulldog5293, смысл мне код показывать?
у меня ведь не "найдите ошибку в коде срочна! завтра сдавать!"
а вопрос больше по принципам построения программы.
так что конкретный код здесь особо не нужен.

Пепел Феникса, предложение почитать тему в 900+ постов очень заманчиво! ))
боюсь не осилю...

mss, sleep?
я много лестных слов слышал в его адрес.
а что вы об нем думаете?
sleep по-моему вообще всю программу останавливает...

а вообще я придумал использовать единственный таймер,
из которого запускать все остальное.
что-то типа while, но begin ... end; вызываться будет по таймеру
xrob вне форума Ответить с цитированием
Старый 24.08.2011, 12:31   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
sleep по-моему вообще всю программу останавливает...
только поток который его вызвал.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.08.2011, 13:11   #7
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
что вы об нем думаете?
То же что что и о прочих API-функциях, исполнение которых кроме всего прочего переводят вызывающий поток в kernel-time.
mss вне форума Ответить с цитированием
Старый 24.08.2011, 14:06   #8
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Я всегда старался придерживаться такого подхода :
Код:
procedure TMainFrm.TMRMainTimer(sender : object); // таймер любой можно прикрутить, не суть важно
begin
if GameStateChanged // вот он мейн тик игры, возвращает true если что либо изменилось, в нем всё живёт и цветёт
  then begin
  DoAllPaint(); // подготавливаем буфер окна
  self.invalidate;
  end;
end;

procedure Tmainfrm.FormPaint(Sender : Tobject);
begin
bitblt(self.canvas.handle,..., mainbuf,...); // блитим уже готовый буф кадра
end;
может, правда, кто-то скажет не очень кузяво, но проц спокойнёхонек - 0% загрузки при бездействии, при тике и рисовке кадра - зависит от кода, само собой (ну и постулат при разработке этого подхода был - приложение всегда отрисовано - и при таймерном вызове и вручную можно добавить и при всплывании окна, без накладок).

Да, этот подход на VCL , но вообще его махом можно перенести и на нормальную очередь сообщений и ВинАПИ без перекроя.
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Timer... Teleport Общие вопросы Delphi 13 14.09.2011 17:02
timer(vc++) NiCola999 Windows Forms 13 31.01.2011 06:00
timer Erick Cartman Помощь студентам 4 12.03.2010 19:57
Timer PAVEL315 Компоненты Delphi 16 20.12.2006 19:47
timer Toxa Компоненты Delphi 6 06.12.2006 06:58