|
3D-программирование Вопросы, касающиеся программирования 3D мира |
25.06.2009, 11:36
|
#16
|
ПроЭктировщик
Регистрация: 14.05.2009
Сообщений: 101
Написано 31 полезных сообщений (для 67 пользователей)
|
Ответ: Дельта тайминг
Сообщение от SBJoker
1. Все переменные твоей функции должны быть глобальными
2. deltatime должна быть типа float (#)
3. На deltatime нужно умножать любое действие которое в игре должно быть стабилизировано по фпс, т.е. вместо MoveEntity ent, 10,0,0 пишем MoveEntity ent, 10*deltatime,0,0 и т.д.
Смысл умножения на делтатайм это "двигать вещи во столько раз быстрее во сколько раз наш фпс меньше проектного"
З.Ы. а FPSCount должна быть глобальной! А если она глобальная то можно невозвращать её значение из функции.
|
Вот это очень полезная для меня информация!! Спасибо большое будем пробовать))
|
(Offline)
|
|
25.06.2009, 11:52
|
#17
|
ПроЭктировщик
Регистрация: 14.05.2009
Сообщений: 101
Написано 31 полезных сообщений (для 67 пользователей)
|
Ответ: Дельта тайминг
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
ЧТо делаю не так?
Последний раз редактировалось Unodeya, 25.06.2009 в 12:08.
|
(Offline)
|
|
25.06.2009, 12:26
|
#18
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Дельта тайминг
Ндэ...
Давай вместе разберм твой код и посмеёмся.
Global FPSTime,FPSCount,FPSCountTemp
Все настоящие программисты указывают тип переменных, это и нагляднее и много проблемм предупреждает, поэтому лучше так:
Global FPSTime%,FPSCount%,FPSCountTemp%
Global delta#=1
А вот теперь главная шутка:
В чём прикол? Да просто тут мы в самом начале делим 60 на переменную FPSCount в которой чуть выше видно что хранится 0.
Что будет если разделить любое число на ноль? Правильно, получится бесконечность... т.к. в любом числе бесконечное число такого мелкого числа как ноль.
Вопрос знатакам: зачем мы в главном цикле каждый раз вызываем функцию Init_Count_FPS()?
Правильно: чтобы узнать текущий фпс, ведь условия меняются и фпс надо считать постоянно. Так какого %$#@! мы дельтатайм то считаем в самом начале, а не сразу после вызова функции Init_Count_FPS()?
Теперь инструкция: строку delta# = 60.0 / FPSCount перенести в новое место сразу после строки Init_Count_FPS() и перед Flip
Серьёзно, нужно как то уметь "читать" свой код.
__________________
Последний раз редактировалось SBJoker, 25.06.2009 в 12:37.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо SBJoker за это полезное сообщение:
|
|
25.06.2009, 12:35
|
#19
|
|
Ответ: Дельта тайминг
Unodeya
deltatime должна высчитыватся каждый кадр
|
|
|
25.06.2009, 13:03
|
#20
|
scientist.alien
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений (для 2,593 пользователей)
|
Ответ: Дельта тайминг
Ты главное не переживай, все когда-то начинали, не у всех гладко было с перенаправлением мозга на программирование с обычного мышления. Давай разбираться вместе... Сейчас я пошагово разберу твой код и покажу, где ошибки, и как с ними справиться. Поехали:
Global FPSTime,FPSCount,FPSCountTemp
Тут ты молодец, мы завели новые глобальные переменные, разве что стоит добавить delta сюда же
Теперь давай немножко подумаем. У нас есть ФПС игры, который скачет от 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
Конец твоего главного цикла.
Давай немножко отойдем в сторону от темы и подумаем, как в общих чертах должна работать программа:
<инициализация>
<вход в цикл>
<тело главного цикла>
<выход из цикла>
<функции>
Вот в общих чертах и все.
Инициализация - это создание условий для запуска главного цикла, т.е. создание глобальных переменных, присвоение им _начальных_ (обрати на это, пожалуйста, внимание) значений, создание объектов, которые нужны будут на протяжение всей игры (например, камера, свет), вызова функций, которые должны быть вызваны до запуска главного цикла (например, у меня такая есть - запускает создание игровых объектов)
В теле главного цикла происходит основная жизнь программы, то, что ты видишь на экране (или не видишь, если твоя программа не должна ничего выводить). Естественно, конструкция цикла применяется не всегда, а только в тех случаях, когда необходимо многочисленное или постоянное до соблюдения каких-либо условий выполнение какого-либо блока программы. В твоем случае таким блоком является сочетание логика + отрисовка.
Важно понять одну вещь: компьютер делает не то, что ты хочешь, чтобы он сделал, а то, что ты ему скажешь сделать. Если ты хочешь, чтобы изменилось значение переменной - напиши правило, по которому оно должно измениться, и напиши его там, где она должна измениться...
Еще важно тут то, что главный цикл выполняется как и любая программа, строчка за строчкой, и пока очередь выполнения не дойдет до какого-либо строки, код этой строки НЕ ВЫПОЛНИТСЯ.
Ну, что такое функция ты похоже в общих чертах понимаешь.
Ну и напоследок, какую же ошибку ты допустил? Ошибка заключается в том, что ты нигде в главном цикле не изменил свою дельту
П.С.
Постарался без рыбы, только удочками..
П.П.С.
А, черт, опоздал...
__________________
Public service announcement: вы можете заблокировать отображение сообщений определённого пользователя, добавив его ник в список игнорируемых.
Tau lab. We LOVE you. We MADE you.
Последний раз редактировалось Taugeshtu, 25.06.2009 в 13:04.
Причина: адд(
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо Taugeshtu за это полезное сообщение:
|
|
25.06.2009, 13:25
|
#21
|
Элита
Регистрация: 16.01.2008
Сообщений: 1,800
Написано 958 полезных сообщений (для 3,833 пользователей)
|
Ответ: Дельта тайминг
Ize'g0re +1 за розжовку материала новичку.
(судя по количеству сообщений,последние самое адское за всю истороию)
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.06.2009, 13:38
|
#22
|
ПроЭктировщик
Регистрация: 14.05.2009
Сообщений: 101
Написано 31 полезных сообщений (для 67 пользователей)
|
Ответ: Дельта тайминг
Всем большое спасибо! В особенности: SBJoker,Ize'g0re,Jimon!
|
(Offline)
|
|
25.06.2009, 13:47
|
#23
|
ПроЭктировщик
Регистрация: 14.05.2009
Сообщений: 101
Написано 31 полезных сообщений (для 67 пользователей)
|
Ответ: Дельта тайминг
Сообщение от SBJoker
Ндэ...
Так какого %$#@! мы дельтатайм то считаем в самом начале, а не сразу после вызова функции 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
Но не работает.
Последний раз редактировалось Unodeya, 25.06.2009 в 13:53.
|
(Offline)
|
|
25.06.2009, 14:34
|
#24
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Дельта тайминг
фантастика !
интересно почему так
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
работает, а так как у тебя - нет ?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.06.2009, 15:03
|
#25
|
ПроЭктировщик
Регистрация: 14.05.2009
Сообщений: 101
Написано 31 полезных сообщений (для 67 пользователей)
|
Ответ: Дельта тайминг
Спасибо.. Почему тогда когда я ставилю Flip 0 всё равно всё двигается быстро....
|
(Offline)
|
|
25.06.2009, 15:28
|
#26
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Дельта тайминг
Сообщение от Unodeya
Знаешь посмеялся я над тем, что писал в начальных постах, что я вызываю дельту перед инициализацией графики. И ты меня не поправил.. Серьёзно, нужно уметь читать все посты, если ты пытаешься помочь.. З.Ы А так я думаю ты парень не плохой.
|
Я думаю тут никто необязан перечитывать пару страниц текста и исправлять ошибки.
Форум это место где на добровольных началах люди помогают друг другу.
Количество и качество помощи обычно зависит от правильно поставленого вопроса автором (конкретность, ясность), от уровня его притязаний на помощь форумчан (от простого вопроса до "напишите за меня программу".) ну и от уже заработаного авторитета на форуме. Несекрет что особенно наглых запоминают и игнорируют темы с их авторством.
Поэтому если хотите получить конкретный ответ на свой вопрос в этом столетии, задавайте его в правильной ветке форума, с подробным описанием проблемы и приведением проблемного куска кода объёмом не более 10-20 строк(это условно, но "много букаф" отпугивают).
Готовые решения алгоритмов ищите сами в соотв. ветках форума. Или на специализированых сайтах где вам за адекватное вознаграждение напишут что угодно.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.06.2009, 15:54
|
#27
|
ПроЭктировщик
Регистрация: 14.05.2009
Сообщений: 101
Написано 31 полезных сообщений (для 67 пользователей)
|
Ответ: Дельта тайминг
Сообщение от SBJoker
Я думаю тут никто необязан перечитывать пару страниц текста и исправлять ошибки.
Форум это место где на добровольных началах люди помогают друг другу.
Количество и качество помощи обычно зависит от правильно поставленого вопроса автором (конкретность, ясность), от уровня его притязаний на помощь форумчан (от простого вопроса до "напишите за меня программу".) ну и от уже заработаного авторитета на форуме. Несекрет что особенно наглых запоминают и игнорируют темы с их авторством.
Поэтому если хотите получить конкретный ответ на свой вопрос в этом столетии, задавайте его в правильной ветке форума, с подробным описанием проблемы и приведением проблемного куска кода объёмом не более 10-20 строк(это условно, но "много букаф" отпугивают).
Готовые решения алгоритмов ищите сами в соотв. ветках форума. Или на специализированых сайтах где вам за адекватное вознаграждение напишут что угодно.
|
По моему мои вопросы на данную тему заданы чётко, и каждое своё действия я описывал. А грубить мне начали конкретно ВЫ. Когда вы вступили в дискусиию по данному вопросу, мои вопросы были конкретизированны, а ВЫ, начали писать (грубо говоря) ненужную мне ахинею, которая была выражена в неуважительном ко мне тоне. Можете игнорировать мои вопросы. Но если существует комьюнити почему не помогать друг другу. Я всегда поделюсь своими знаниями и мне будет только приятно. P.S Я не мальнький ребенок, с которым можно разговаривать как ВАМ вздумается... Если не научились конкертно отвечать на вопросы просто не беритесь за это... Меньше вые%*%на и люди потянутся..- Это так, для жизни пригодиться..
Последний раз редактировалось Unodeya, 25.06.2009 в 16:12.
|
(Offline)
|
|
25.06.2009, 16:20
|
#28
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Дельта тайминг
почему почти все темы с вопросом по программированию заканчиваются именно так ?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.06.2009, 16:29
|
#29
|
ПроЭктировщик
Регистрация: 14.05.2009
Сообщений: 101
Написано 31 полезных сообщений (для 67 пользователей)
|
Ответ: Дельта тайминг
Помогите пожалуйста, если убераю VSync(Flip 0) что = Увелечение FPS, то дельта не работает.. В чём проблема?Заранее спасибо.
|
(Offline)
|
|
25.06.2009, 16:35
|
#30
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Дельта тайминг
почитай, всё что есть в посте #2 этой темы - многое должно прояснится
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:32.
|