我正在玩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
答案 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
我不知道有多少性能提升。