Вопросы новичка по роглайк разработке.

Темы, связанные с проектированием и программированием roguelike-игр

Модераторы: Sanja, Максим Кич

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: Вопросы новичка по роглайк разработке.

Сообщение Cfyz » 17 дек 2015, 12:37

Мне кажется, таймеры могут быть переусложнением в данном случае. Если речь идет о том, чтобы существа не носились как угорелые при избытке процессорного времени, то может подойти самый простой (и, вероятно, самый распространенный вариант): померять сколько времени прошло с предыдущей обработки/отрисовки, сравнить с желаемой скоростью и подождать разницу.

В этом случае для ожидания используется какой-нибудь Sleep, который запросто дает погрешность в 10-15 миллисекунд (в отдельных случаях -- и того больше) и поэтому считается плохим средством в требовательных к точности играх, но как правило это если в игре есть физика и сеть. В простых случаях наличие погрешности будет означать лишь то, что длительность одного фрейма обработки или отрисовки (скорость чего там ограничивается) будет плавать в некоторых пределах: хотим по 30 мс, а реально будет то 33, то 25, то 35; в среднем все равно выйдет 30, просто будет разброс.

Таймеры для графики имеет смысл применять если язык или инструментарий располагают к этому, например фреймворк такой. Если уж у нас такое серьезное приложение, что небольшой разброд и шатание длительности фрейма недопустимы, то ограничивать скорость вывода вообще следует через задействование вертикальной синхронизации: это и цель достигает, и тиринг (tearing) убирает.

Еще с таймером через сообщения в очередь (как, например, WM_TIMER) есть такая закавыка, что если в обработки очереди встречается ожидание через такой же Sleep (PeekMessage + Sleep если нет сообщений), то результирующая точность таймера получится ничем не лучше варианта без таймера.
Пытается раскуклиться

Аватара пользователя
karagy
Сообщения: 1271
Зарегистрирован: 10 янв 2007, 14:13

Re: Вопросы новичка по роглайк разработке.

Сообщение karagy » 17 дек 2015, 12:56

Если всё это под Windows, то вот вменяемый обзор типов системных таймеров http://www.codeproject.com/Articles/123 ... s-Tutorial

Реализацию Обёртку QueueTimer для дельфи можно взять тут http://code.google.com/p/kstools/downlo ... ols050.zip (юнит ksTimers.pas). Блог автора https://sergworks.wordpress.com/2010/04 ... rogrammer/

Поведение колбэков таймеров лучше всего проверять самому на тестах.

Лично я не полагаюсь на таймеры как на источник точного (по времени) вызова. Это просто источник оживления периодически вызываемого кода. А решение "не пора-ли что-то сделать" лучше принимать после опроса времени (GetTickCount, RDTSC, QueryPerformanceCounter и т.п.) Но и они не панацея. На многоядерных процессорах сомнительно RDTSC. С появлением динамической скорости процессоров - QPC начинает требовать частой калибровки (Measure). В общем всё плохо -)

В спойлере модуль для опроса QPC.
Скрытый текст: ПОКАЗАТЬ

Код: Выделить всё

unit HRTCounter;

interface

type
  HRTC = class
    strict private
      class var
        FPC : Int64;
        FPF : Int64;

      class function QueryPF : Int64;
      class function QueryPC : Int64;

    public
      class procedure StartMeasure;
      class function Clock : Double;
  end;


implementation

uses
  Winapi.Windows;

{ HRTC }

class function HRTC.QueryPF: Int64;
begin
  QueryPerformanceFrequency(Result);
end;

class function HRTC.QueryPC: Int64;
begin
  QueryPerformanceCounter(Result);
end;

class procedure HRTC.StartMeasure();
begin
  FPF := QueryPF;
  FPC := QueryPC;
end;

class function HRTC.Clock: Double;
begin
  Result := (QueryPC - FPC) / FPF;
end;

initialization
  HRTC.StartMeasure;

end.
Последний раз редактировалось karagy 17 дек 2015, 16:01, всего редактировалось 1 раз.

Аватара пользователя
Apromix
Мастер
Сообщения: 1236
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: Вопросы новичка по роглайк разработке.

Сообщение Apromix » 17 дек 2015, 15:32

Забавно будет посмотреть на новую df-like :D

altmax
Сообщения: 173
Зарегистрирован: 15 сен 2012, 11:59

Re: Вопросы новичка по роглайк разработке.

Сообщение altmax » 19 дек 2015, 19:21

Большое спасибо всем за ответы. Пришёл к выводу, что время выполнения программы лучше высчитывать через частоту процессора и количество тактов процессора, просто частоту процессора надо каждый раз будет запрашивать, т.к. она на современных процессорах имеет свойство очень часто меняться.
Ну а ожидание - через Sleep, тем более что системны таймер можно переустановить на меньшую дискретность - вполне реальна дискретность в 1мс с точностью около 10%, этого вполне достаточно. Написать свою процедуру можно конечно, но она будет грузить процессор, что и видно в DF - ядро всегда загружено на 100%, хоть у тебя 1 гном, хоть 100.
Хотя с частотой процессора тоже не всё гладко - в режиме TurboBoost Core i5 разгоняется до 3.2 гГц, но видит это только специальная утилита, винда же пишет, что частота 2.6 гГц, хотя для того же DF эти 20% не принципиальны.

Аватара пользователя
karagy
Сообщения: 1271
Зарегистрирован: 10 янв 2007, 14:13

Re: Вопросы новичка по роглайк разработке.

Сообщение karagy » 20 дек 2015, 07:09

Про проблемы с RDTSC раскрыто тут http://habrahabr.ru/company/intel/blog/260113/ начиная со строки "Трудная судьба инструкции RDTSC".

Аватара пользователя
Anfeir
Сообщения: 876
Зарегистрирован: 14 дек 2007, 09:29
Контактная информация:

Re: Вопросы новичка по роглайк разработке.

Сообщение Anfeir » 05 мар 2016, 18:08

петрушка писал(а):Сам я в этом жанре нуб, почти не играл в них.
Поиграй!
петрушка писал(а):Сколько обычно в среднем предметов в хорошем роглайке? А сколько типов существ?
Не принципиально.
петрушка писал(а):А что для вас самое важное в рогаликах?
Играбельность. Пошаговость, способность контролировать время. Т.е. если ты чувствуешь драйв, то не должен тормозить из-за того, что перс перемещается на соседнее поле за N - секунд. Это должно быть (почти) мгновевнно.
Видимость прогресса, исследование карты. Я этим у себя пренебрёг, и зря.

И да, хорошие буквы лучше плохих тайлов. И даже средне-хороших тайлов - если их нельзя отключить.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 44 гостя