2012-05-13 41 views
1

我正在玩jQuery2d对象绘制到surfaceview,但我不是很满意我得到的帧率(10-13,当有多个对象在屏幕上/在调试更多我得到26-30)。从SurfaceView获得更多的FPS,我可以做些更好的事情吗?

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. 
    } 

有没有办法来加快速度,其他那么当然使用更加简单SVGs? :) 谢谢!


编辑:

是的,则要切换到PNG图像,他们让路更好的FPS率。

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

PNG仅= 35 ... 40 + FPS

PNG具有缩放= 32 ... 37+ FPS

PNG与缩放&旋转= 27+ FPS

enter image description here

回答

1

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

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

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

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

EDIT2:当我有旋转和(当用户放大或出 )缩放它们

与PNG图片的问题开始

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

Libgdx Box2D的

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

+0

感谢您的回答,当我必须旋转和缩放PNG时(用户放大或缩小时),PNG的问题才会开始......另一方面,旋转可以通过将SVG的所有可能的旋转角度一个大精灵......但是缩放... –

+0

>>>你应该创建一个包含所有图像的大精灵/图像集<<<你认为这可能是圆顶与图片(从SVG获得)以及?或者只有当我决定换用PNG时才应该进入它? –

+0

我有2.3的Nexus S,所以希望它不是太旧。它在调试中提供了20多个,平均为26-30。 22那时事情变得非常复杂。 :)你认为在JBox2d上改进使用JNI/Box2d有多好? –

1

随即,此行令我奇怪:

rlBodyImage bi = new rlBodyImage(); 

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

但是,下一行忽略图像:

bi = (rlBodyImage) b.getUserData(); 

试试这个您的循环中,而不是那些两行:

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

让我们知道,如果帮助:)

+0

谢谢!增加2-3 fps! :) –

+0

当然,唯一真正的答案是更简单的SVG,但我很高兴能够帮助! – deanWombourne

相关问题