【发布时间】:2014-11-26 19:02:56
【问题描述】:
我正在从 dyn4j 世界 (World.getBodies()) 的 Slick2D 屏幕上绘制一系列 Body 对象,并获得非常低的帧速率,即 6-10 FPS。这是 Slick2D 中绘制 dyn4j 主体的渲染循环部分:
for (int i = 0; i < space.getBodies().size(); i++) { // Iterate through World bodies
if (space.getBodies().get(i) instanceof lander.ShipFragmentPool.Fragment) {
lander.ShipFragmentPool.Fragment fragment = (lander.ShipFragmentPool.Fragment) space.getBodies().get(i);
float x = (float) (fragment.getWorldCenter().x * scale); // Extract fragementco-ordinates
float y = (float) (fragment.getWorldCenter().y * scale);
float tempX = x % bWIDTH;
if (tempX > bufferX // Only draw fragments that are on screen
&& tempX < bufferX + sWIDTH) {
float radius = (float) (fragment.getRadius() * scale); // Get radius
float diameter = (float) (radius * 2); // And diameter
float drawX = (tempX - bufferX) - radius; // Co-ordinates to draw on screen
float drawY = ((bHEIGHT - bufferY) - y) - radius;
g.setColor(Color.white);
g.drawOval(drawX, drawY, diameter, diameter);
}
}
}
我猜测我在 World 对象中迭代超过 36 个物体并且必须在每种情况下测试对象类型的主要问题。返回的 Body 对象具有不同的类型,因此我必须测试每个 body 以查看它是否是我要渲染的类型的实例(爆炸后运送碎片)。有没有更好(即更快)的方式来构建这个循环?还是我遗漏了另一个问题?
注意:
- 在上例中,bufferY 是固定的(爆炸发生时屏幕不会移动)
- bWIDTH/bHEIGHT 为背景图片的宽度和高度,sWIDTH 为屏幕宽度
- 我正在迭代 dyn4J 中的一组 Body 对象,因为我希望单个爆炸片段与景观交互,例如弹跳、滑动等。
- Body 对象有一个 Fixture,这是一个 Circle
谢谢
【问题讨论】:
-
将其移出循环:
space.getBodies() -
谢谢。我试过这个:
List spaceBodies = space.getBodies(); for (int i = 0; i < spaceBodies.size(); i++) { // Iterate through World bodies if (spaceBodies.get(i) instanceof lander.ShipFragmentPool.Fragment)这个:List spaceBodies = space.getBodies(); for (Object spaceBody : spaceBodies) { if (spaceBody instanceof lander.ShipFragmentPool.Fragment)两者都以 7 FPS 的速度运行。第二个似乎没有将 spaceBody 对象识别为 ShipFragmentPool.Fragment 的一个实例。对不起格式 - 无法解决。 ://
标签: java performance game-physics slick2d