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

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

Игровой цикл [Delphi, Windows]


Игнатенков Станислав ©   (2005-03-10 23:16:00) 

Подскажите как лучше реализовать?????


cyborg   (2005-03-12 08:43:00) [1]

А чего ты хотел? Хочешь чтобы по максимуму было, так и будет 100% загрузка процессора. Либо делай Sleep, когда вычисления и отрисовка не нужны.


parovoZZ   (2005-03-12 04:33:00) [2]

Короче :
while Msg.message <> WM_QUIT do
if PeekMessage (Msg, 0, 0, 0, PM_REMOVE) then
 begin
  TranslateMessage (Msg);
  DispatchMessage (Msg);
 end
   else
     if Active then OnDraw else WaitMessage;


с   (2005-03-12 01:00:00) [3]

while (true)
{
//бла-бла-бла
}


Sphinx   (2005-03-11 21:24:00) [4]

> XProger ©   (11.03.05 21:08) [7]

Я имел в виду занятость процессора именно циклом...добавив вычислений и отрисовку и т.д. снижаем нагрузку на выполнение самого цикла, естественными "тормозами" уже будут служить процедуры рендера и расчет физики и прочего в игре...особенно заметно будет при включенной VSync.
Это не значит конечно, что в Диспетчере задач занятость упадет с 100 скажем до 50, это значит, что снизится занятость процессора именно на выполнение цикла while ... do .... К примеру при включенной верт. синхронизации при выполнении процедуры перестановки буферов процесс будет простаивать, и соответственно процессор не будет загружен...та же история и если будут выполняться длительные операции на графическом ядре в которых центральный процессор не учавствует...и всё это как раз снизит 100%-ную занятость ЦП.

Если я не прав, подправьте пожалуйста...


XProger   (2005-03-11 21:08:00) [5]

Sphinx, 100% загрузка не снизится при добавлении вычислений :)
Да и особых тормозов такой "пустой цикл" вызывать не будет...


Sphinx   (2005-03-11 09:55:00) [6]

Извените, не понял сразу :) сперва подумал вы про собственно "геймплэй" спрашиваете :)

А по поводу непосредственно цикла, всё правильно, команда GetMessage ждёт прихода сообщения, и пока сообщение не будет получено, работа приложения не будет продолжена. Можно попробовать отсылать сообщения основному окну из дополнительного потока, но только не PostMessage, а SendMessage иначе будут "подтормаживания". Но в целом это не самый лучший вариант (я про потоки).

А 100%-ная загрузка процессора...во-первых она несколько снизится когда вы добавите вычисления и собственно игровой процесс...а во-вторых, если игра полноэкранная - то проблемы в этом нет ни какой, всё равно пользователь будет играть в игру, а не бродить параллельно по Интернету, а если в окне, тогда лучше вариант с GetMessage.

З.Ы. Это только моё мнение и оно может отличаться от мнения истинных мастеров...

> гораздо лучше чем статьи всякие дурацкие.

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


Игнатенков Станислав   (2005-03-11 00:51:00) [7]

Спасибо... только возникает сложность...
если написать

While GetMessage(Msg,0,0,0) do
 begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
 end else
  MEGAGAME;

все работает ок, но игра рисует только когда окну приходят сообщения

а если

While PeekMessage(Msg,0,0,0,pm_remove) do
 begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
 end else
  MEGAGAME;

то процессор загружаеться до 100%


крокодил гений   (2005-03-11 00:27:00) [8]

в смысле, исходники тама.
гораздо лучше чем статьи всякие дурацкие.


крокодил гений   (2005-03-11 00:25:00) [9]

на сколько я знаю люди предпочитают делать на api. Окно получает сообщения и как-то реагирует на них, а если не получает - пересчитывает сцену и перерисовывается. Интервал времени узнаётся через GetTickCount.

в общем, на http://code.rpro.ru/можете посмотреть.


Игнатенков Станислав   (2005-03-10 23:31:00) [10]

Игра будет на подобии героев...
Лучше сделать как поток? просто как цикл while: sleep: ProcessMessages: end; ;)


Sphinx   (2005-03-10 23:28:00) [11]

Уточните вопрос пожалуйста.

Жанр игры, цель игры как минимум не названы...

А если интересно, попробуйте с http://www.gamedev.ruскачать диздок на только что закончившийся конкурс...там более чем подробно всё описано...только надеюсь они её еще не удалили ;)


Наверх

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