Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Притормаживание при падении FPS 
V
    Опции темы
Агрох
Дата 4.2.2014, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: нет
Всего: 6



Пишу простенькую игрушку, через DirectX. При падении ФПС движок просчитывает всё так, что объекты даже при низком ФПС перемещаются на то же расстояние, что и при нормальном. Т.е. если объект должен за 3 секунды долететь от одного края экрана до другого то он и долетит. Вот только при низком ФПС он как бы перескакивает через большие расстояния. В итоге не всегда срабатывает коллизия, да и выглядит не очень красиво.
Естественно это наблюдается только на слабых машинах и только при большом количестве объектов. Хотя в любом случае бывают ситуации когда ФПС разово падает.

Как сделать так, чтобы при падении ФПС события в игре притормаживались, а не перескакивали?

Имеется: значение текущего фпс (вычисляется движком), значение interval таймера, величина задержки (LagCount - вычисляется движком).

Это сообщение отредактировал(а) Агрох - 4.2.2014, 16:02
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Bitter
Дата 4.2.2014, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 5
Всего: 27



так в том то и дело что затормаживание игрового процесса вместе с падением ФПС это не правильно. Как раз правильно когда объекты продолжают двигаться по правильной траектории. Иначе у вас объекты будут двигаться с разной скоростью при любом, даже мелком изменении ФПС. ФПС всегда меняется, даже если он большой, и скорость объекта никак не должна зависеть от этого. Скорость может зависить только от времени, а уж как с этим справляется видеокарта и процессор - так это проблема не игры, а железа.
В вашем случае нужно устранять причину падения ФПС, например упрощая графику
PM MAIL ICQ Skype   Вверх
Агрох
Дата 4.2.2014, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: нет
Всего: 6



Цитата(Bitter @  4.2.2014,  17:21 Найти цитируемый пост)
В вашем случае нужно устранять причину падения ФПС, например упрощая графику


Ситуация, которую я описал, это что то вроде стресс-теста. Когда объектов заведомо больше, чем надо.

Опишу немного по другому. Летит пуля, из за описанного выше события она пролетает сквозь объект, т.к. фактически её координаты не пересекались с координатами объекта. Координаты, по оси X, пули меняются от 0 до 100, объект стоит в координатах 50. При нормальном ФПС координата пули меняется на 1 и она нормально сталкивается с объектом. При низком уровне ФПС её координаты меняются за раз на 3-6 и она может пролететь сквозь объект (по крайней мере визуально).

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

Хотя ещё надо покопаться. Может надо поменять что то в событиях вызова коллизии и смены координат объектов.
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Bitter
Дата 4.2.2014, 16:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 5
Всего: 27



Коллизия пули это всегда проблема номер 1. А что если у вас пуля должна лететь со скоростью три экрана в секунду? Тут вам никакой ФПС не поможет. Коллизия пули рассчитывается не пересечением точки и фигуры, а пересечением отрезка и фигуры. Отрезок это расстояние которое прошла пуля за интервал времени

Добавлено через 3 минуты и 34 секунды
В некоторых физ движках (например в Box2D) вы можете задать объекту специальный флаг isBullet, в таком случае физика такого объекта рассчитывается на основе отрезка пройденного объектом с момента последнего расчета. Для объектов без такого флага, физика рассчитывается как обычно.
PM MAIL ICQ Skype   Вверх
Агрох
Дата 5.2.2014, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: нет
Всего: 6



Bitter, спасибо за совет.

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

Правильная последовательность вызова событий смены координат и коллизии помогла не полностью (у меня стояло сначала проверка коллизии, а потом смена координат. Надо наоборот). Вроде стало лучше, но всё равно проскакивают. При этом, естественно, чаще через тонкие объекты (толщина 1-2 пикселя). Для чистоты эксперимента проверю ещё на слабой машине, или на виртуалке.

Попробую описать поведение пуль самостоятельно.
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Alexeis
Дата 5.2.2014, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: нет
Всего: 459



  Сразу говорю, что я физическими движками не занимался, но мне в голову приходит такое решение. Во первых физику считать безотносительно графики, можно даже с меньшим fps. Представим себе замкнутый полигональный меш, который движется с некоторой скоростью V (вектор V функция от t) . Будем исследовать коллизии через некоторые дискретные промежутки времени dt . В физике обычно позиция тела вычисляется как решение дифференциального уравнения движения. В простейших случаях когда ускорение не меняется со временем, то получаем школьное решение уравнения (например для координаты X) получается такое X=X0+V0x*t+(ax*t^2)/2 ; Т.е. если на тело действует гравитация или еще какая сила с постоянным вектором и модулем.
  Нам это дает, то что через произвольный интервал времени dt мы будем абсолютно точно знать координаты тела X,Y,Z . Т.е. если X0 это исходная координата X, то через момент времени dt X1, будет иметь значение X1= X0+V0x*(t+dt)+(ax*(t+dt)^2)/2 .
  Но знание позиции еще не дает нам информации о коллизии, поскольку координата X0 может находиться с одной стороны стены, а X1 уже через стенку. Чтобы проверить соударение нам нужно сначала посчитать вектор изменения позиции. Тут все просто (x1-x0,y1-y0,z1-z0). В 3D графике при помощи матриц можно задавать операцию масштабирования (4й столбец). Вот мы и делаем масштабирование модели в направлении сдвига. Т.е. пуля будет вытягиваться в длинный пруток(быстро летит), а детский мячик вытянется в небольшой цилиндр. Теперь, очевидно, чтобы проверить коллизию для пули, нужно проверить пересечение не исходной модели, а именно этого получившегося длинного прутка, поскольку он описывает все позиции тела за интервал времени dt . Мячик, соответственно будет вытянут меньше. 
  В заключении оговорюсь, что тут описана физика материальной точки, т.е. объекта чьими размерами можно пренебречь. Для правильного описания твердого тела потребуется решение уравнения для вращательного движения (но суть дискретизации та же). Т.е. к трем координатам добавятся еще 3 угла. Вместо сил считаем вращательный момент, а вместо массы фигурирует момент инерции. Это может понадобиться для описания физики вытянутых объектов. Например, 2 ребенка катаются на качелях (перекладина с фиксацией посередине). Движение перекладины будет чисто вращательным. Или к примеру кубик падает с большой горизонтальной скоростью и начинает катиться.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Агрох
Дата 6.2.2014, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: нет
Всего: 6



Проблему решил.

На всякий случай уточню. Делаю всё в 2D.

Убрал встроенную проверку коллизии. Именно она давала сильное падение ФПС. Т.к. проверка на пересечение пикселей (не рамки) в принципе ресурсоёмкая, плюс осуществлялась для всех со всеми, в т.ч. пули с другими пулями, фоном, кнопками, текстом. 2 объекта - 2 проверки, 3 объекта - 6 проверок 4 объекта - 12 проверок ... 100 объектов - 9900 проверок. Т.е. количество проверок росло лавинообразно. Может, если найти способ проверять два конкретных объекта, определяя предварительно какие находятся примерно в одной области и надо ли вообще для них осуществлять проверку, то можно снизить падение ФПС.

Для проверки попадания пули в объект проверяю есть ли общие координаты у отрезков, на которые переместились центр пули и центр цели. Пока этого достаточно, т.к. пуля и цель движутся строго в горизонтальной плоскости.
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Bitter
Дата 6.2.2014, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 5
Всего: 27



чтоб упростить это дело, вам нужно коллизию проверять в два этапа. Первый - проверять квадрат расстояния между объектами, и если он меньше заданного квадрата радиуса, значит переходить к проверке коллизии. Это позволит вам при 9900 проверок, сделать быстрое отбрасывание объектов которые точно не пересеклись, а остальных проверить тщательно.
PM MAIL ICQ Skype   Вверх
Агрох
Дата 6.2.2014, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: нет
Всего: 6



Bitter, да, я это уже понял.
Проблема в том, что просто так в движке нет функции проверки коллизии между двумя конкретными объектами, или хотя бы группами объектов. Есть вызов коллизии, без параметров, для конкретного объекта, которая проверяет, пересекается ли этот объект с другими.

В моём случае я запускал проверку коллизии после перемещения пули и проверял, если объект с которым она пересеклась является одним из объектов класса цель, то пулю надо удалить, а объекту нанести урон.

Плюс это не решит проблему поиска пересечения траекторий пули и цели.
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0575 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.