forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Дельта тайминг (http://forum.boolean.name/showthread.php?t=8549)

Unodeya 25.06.2009 11:36

Ответ: Дельта тайминг
 
Цитата:

Сообщение от SBJoker (Сообщение 109019)
1. Все переменные твоей функции должны быть глобальными
2. deltatime должна быть типа float (#)
3. На deltatime нужно умножать любое действие которое в игре должно быть стабилизировано по фпс, т.е. вместо MoveEntity ent, 10,0,0 пишем MoveEntity ent, 10*deltatime,0,0 и т.д.

Смысл умножения на делтатайм это "двигать вещи во столько раз быстрее во сколько раз наш фпс меньше проектного"

З.Ы. а FPSCount должна быть глобальной! А если она глобальная то можно невозвращать её значение из функции.

Вот это очень полезная для меня информация!! Спасибо большое будем пробовать))

Unodeya 25.06.2009 11:52

Ответ: Дельта тайминг
 
Код:


Global FPSTime,FPSCount,FPSCountTemp

delta# = 60.0 / FPSCount
Graphics3D 1024,768,32,2
SetBuffer BackBuffer()


Global camera=CreateCamera()
PositionEntity camera, 0,2,-3

Global Cube=CreateCube()

AmbientLight 155,155,155

Repeat

PointEntity camera,cube
TurnEntity Cube,0,1*delta,0



UpdateWorld
RenderWorld

Text 5,20,"FPS:" +FPSCount

Init_Count_FPS()

Flip
Until KeyHit(1)
End

Function Init_Count_FPS()
If (MilliSecs()-FPSTime)>=1000 Then
                FPSTime = MilliSecs()
                FPSCount = FPSCountTemp
                FPSCountTemp = 0
        EndIf
        FPSCountTemp = FPSCountTemp + 1
End Function


ЧТо делаю не так?

SBJoker 25.06.2009 12:26

Ответ: Дельта тайминг
 
Ндэ...

Давай вместе разберм твой код и посмеёмся.
Код:

Global FPSTime,FPSCount,FPSCountTemp
Все настоящие программисты указывают тип переменных, это и нагляднее и много проблемм предупреждает, поэтому лучше так:
Код:

Global FPSTime%,FPSCount%,FPSCountTemp%
Global delta#=1

А вот теперь главная шутка:
Код:

delta# = 60.0 / FPSCount
В чём прикол? Да просто тут мы в самом начале делим 60 на переменную FPSCount в которой чуть выше видно что хранится 0.
Что будет если разделить любое число на ноль? Правильно, получится бесконечность... т.к. в любом числе бесконечное число такого мелкого числа как ноль.

Вопрос знатакам: зачем мы в главном цикле каждый раз вызываем функцию Init_Count_FPS()?
Правильно: чтобы узнать текущий фпс, ведь условия меняются и фпс надо считать постоянно. Так какого %$#@! мы дельтатайм то считаем в самом начале, а не сразу после вызова функции Init_Count_FPS()?

Теперь инструкция: строку delta# = 60.0 / FPSCount перенести в новое место сразу после строки Init_Count_FPS() и перед Flip

Серьёзно, нужно как то уметь "читать" свой код.

jimon 25.06.2009 12:35

Ответ: Дельта тайминг
 
Unodeya
deltatime должна высчитыватся каждый кадр

Taugeshtu 25.06.2009 13:03

Ответ: Дельта тайминг
 
Ты главное не переживай, все когда-то начинали, не у всех гладко было с перенаправлением мозга на программирование с обычного мышления. Давай разбираться вместе... Сейчас я пошагово разберу твой код и покажу, где ошибки, и как с ними справиться. Поехали:

Код:

Global FPSTime,FPSCount,FPSCountTemp
Тут ты молодец, мы завели новые глобальные переменные, разве что стоит добавить delta сюда же

Код:

delta# = 60.0 / FPSCount
Теперь давай немножко подумаем. У нас есть ФПС игры, который скачет от 20 до 120 (к примеру) в течение игры. Соответственно, и дельта (определяющая скорость действий в игре) должна изменяться вместе с ним, верно же?
Но ты поставил дельту до главного цикла.
Окей, если еще не понятно, о чем я, давай пройдемся по значениям переменных:
Первая строчка кода - объявлены FPSTime,FPSCount,FPSCountTemp, все они равны 0
Вторая строчка кода - ты заводишь дельту, и даешь ей значение 60/0

Поехали дальше

Код:

Graphics3D 1024,768,32,2
SetBuffer BackBuffer()

Global camera=CreateCamera()
PositionEntity camera, 0,2,-3

Global Cube=CreateCube()

AmbientLight 155,155,155

Тут и сказать нечего, все хорошо, все работает

А дальше идет твой главный цикл:
Код:

Repeat

PointEntity camera,cube
TurnEntity Cube,0,1*delta,0



UpdateWorld
RenderWorld

Text 5,20,"FPS:" +FPSCount

Тут тоже все хорошо, все радужно. Но вспоминаем, чему равняется на данный момент дельта (а после этого она нигде не менялась) и делаем кое-какой вывод

Код:

Init_Count_FPS()

Flip
Until KeyHit(1)
End

Конец твоего главного цикла.
Давай немножко отойдем в сторону от темы и подумаем, как в общих чертах должна работать программа:

<инициализация>

<вход в цикл>
<тело главного цикла>
<выход из цикла>

<функции>
Вот в общих чертах и все.
Инициализация - это создание условий для запуска главного цикла, т.е. создание глобальных переменных, присвоение им _начальных_ (обрати на это, пожалуйста, внимание) значений, создание объектов, которые нужны будут на протяжение всей игры (например, камера, свет), вызова функций, которые должны быть вызваны до запуска главного цикла (например, у меня такая есть - запускает создание игровых объектов)

В теле главного цикла происходит основная жизнь программы, то, что ты видишь на экране (или не видишь, если твоя программа не должна ничего выводить). Естественно, конструкция цикла применяется не всегда, а только в тех случаях, когда необходимо многочисленное или постоянное до соблюдения каких-либо условий выполнение какого-либо блока программы. В твоем случае таким блоком является сочетание логика + отрисовка.
Важно понять одну вещь: компьютер делает не то, что ты хочешь, чтобы он сделал, а то, что ты ему скажешь сделать. Если ты хочешь, чтобы изменилось значение переменной - напиши правило, по которому оно должно измениться, и напиши его там, где она должна измениться...
Еще важно тут то, что главный цикл выполняется как и любая программа, строчка за строчкой, и пока очередь выполнения не дойдет до какого-либо строки, код этой строки НЕ ВЫПОЛНИТСЯ.

Ну, что такое функция ты похоже в общих чертах понимаешь.


Ну и напоследок, какую же ошибку ты допустил? Ошибка заключается в том, что ты нигде в главном цикле не изменил свою дельту

П.С.
Постарался без рыбы, только удочками..
П.П.С.
А, черт, опоздал...

Dzirt 25.06.2009 13:25

Ответ: Дельта тайминг
 
Ize'g0re +1 за розжовку материала новичку.
(судя по количеству сообщений,последние самое адское за всю истороию)

Unodeya 25.06.2009 13:38

Ответ: Дельта тайминг
 
Всем большое спасибо! В особенности: SBJoker,Ize'g0re,Jimon!

Unodeya 25.06.2009 13:47

Ответ: Дельта тайминг
 
Цитата:

Сообщение от SBJoker (Сообщение 109024)
Ндэ...
Так какого %$#@! мы дельтатайм то считаем в самом начале, а не сразу после вызова функции Init_Count_FPS()?


Серьёзно, нужно как то уметь "читать" свой код.

Знаешь посмеялся я над тем, что писал в начальных постах, что я вызываю дельту перед инициализацией графики. И ты меня не поправил.. Серьёзно, нужно уметь читать все посты, если ты пытаешься помочь.. З.Ы А так я думаю ты парень не плохой.

Код:

Global FPSTime%,FPSCount%,FPSCountTemp%
Global delta#=1

Graphics3D 1024,768,32,2
SetBuffer BackBuffer()


Global camera=CreateCamera()
PositionEntity camera, 0,2,-3
CameraClsColor camera,155,100,200
Global Cube=CreateCube()

AmbientLight 155,155,155

Repeat

PointEntity camera,cube
MoveEntity Cube,0,0.01*Delta#,0



UpdateWorld
RenderWorld

Text 5,20,"FPS:" +FPSCount

Init_Count_FPS()
delta# = 60.0 / FPSCount
Flip
Until KeyHit(1)
End

Function Init_Count_FPS()
If (MilliSecs()-FPSTime)>=1000 Then
                FPSTime = MilliSecs()
                FPSCount = FPSCountTemp
                FPSCountTemp = 0
        EndIf
        FPSCountTemp = FPSCountTemp + 1
End Function

Но не работает.

NitE 25.06.2009 14:34

Ответ: Дельта тайминг
 
фантастика !
интересно почему так
Код:

Global FPSTime%=MilliSecs(),FPSCount%=60,FPSCountTemp%
Global delta#=1
Graphics3D 1024,768,32,2
SetBuffer BackBuffer()


Global camera=CreateCamera()
PositionEntity camera, 0,2,-3
CameraClsColor camera,155,100,200
Global Cube=CreateCube()

AmbientLight 155,155,155

Repeat

PointEntity camera,cube
MoveEntity Cube,0,0.01*Delta#,0



UpdateWorld
RenderWorld

Text 5,20,"FPS:" +FPSCount

Init_Count_FPS()
delta# = 60.0 / FPSCount
Flip
Until KeyHit(1)
End

Function Init_Count_FPS()
If (MilliSecs()-FPSTime)>=1000 Then
                FPSTime = MilliSecs()
                FPSCount = FPSCountTemp
                FPSCountTemp = 0
        EndIf
        FPSCountTemp = FPSCountTemp + 1
End Function

работает, а так как у тебя - нет ?

Unodeya 25.06.2009 15:03

Ответ: Дельта тайминг
 
Спасибо.. Почему тогда когда я ставилю Flip 0 всё равно всё двигается быстро....

SBJoker 25.06.2009 15:28

Ответ: Дельта тайминг
 
Цитата:

Сообщение от Unodeya (Сообщение 109031)
Знаешь посмеялся я над тем, что писал в начальных постах, что я вызываю дельту перед инициализацией графики. И ты меня не поправил.. Серьёзно, нужно уметь читать все посты, если ты пытаешься помочь.. З.Ы А так я думаю ты парень не плохой.

Я думаю тут никто необязан перечитывать пару страниц текста и исправлять ошибки.
Форум это место где на добровольных началах люди помогают друг другу.

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

Поэтому если хотите получить конкретный ответ на свой вопрос в этом столетии, задавайте его в правильной ветке форума, с подробным описанием проблемы и приведением проблемного куска кода объёмом не более 10-20 строк(это условно, но "много букаф" отпугивают).

Готовые решения алгоритмов ищите сами в соотв. ветках форума. Или на специализированых сайтах где вам за адекватное вознаграждение напишут что угодно.

Unodeya 25.06.2009 15:54

Ответ: Дельта тайминг
 
Цитата:

Сообщение от SBJoker (Сообщение 109042)
Я думаю тут никто необязан перечитывать пару страниц текста и исправлять ошибки.
Форум это место где на добровольных началах люди помогают друг другу.

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

Поэтому если хотите получить конкретный ответ на свой вопрос в этом столетии, задавайте его в правильной ветке форума, с подробным описанием проблемы и приведением проблемного куска кода объёмом не более 10-20 строк(это условно, но "много букаф" отпугивают).

Готовые решения алгоритмов ищите сами в соотв. ветках форума. Или на специализированых сайтах где вам за адекватное вознаграждение напишут что угодно.

По моему мои вопросы на данную тему заданы чётко, и каждое своё действия я описывал. А грубить мне начали конкретно ВЫ. Когда вы вступили в дискусиию по данному вопросу, мои вопросы были конкретизированны, а ВЫ, начали писать (грубо говоря) ненужную мне ахинею, которая была выражена в неуважительном ко мне тоне. Можете игнорировать мои вопросы. Но если существует комьюнити почему не помогать друг другу. Я всегда поделюсь своими знаниями и мне будет только приятно. P.S Я не мальнький ребенок, с которым можно разговаривать как ВАМ вздумается... Если не научились конкертно отвечать на вопросы просто не беритесь за это... Меньше вые%*%на и люди потянутся..- Это так, для жизни пригодиться..

NitE 25.06.2009 16:20

Ответ: Дельта тайминг
 
почему почти все темы с вопросом по программированию заканчиваются именно так ?

Unodeya 25.06.2009 16:29

Ответ: Дельта тайминг
 
Помогите пожалуйста, если убераю VSync(Flip 0) что = Увелечение FPS, то дельта не работает.. В чём проблема?Заранее спасибо.

NitE 25.06.2009 16:35

Ответ: Дельта тайминг
 
почитай, всё что есть в посте #2 этой темы - многое должно прояснится


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

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