Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D

Ответ
 
Опции темы
Старый 14.08.2007, 19:47   #1
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Синхронизация

Почему многие пытаются встроить синхронизацию (фиксацию ФПС) в несетевые игры?
Проще поставить ограничение на ФПС. если комп мощный то результат будет одинаковый, если слабый то в первом случае (фиксация) игра будет тормозить, а во втором идти медленно, что на мой взгляд, взгляд человека имеющего оченно слабый комп, предпочтительнее нежели тормоза.
ПС. на размышление навела игра FlashShooter, или что то в етом роде.
(Offline)
 
Ответить с цитированием
Старый 14.08.2007, 19:53   #2
Maestro
ПроЭктировщик
 
Регистрация: 25.07.2007
Сообщений: 151
Написано 0 полезных сообщений
(для 0 пользователей)
Re: Синхронизация

HolyDel, а чем отличается синхронизация от ограничения? и как реализовывается ограничение?
(Offline)
 
Ответить с цитированием
Старый 14.08.2007, 20:05   #3
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Re: Синхронизация

flip 0
while a_time>millisecs()-30 : Wend
a_time=millisecs()
, где 30 это 1000/НУЖНЫЙ ФПС.
(Offline)
 
Ответить с цитированием
Старый 14.08.2007, 20:06   #4
Diplomat
Дэвелопер
 
Регистрация: 07.09.2005
Сообщений: 1,519
Написано 66 полезных сообщений
(для 164 пользователей)
Re: Синхронизация

Фича в том, что между "игра летает" (ФПС более 40-60) и "игра тормозит" (ФПС менее 20) лежит довольно большой промежуток, в котором и живёт абсолютное большинство юзверей.

Допустим, игрок А имеет слабую машину, которая в нашем случае выдаст на-гора 20-25 ФПС. Естественно, он не хочет, чтоб его игра замедлялась, и искренне желал бы, чтоб ФПС в игре был жестко залочен на те же 20-25.
С другой стороны медали у нас сидит игрок Б на своём скромном Кор3Трио/ГФ-80800/8Гб оперативных мозгов. И ему совсем не хочется видеть на его голубом 30-дюймовом дисплее жалкие 25ФПС, которые хоть и не мешают восприятию игры, но эстетически никак не вдохновляют. Ибо ежели приглядеться, легкие мерцания заметны. А ничто так не заставляет приглядеться к игре, как большой и очень дорогой компьютер.
В итоге получаем конфликтикъ-с интересов.
Именно этот конфликт и решается с помощью синхронизации. Ессно, применять ёё, как и всё остальное, нужно с умом. ФПС выше астрономических величин- 60? 70? 100? - можно и залочить, чтоб не прыгал, а ФПС ниже 20- лочить отключением синхронизации необходимо- ибо тормоза и рывки хуже плавного замедления.
ИМХО.
)
(Offline)
 
Ответить с цитированием
Старый 14.08.2007, 20:07   #5
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Re: Синхронизация

ограниечение реализуется через обычный таймер.

createtimer(x)
...
waittimer()
А синхронизация делается через captureworld(). В примере castle такое реализовано.

По вопросу holydela отвечу так: думаю многие просто не задумывались на этот счет.
(Offline)
 
Ответить с цитированием
Старый 15.08.2007, 00:27   #6
jimon
 
Сообщений: n/a
Re: Синхронизация

H@NON
очень многие задумывались

я в общем сделал так :
фпс ограничивается на 60 кадров в сек обычным циклом
если фпс меньше 60 то врубается обработка глобальной переменной DeltaTime ... ета переменная щитается от фпс в 65 кадров\сек
конечное значение DeltaTime щитается как среднее арифметическое от 32 последних значений
( DeltaTime в буфер щитается каждый цикл ... но значение задается только когда фпс < 60 )

такую стабилизацию я проверяю просто - Delay(Rand(0,70))
и знаете - игра работает идеально ...

ps. чтобы удавалось достичь плавной стабилизации мне потребовалось использовать высокоточный таймер - до микросекунды (в блице можно только до милисекунды)
 
Ответить с цитированием
Старый 15.08.2007, 05:02   #7
stone_evil
ПроЭктировщик
 
Регистрация: 17.10.2006
Сообщений: 170
Написано 18 полезных сообщений
(для 42 пользователей)
Re: Синхронизация

Я в WoodCutters вообще ФПС не ограничивал, сделал по-другому - создал зависимость активных действий от промежутка обрабатываемого времени в одном цикле. Т.е. если за минуту юниту надо пробежать 5 единиц, то он их пробежит при любом ФПС, только если ФПС=20, то за 20 итераций по 5/20 единиц, а если 60 - за 60 по 5/60 единиц. При этом, как мне кажется, тормозов в принципе не будет при любом ФПС.
(Offline)
 
Ответить с цитированием
Старый 15.08.2007, 10:10   #8
jimon
 
Сообщений: n/a
Re: Синхронизация

stone_evil
ну ето в общем и есть DeltaTime
 
Ответить с цитированием
Старый 16.08.2007, 00:39   #9
FLashMP
Оператор ЭВМ
 
Регистрация: 02.07.2007
Сообщений: 47
Написано 0 полезных сообщений
(для 0 пользователей)
Re: Синхронизация

По вопросу holydela отвечу так: думаю многие просто не задумывались на этот счет.
Я в своей первой игрушке : FlashShooter не задумывался о такой проблеме. А сейчас, когда я пишу продолжение, в ходе эксперимента, у меня перед камерой появляется 50 000 поликов, при этом скорость движения юнитов падает в 3-4 раза. Буду использовать принцип stone_evil и jimon с надеждой, что таких перепадов больше не будет Большое спасибо!
(Offline)
 
Ответить с цитированием
Старый 16.08.2007, 09:55   #10
FLashMP
Оператор ЭВМ
 
Регистрация: 02.07.2007
Сообщений: 47
Написано 0 полезных сообщений
(для 0 пользователей)
Re: Синхронизация

Народ, подскажите ссылочку, где можно скачать оптимальный счетчик фпс. Спасибо.
(Offline)
 
Ответить с цитированием
Старый 16.08.2007, 10:01   #11
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Re: Синхронизация

;------------------------------------------
; TweenTest.bb
; John Blackledge 20/9/03
; [email protected]
;--------------------------------------------

; --- Set Graphics mode, create a camera, create a light.
Graphics3D 800,600,32,2
camera = CreateCamera()
PositionEntity camera,0,0,-15
light = CreateLight()
PositionEntity light,20,20,40

; --- Set the Tweening/timer constants and initial variables.
Const FPS=30
period=1000/FPS
time=MilliSecs()-period

; --- Create an big entity of 1000 spheres parented to a piv.
piv=CreatePivot()
PositionEntity piv,0,0,0
For cnt = 1 To 1000
    cube = CreateSphere(16,piv)
    PositionEntity cube,Float(Rnd(-5,+5)),Float(Rnd(-5,+5)),Float(Rnd(-5,+5)),False
    EntityColor cube,Rnd(0,255),Rnd(0,255),Rnd(0,255)
Next

; --- The main loop start - based on Mark's Castle Demo code..
While Not KeyHit(1)
    Repeat
        elapsed=MilliSecs()-time
    Until elapsed
    ticks=elapsed/period    ;how many 'frames' have elapsed    
    tween#=Float(elapsed Mod period)/Float(period)    ;fractional remainder
    For k=1 To ticks
        time=time+period
        If k=ticks Then CaptureWorld
        ; --- Rotate our big spheres entity.
        ; --- This will stress the system, especially windowed.
        TurnEntity piv,1,2,3
        ; ----------------------------------------

        UpdateWorld

        ; --- Count the internal updates per second.
        ; --- This will show what sort of progress is actually happening as regards
        ; --- the updating of animated figures, water lapping etc?
        UpdateWorldCounter()
        ; ----------------------------------------

    Next
    RenderWorld tween#

    ; --- Count the number of updates per second being sent to the screen.
    ; --- This is actually what people are referring to 
    ; --- when they talk about frames per second.
    RenderWorldCounter1()
    RenderWorldCounter2()
    CounterDisplay()
    ; ----------------------------------------

    Flip
Wend
End

; --- I've kept the counters and displays as external functions
; --- (rather than embedded in the code) so as to simplify the
; --- reading of both areas.
Global UWcurTime,UWcheckTime,UWcurFPS,UWcounter
Function UpdateWorldCounter()
    UWcurTime = MilliSecs()
    If UWcurTime => UWcheckTime Then
        UWcheckTime = UWcurTime + 1000
        UWcurFPS = UWcounter
        UWcounter = 0
    Else
        UWcounter = UWcounter + 1
    End If
End Function

Global RW1curTime,RW1checkTime,RW1curFPS,RW1fpscounter
Function RenderWorldCounter1()
    RW1curTime = MilliSecs()
    If RW1curTime > RW1checkTime Then
        RW1checkTime = RW1curTime + 1000
        RW1curFPS = RW1fpscounter
        RW1fpscounter = 0
    Else
        RW1fpscounter = RW1fpscounter + 1
    End If
End Function

Global RW2counter,RW2time,RW2framerate
; --- This is a different fps counter that I came across
; --- so I thought I'd add it in as a contrast.
Function RenderWorldCounter2()
    RW2counter = RW2counter+1
    If RW2time=0 Then RW2time=MilliSecs()
    If RW2time+1001 < MilliSecs()
        RW2framerate = RW2counter
        RW2counter=0
        RW2time=MilliSecs()
    EndIf
End Function

Function CounterDisplay()
    Color 0,0,0
    Rect 0,0,300,100,1
    Color 255,255,255
    Text 0, 0,"Const FPS " + FPS + " "
    Text 0,20,"UpdateWorld() / sec " + UWcurFPS + " "
    Text 0,40,"RenderWorld() / sec 1st method " + RW1curFPS + " "
    Text 0,60,"RenderWorld() / sec 2nd method "+RW2framerate
    Text 0,80,"Triagles Rendered "+TrisRendered()
End Function
Думаю_подойдет
(Offline)
 
Ответить с цитированием
Старый 16.08.2007, 16:46   #12
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Re: Синхронизация

H@NON, вот у тебя в этом коде используется стабилизатор из стандартных templat'ов в Blitz3D\IDE. Так вот я его тоже использую, его принцип таков: Указывается постоянный UPS, и далее если из-за фпс, упс падает, то не рендерить данный цикл, пока упс не отстабилизируется до заданного. Походу мы все говорим практически ободном.
В чём выигрывает такая система, чем то как делал stone_evil или jimon умножая скорость логических действий, на опр коэфицент стабилизации, тем что есть такие операции которые Только выводят, например Glow или DoF, там есть CopyRect и RenderWorld которые задуйствованы Больше 1 раза, при этом если упс падает, мы не делаем эти действия и не выводим картинку, тем самым производительность вырастет по сравнению с DeltaTime.

Именно этот конфликт и решается с помощью синхронизации. Ессно, применять ёё, как и всё остальное, нужно с умом. ФПС выше астрономических величин- 60? 70? 100? - можно и залочить, чтоб не прыгал, а ФПС ниже 20- лочить отключением синхронизации необходимо- ибо тормоза и рывки хуже плавного замедления.
ИМХО: нужно заранее думать над игрой, во первых минимальные требования, во вторых, если я на своём 700 дюроне с 4к жирафом и 512 озу, буду пытаться играть в дуум3 то что со мной поделаешь, ну не удастся и всё, а играть на скоросте в 10 раз меньше нормальной с 10фпс, это не игра.
Вот мне нравиться Source Engine, там тот же SiN Episodes идёт на моём (бывшем, ы обновил железо!) компе, и может идти с более крутыми настройками на крутых машинах, при этом местами игра просто идёт гладенько, но местами и тормозит.
Я считаю что Самое важное это стабильность логики, а не изображения. И от сюда мы имеем, что если у нас оптимальная графика, то не придётся ограничивать игрока фпсом, а если у него машина слабая, то он будет уверен, что этот вот монстр, будет бежать это время, и игрок успеет сделать финт который требует затрат времени, где на разных машинах оно будет одно и тоже.
(Offline)
 
Ответить с цитированием
Старый 16.08.2007, 17:19   #13
jimon
 
Сообщений: n/a
Re: Синхронизация

MoKa
количество проходов обновления логики - целое число
DeltaTime - число с плавающей запятой

из-за етого возможны рывки ...
имхо если DeltaTime > 4 то лутче отрубать рендер и обновлять только логику
если DeltaTime < 4 то вырубание рендера даст рывки на екране

у мну вырубание рендера пока технически не возможно лан поживем посмотрим ... хотя то что я сделал пока довольно стабильно живет

но у меня проект где основная нагрузка идет на рендер
(8 - 15 ms рендер против 0.2 - 0.8 ms обновление логики)
 
Ответить с цитированием
Старый 16.08.2007, 19:21   #14
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Re: Синхронизация

jimon, ну разумееться не целое число, это и мне понятно. Тут дело в другом, именно в том что при мною употребляемой системе, которую отписал в примере H@NON, и использует сокращённую её версию HolyDel, не даёт рывков, (рывок это ты про слабый фпс, или про Рывки? ).
(Offline)
 
Ответить с цитированием
Старый 16.08.2007, 19:56   #15
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Re: Синхронизация

еще раз о сути проблемы.
вся проблема именно в рывках (т.е. когда итгра замирает на секунду, а потом сразу все изменилось, ту у противоположно стены, появилось еще 6 противников из ниоткуда и т.д.)
Diplomat, солидарен. тогда вопрос в другом,почему никто неограничивает нижний фпс?
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
синхронизация физики и анимации (newton) drwoland Полезные функции 1 21.01.2010 00:08
Синхронизация PhysX Mr_F_ Blitz3D 19 01.08.2009 00:00
Синхронизация в Blitz3D ELIAS Blitz3D 4 29.12.2008 21:50
Сетевая синхронизация движущихся объектов stone_evil Blitz3D 9 11.01.2008 12:19
Синхронизация юнитов в стратегии stone_evil 3D-программирование 8 25.01.2007 13:58


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com