从SurfaceView获得更多FPS,我能做得更好吗?

时间:2012-05-13 07:18:30

标签: java android surfaceview

我正在玩jbox2d对象到surfaceview上,但我对我得到的帧速率并不满意(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与缩放&amp;轮换= 27+ FPS

enter image description here

2 个答案:

答案 0 :(得分:1)

这条线很快就让我感到奇怪:

rlBodyImage bi = new  rlBodyImage();

你正在创建一个新的rlBodyImage的每一帧,鉴于它的名字,我怀疑这不是一件简单的事情。

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

bi = (rlBodyImage) b.getUserData();

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

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

如果有帮助,请告诉我们:)

答案 1 :(得分:1)

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

似乎你正在交换每帧多次绘制的纹理。这对GPU来说非常昂贵。您应该创建一个包含所有图像的大精灵/图像地图,将其加载到GPU上,然后将它的不同区域绘制到屏幕上。

如果您不打算长时间使用它们,请不要在每帧中分配许多新对象。 GC会暂时冻结你的游戏很短的时间,然后放弃你的fps。

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

EDIT2:

  

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

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

  

Libgdx Box2D

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