forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Одинаковая скорость. (http://forum.boolean.name/showthread.php?t=5103)

AndruXa 22.11.2007 19:15

Одинаковая скорость.
 
Совет всем новичкам писать эту фишку, чтоб потом не сталкиваться с проблемами разной скорости на разных компах, особенно в крупных проектах.
Как это сделать:
1) Сразу после инициализации графики пишем:
Код:

Global elapsed,FPS,period,time,ticks,tween#
Код:

FPS=50
period=1000/FPS
time=MilliSecs()-period

2) В главном цикле пишем:
Код:

elapsed=MilliSecs()-time
      Until elapsed
     
      ticks=elapsed/period
     
      tween#=Float(elapsed Mod period)/Float(period)
     
      For k=1 To ticks
            time=time+period

3) Между UpdateWorld и RenderWorld пишем:
If k=ticks Then CaptureWorld
Next
4) Меняем RenderWorld наRenderWorld tween

PS:Все это из примера Castle, поставляемого с программой
Как видите все просто :)

moka 22.11.2007 19:20

Re: Одинаковая скорость.
 
AndruXa, ага, я эту фишку распространяю давныыым давно.
Вот она, сразу кодом ;)

IGR 22.11.2007 19:31

Re: Одинаковая скорость.
 
есть еще варианты ?? ;)

AndruXa 22.11.2007 19:53

Re: Одинаковая скорость.
 
Цитата:

есть еще варианты ??
Других не знаю, а че, этого мало

moka 22.11.2007 19:54

Re: Одинаковая скорость.
 
Да и называеться она: Синхронизация.
Я бы назвал так: Стабилизация UPS.

jimon 22.11.2007 21:10

Re: Одинаковая скорость.
 
есть еще синхронизация по дельта таймингу
синхротизация по таймеру
и есть еще тупое ограничение Fps мертвыми циклами

еще много чего есть

AndruXa 23.11.2007 00:11

Re: Одинаковая скорость.
 
Извиняюсь, но это создавалось для новичков, Вспомните себя вам и это было сложно(как и мне)

Diplomat 23.11.2007 00:52

Re: Одинаковая скорость.
 
Для новичков создавались Хелп, CreateTimer() и WaitTimer().
Тебя заверить могу, что простого более и стабильного способа ФПС стабилизации найти не стоит пытаться даже, юный падаван...

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

impersonalis 23.11.2007 01:58

Re: Одинаковая скорость.
 
Diplomat дело говорит, помнится он совместно с tormoz сделали комбинированную систему.

moka 23.11.2007 11:37

Re: Одинаковая скорость.
 
Diplomat, но дело то в том, что таким ограничением как во 2 посту по ссылке, реализуеться и небольшая оптимизация, т.к. рендер и логика не идут паралельно, а порой рендер пропускаеться, поэтому получается что упс первостепеннен а фпс если позволяеться - будет. С таймером же, они всегда вместе и поэтому фпс будет ниже чем с этим ограничением.
имхо.

Diplomat 23.11.2007 14:48

Re: Одинаковая скорость.
 
Цитата:

он совместно с tormoz сделали комбинированную систему
Сделать-то сделали, только она работала лишь на стенде, выдавая чудесные глюки при попытке практического применения. В общем, это был сферический конь в вакууме. )

Цитата:

С таймером же, они всегда вместе и поэтому фпс будет ниже чем с этим ограничением.
На максимальных нагрузках ФПС, т.е. количество проходов рендера, с таймером будет выше, зато будет тормозить логика и игра замедлится.
Синхронизатор зарежет ФПС фреймскипами, в итоге логика тормозить не будет, но на экране будет в лучшем случае слайдшоу.
Дельтатайминг достаточно нестабилен- возможны постоянные перепады скорости и рывки.
...
В итоге лично я избрал сочетание "программный ограничитель проходов логики" + "включаемый фреймскип" + "рендер твининг". В наиболее примитивном виде это выглядит так:
Код:

;Всё внутри главного цикла
;Ограничитель логики
IF LogicDelay<Millisecs() THEN
  LogicDelay=LogicDelay+LogicMaxCycleDealy
  IF LogicDelay<Millisecs() THEN LogicDelay=Millisecs()+LogicMaxCycleDealy
    ;Тут вставляем обновление логики
ENDIF

;Рендер
RenderSkip=1-RenderSkip
IF RenderSkip=0 THEN RenderWorld()

Очевидно, фреймскип следует делать включаемым, зависимым от ФПС. Можно также ввести рендер твининг, хотя в Блице он не архистабилен.
И конечно же не стоит удивляться второй строке кода.

Crayzi 17.08.2008 23:46

Re: Одинаковая скорость.
 
Есть еще вариант, с хелпа блитза :
;************************************************* ****
Описание
Используйте эту команду в паре с WaitTimer для контроля скорости выполнения игры (fps). Вы можете использовать это в главном цикле программы. Это не позволит выполняться игре быстрее на более мощных компьютерах. Использование этой системы очень хорошая практика, если ваша игра будет выполняться на различных компьютерах.

Пример
; Создаём таймер для контроля скорости
frameTimer=CreateTimer(60)

; Главный цикл отрисовки экрана
While Not KeyHit(1)
WaitTimer(frameTimer) ; Пауза пока не пройдет 60 млс. с прошлого вызова
Cls
; Сама отрисовка
Flip
Wend

; Уничтожаем таймер
FreeTimer(frameTimer)
;************************************************* *******

Tadeus 28.08.2008 13:05

Ответ: Одинаковая скорость.
 
Это идиотизм

HolyDel 28.08.2008 13:18

Ответ: Одинаковая скорость.
 
Цитата:

Это идиотизм
поясните©

Tadeus 28.08.2008 13:31

Ответ: Одинаковая скорость.
 
Если время просчета логики займет больше времени чем нужно, резко снижается скорость игры. На слабых же компах все начинает тормозить из-за того что "отстает" прорисовка. Вроде бы так )

извиняюсь ))) Здесь же только прорисовка


Часовой пояс GMT +4, время: 15:08.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot