【问题标题】:Slick2 / dyn4j render loop performance when iterating number of bodiesSlick2 / dyn4j 在迭代主体数量时渲染循环性能
【发布时间】: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 以查看它是否是我要渲染的类型的实例(爆炸后运送碎片)。有没有更好(即更快)的方式来构建这个循环?还是我遗漏了另一个问题?

注意:

  1. 在上例中,bufferY 是固定的(爆炸发生时屏幕不会移动)
  2. bWIDTH/bHEIGHT 为背景图片的宽度和高度,sWIDTH 为屏幕宽度
  3. 我正在迭代 dyn4J 中的一组 Body 对象,因为我希望单个爆炸片段与景观交互,例如弹跳、滑动等。
  4. Body 对象有一个 Fixture,这是一个 Circle

谢谢

【问题讨论】:

  • 将其移出循环:space.getBodies()
  • 谢谢。我试过这个:List spaceBodies = space.getBodies(); for (int i = 0; i &lt; 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


【解决方案1】:

原来它不是图形绘制例程...它是在World.update() 方法期间片段的 dyn4j 迭代。将片段 Fixtures 更改为传感器 (Fixture.setSensor(true)),以便它们检测到碰撞,但不响应它们,解决了性能问题,如果我不检查运行游戏,我会得到大约 130FPS。耻辱,因为它只有 36 个对象。我不认为 dyn4j 处理的太多了……我怀疑我在某处遗漏了一些设置以使这项工作有效。 :/

ps。我之前评论中的for (Object spaceBody : spaceBodies) 确实有效。不知道那里发生了什么,但一个干净的构建解决了它。

【讨论】:

    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    相关资源
    最近更新 更多