Sidescrolling Box2D-игра

При создании игры с боковой прокруткой Box2D удобно ли прокручивать каждый объект и перемещать его (например, по оси x), как это делается в следующем фрагменте кода:

for(Body b: bodies) {
    b.setTransform(-1, b.getPosition().y, b.getAngle());
}

Я также задавался вопросом о рендеринге, если я буду рендерить каждую текстуру на каждом теле, я буду рендерить весь уровень сразу, и это будет стоить мне много моего драгоценного FPS.


person Vilda    schedule 15.05.2014    source источник
comment
Но когда я узнаю, что на экране должно появиться новое тело?   -  person Vilda    schedule 15.05.2014
comment
Я не знаю о производительности box2d, но ради бога не используйте для каждого цикла с ArrayList, вы сведете GC с ума, foreach создает итератор каждый раз, когда вы его вызываете. Создание объекта внутри игрового цикла является основной причиной для низкая производительность во многих играх в игровом магазине.   -  person SteveL    schedule 15.05.2014
comment
Что еще я должен использовать тогда?   -  person Vilda    schedule 15.05.2014
comment
Классический for(int i=0;i‹bodies.size();i++){Body b=bodies.get(i)...;}   -  person SteveL    schedule 15.05.2014
comment
И это не создает внутренний объект, которым должен управлять GC?   -  person Vilda    schedule 15.05.2014
comment
Да, он не создает никакого объекта, если вы хотите увидеть для себя зло foreach, просто используйте инструмент DDMS для eclipse и проверьте выделения или просто проверьте logcat, и вы увидите сообщения типа «GC_CONCURRENT freed 704K, 15% бесплатно 12439K/14471K, пауза 13мс+13мс, всего 69мс   -  person SteveL    schedule 15.05.2014
comment
Хорошо, спасибо за совет.   -  person Vilda    schedule 15.05.2014


Ответы (1)


В отличие от комментариев, говорящих, что это хороший способ сделать это, я так не думаю.

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

Используйте OrthographicCamera и измените его положение. При рендеринге с помощью SpriteBatch рисуйте все тела точно в том месте, где они находятся (возможно, с коэффициентом масштабирования METER_TO_PIXEL) и используйте spriteBatch.setProjectionMatrix(camera.combined) на SpriteBatch. Таким образом, автоматически будут нарисованы только видимые тела, поскольку трансформация камеры избавит от всех невидимых тел.

И еще один совет: старайтесь избегать Body.setTransform(). Вместо этого попробуйте установить линейную скорость или приложить силы/моменты к телам. Использование setTransform вызывает нефизическое поведение, так как это в основном похоже на телепортацию и может привести к странным эффектам, а в моем случае иногда даже к ошибкам.

person noone    schedule 15.05.2014
comment
Я не знал, что использование камеры избавит от невидимых тел. Вы случайно не знаете, как настроить сцену, чтобы физически проснулись только видимые тела? - person Vilda; 16.05.2014
comment
Камера от них не избавится, но и не нарисуются, конечно. Если вы хотите отключить невидимые тела, вам нужно выполнить запрос AABB к World, с окном просмотра вашей камеры в качестве AABB, а затем отключить все тела, которых нет в этом запросе. - person noone; 16.05.2014