1

我正在玩将 jbox2d 对象绘制到表面视图上,但我对我得到的帧速率并不满意(10-13,当屏幕上有多个对象/在调试中更多时,我得到大约 26- 30)。

    while (isRun)
        {
            Canvas canvas = holder.lockCanvas();
            _update(canvas); /// <- call to update
            holder.unlockCanvasAndPost(canvas);
        }

...

    canvas.drawColor(0xFF6699FF);

    for ( Body b = world.getBodyList(); b!=null; b = b.getNext() ) // <- cycle through all the world bodies
    {
        rlBodyImage bi = new  rlBodyImage();
        bi = (rlBodyImage) b.getUserData();
        float x = b.getPosition().x*scale + wOffset + camera_x + camera_x_temp;
        float y = b.getPosition().y*-scale + hOffset + camera_y + camera_y_temp;
        canvas.save();
        canvas.translate( x - (bi.getImage().getWidth()*bi.getCoof()*scale)/2 , y - (bi.getImage().getHeight()*bi.getCoof()*scale)/2 );
        canvas.scale( bi.getCoof()*scale , bi.getCoof()*scale );
        canvas.rotate( (float) -(b.getAngle() * (180/Math.PI)) , bi.getImage().getWidth() /2 , bi.getImage().getHeight() /2 );
        canvas.drawPicture(bi.getImage()); // <- draw the image assossiated with current body on canvas
        canvas.restore();                  // images are stroed as "Pictures" , extracted from SVGs.
    }

有没有办法加快速度,当然还有使用更简单的 SVG?:) 谢谢!


编辑 :

是的,将不得不切换到 PNG,它们提供更好的 FPS 速率。

矢量图片 = 10...13...16 FPS

仅 PNG = 35...40+ FPS

缩放的 PNG = 32...37+ FPS

带缩放和旋转的 PNG = 27+ FPS

在此处输入图像描述

4

2 回答 2

1

立刻,这条线让我觉得很奇怪:

rlBodyImage bi = new  rlBodyImage();

你正在制作一个新的 rlBodyImage 的每一帧,考虑到它的名字,我怀疑这不是一件简单的事情。

但是,下一行忽略了该图像:

bi = (rlBodyImage) b.getUserData();

在你的循环中试试这个,而不是这两行:

rlBodyImage bi = (rlBodyImage) b.getUserData();

让我们知道这是否有帮助:)

于 2012-05-13T07:35:40.563 回答
1

您可能应该使用光栅化图像而不是 SVG。您可以在编译之前/期间将它们保存为 png 或类似文件,或者手机可以在(第一次)启动时将它们转换为合适的图像。

似乎您正在交换要在每帧中多次绘制的纹理。这对于 GPU 来说是极其昂贵的。您应该创建一个包含所有图像的大型 sprite/imageatlas,将其加载到 GPU 上,然后将其不同区域绘制到屏幕上。

如果您不打算长时间使用它们,请不要在每帧分配许多新对象。GC 会时不时地冻结你的游戏一段时间,从而降低你的 fps。

编辑:您还应该在调试模式下实现超过 ~20 fps(除非您的手机真的很旧)。考虑优化你的 box2d 世界。您或许应该考虑使用 Libgdx 框架。它为 Box2d 提供了一个 JNI 包装器,大大提高了性能。

编辑2:

当我必须旋转和缩放它们时(当用户放大或缩小时)PNG 的问题就开始了

不是问题。将 PNG 保存为它们将在屏幕上显示的最大尺寸,然后缩放和旋转它们以适应。如果您使用适当的缩小过滤器,并且可能会在周围添加一些额外的空间(请参阅此帖子以获取示例),您应该会看到没有或最小的质量损失。如果需要,您可以为每个精灵创建一个大版本和一个小版本,并绘制最合适的一个。或者只是在 OpenGL 中使用 mipmapping。并且您不需要为每个精灵的每个大小/角度保存一个版本。

Libgdx Box2D

我不知道有多少性能提升。

于 2012-05-13T07:37:41.287 回答