IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
Синхронизация
Sefirot
сообщение 26.10.2004, 11:03
Сообщение #1


/!\ инквизитор /!\
***

Группа: Пользователи
Сообщений: 1769
Регистрация: 1.9.2004
Из: Мидгар
Пользователь №: 13



Цитата
Вот код на блитце. Думаю разберешся.
-----------------------------------------------
Graphics3D 640,480,16,2
Const UPS=60 - это максимальный ФПС
cam=CreateCamera() -создание камеры
l=CreateLight() - создание света
period=1000/UPS
time=MilliSecs()-period
------------------Главный цикл
Repeat
-------------- внутренний цикл
Repeat
elapsed=MilliSecs()-time
Until elapsed
------------ конец внутреннего цикла по условию (elapsed<>0)
ticks=elapsed/period
tween#=Float(elapsed Mod period)/Float(period)
For k=1 To ticks ---------- цикл синхронизации !
time=time+period
If KeyHit(1) End выход по Esc
;сюда ставишь главный цикл игры
UpdateWorld
Next ------------конец цикла синхронизации
RenderWorld tween
Flip
Forever
------------------------ конец главного цикла
На RenderWorld tween не обращай внимание - и без tween синхронизируется
UpdateWorld - просчитывает коллизии и анимацию
RenderWorld - тут понятно
Flip - перерисовывает из текущего буфера на экран

Итак… за код спасибо, но я неврубаюсь в некоторые операторы… например что возвращает MilliSecs()? Скольки значную цифру? То есть в ДБ есть timer(), он возвращает полностью время, часы, минуты, секунд и миллисекунды… Да и вообще-то не могу уловить смысла в некоторых вещах… Lucky, а не мог бы ты объяснить как это проходит на теории… ну например: в цикле ставится задержка на определенная время, которое вычисляется в зависимости от величины FPS и т.д.? smile.gif А то в код я конкретно не въехал… сказывается два с лишнем года на ДБ smile.gif


--------------------
Перейти в начало страницы
 
+Цитировать сообщение
Tolking
сообщение 26.10.2004, 14:05
Сообщение #2


Активный участник
***

Группа: Пользователи
Сообщений: 80
Регистрация: 9.9.2004
Пользователь №: 50



Один из варианов синхронизации. Все параметры премещения задаешь в относительных велечинах (v). Скорость - ед/сек, повороты Град/сек. В начале игрового цикла фиксируешь время (t) прошедшее с последнего просчета сцены. И все объекты передвигаешь (Поворачиваешь) на соответствующую величину (S=vt и т.д.)...
Минусы: На медленных машинах играть может оказаться не возможно. Будет сказываться задержка управления...

Второй вариант (Условно назовем метод постоянных временных интервалов). Принимаем решение удерживать минимальный ФПС на определенном уровне. Расчитываем сколько должен быть интервал при данном ФПС, расчитываем скорость для кадра и используем это значение, но в конце ждем конца отведенного нам интервала...
Минусы: Если комп может выдать 100 фпс, а мы заложили 30 то теряем море вычислительных возможностей... Если комп не тянет 30 ФПС, то скорость игры будет меньше, но управляемость будет как на быстром компе...

Как вариант можно неким способом при старте игры вычислять возможный фпс и динамическа его лочить...


--------------------
Что наша жизнь?
Перейти в начало страницы
 
+Цитировать сообщение
lucky
сообщение 26.10.2004, 14:26
Сообщение #3


Активный участник
***

Группа: Пользователи
Сообщений: 769
Регистрация: 4.10.2004
Пользователь №: 85



Начал было писать, но Толкинг меня опередил. smile.gif
Добавлю что MilliSecs()-возвращает абсолютное время работы процессора в миллисекундах. Можешь использовать таймер дарка.
Перейти в начало страницы
 
+Цитировать сообщение
Tolking
сообщение 26.10.2004, 15:33
Сообщение #4


Активный участник
***

Группа: Пользователи
Сообщений: 80
Регистрация: 9.9.2004
Пользователь №: 50



Кстати, Лаки, ты пользовался своей реализацией синхронизации на слабых машинах?

Repeat
elapsed=MilliSecs()-time
Until elapsed

Это коррекция для быстрых машин где время просчета будет меньше 1 мс. А что произойдет если время просчета составит 2*period? Что-то мне кажется что такой алгоритм войдет в штопор и никакой игры не получится вообще. Т.е. Ты все компьютеры заставляешь просчитывать одинаковое количество кадров например 60 штук в секунду, если комп может просчитать только 30, то пытаясь просчитать оставшиеся 30, он будет все больше и больше отставать... И даже 30 ФПС мы от него не увидим...


--------------------
Что наша жизнь?
Перейти в начало страницы
 
+Цитировать сообщение
Sefirot
сообщение 26.10.2004, 18:52
Сообщение #5


/!\ инквизитор /!\
***

Группа: Пользователи
Сообщений: 1769
Регистрация: 1.9.2004
Из: Мидгар
Пользователь №: 13



Я так подумал и что-то мне кажется что с увеличением скорости объектов при низком и увеличении при высоком FPS, может только добавить лишних глюков... так как подстроить под все фишки это просто не реально... скролинг текстур, ратация, поочередное затекстурирование объекта, анимация объекта и наверно ещё что-то найдется... скорость всего этого не угадать и тем более не подстроить... будет много глюков…
Надо ещё подумать... smile.gif
А если попробовать узнать текущий FPS на компе и в зависимости от него выдавать определенное количество циклов игры? Например:
на компе 30fps выдаем 15 циклов, если 15, ставим 30 циклов…


--------------------
Перейти в начало страницы
 
+Цитировать сообщение
lucky
сообщение 26.10.2004, 20:30
Сообщение #6


Активный участник
***

Группа: Пользователи
Сообщений: 769
Регистрация: 4.10.2004
Пользователь №: 85



пробовал на Р - 3, 500 мгц - все работало вполне корректно. Сейчас у меня 1900 мгц и проверял на 2400 мгц все ок.

Sefirot ты попробуй, потом сделаешь выводы. Какая - то синхронизация должна быть обязательно.
Перейти в начало страницы
 
+Цитировать сообщение
Kolyanoid
сообщение 26.10.2004, 21:43
Сообщение #7


. . .-= SPK Games =-. . . Модератор v3.2 alpha . . Linuxoid v0.5
***

Группа: Администраторы
Сообщений: 3521
Регистрация: 1.9.2004
Из: Москва
Пользователь №: 15



Вообще, на ДБархиве валяется исходник Дмитрия Хороших. Там маленькая дема "поиск воды на марсе", а в частности она демонстрирует перемещение сложного объекта по неровной матрице. Тык вот в ней он использовал метод синхронизации по таймеру, на сколько я помню...


--------------------
Мои координаты:
  • Jabber: kolyanoid@jabber.ru
  • Почта: kolyanoid [at] mail333.com
  • Вконтакте: id64896
«Есть только две бесконечные вещи: Вселенная и глупость. Хотя насчет Вселенной я не уверен». (Альберт Эйнштейн)
Перейти в начало страницы
 
+Цитировать сообщение
Sefirot
сообщение 27.10.2004, 15:58
Сообщение #8


/!\ инквизитор /!\
***

Группа: Пользователи
Сообщений: 1769
Регистрация: 1.9.2004
Из: Мидгар
Пользователь №: 13



Не, такая не подходит… посмотрел… у него скорость подстраивается под секунды, а это не вариант…
Придумать бы что-то типа функции которая будет правильно обновлять экран со всем что на нем происходит happy.gif


--------------------
Перейти в начало страницы
 
+Цитировать сообщение
lucky
сообщение 27.10.2004, 17:05
Сообщение #9


Активный участник
***

Группа: Пользователи
Сообщений: 769
Регистрация: 4.10.2004
Пользователь №: 85



Ну просто переведи код блитца на дарк.
Тот код, что я дал, реально работает и довольно неплохо.
Немного уточню
Const UPS=60 - скорость выполнения программы, а не фпс
цикл
Repeat
elapsed=MilliSecs()-time
Until elapsed
Служит имено для этого

код:
ticks=elapsed/period

For k=1 To ticks
time=time+period

;сюда ставишь главный цикл игры
UpdateWorld
Next
синхронизирует скорость для любого компа. (в разумных пределах)
UpdateWorld просто просчитывает коллизии в блитце
Перейти в начало страницы
 
+Цитировать сообщение
versus
сообщение 27.10.2004, 17:25
Сообщение #10


Digital Mystery
***

Группа: Пользователи
Сообщений: 802
Регистрация: 1.9.2004
Из: Санкт-Петербург
Пользователь №: 9



Что значит Until elapsed???
Пока elapsed= чему??? huh.gif


--------------------
:: exclusive reality for you ::

фрОМ раШа виЗ пАнк
Перейти в начало страницы
 
+Цитировать сообщение
lucky
сообщение 27.10.2004, 20:09
Сообщение #11


Активный участник
***

Группа: Пользователи
Сообщений: 769
Регистрация: 4.10.2004
Пользователь №: 85



Если elapsed>0 то выход из цикла
Перейти в начало страницы
 
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 20.11.2017, 14:40
 X 
Ссылки на работы форумчан:
1. Cайт по использованию 3D технологий
в образовании

2. 15 Defense. Underwater Battle

3. GlaZ в Steam Greenlight