使用immediateLayer(以及奇怪的playn日志消息)在android上的低帧率

时间:2012-08-02 14:43:05

标签: playn

我正在尝试使用PlayN在Android上顺利运行我的游戏,一切都按预期工作但我有一个非常低的帧率。 我想我可能会采用错误的方式,所以如果有人能给我一些帮助就会很棒:D。

所以我正在创建一个ImmediateLayer并清理它并在每一帧绘制每个对象,使用graphics.getImage(...)加载一次图像。我在HTC Desire(连接在调试模式下)时获得了大约10 fps,同时绘制了大约100张图像。当我添加objetcs时它会变慢。 是什么让我觉得我在做一些非常错误的事情是PlayN用这些消息发送垃圾邮件(我使用DDMS检查日志)。

  

X纹理剩余

     

Y纹理已创建

每秒出现约20次。

所以基本上我正在做这样的事情:

public void draw(Surface s){
for (Drawable d : toDraw) {
        surface.drawImage(d.getImage(), d.x, d.y, d.w, d.h); }}

在immediateLayer的渲染器中调用draw。

谢谢你的时间!

卢卡斯

修改 我在playn邮件列表上找到了一个可能的答案。 https://groups.google.com/forum/?fromgroups#!topic/playn/XJTlBgmfzaQ

尤其是那条消息

  
    

大多数瓷砖共享相同的图像,但它们的不同部分(注意     通过subImage,据我所知,它不会复制,而只是创建一个     参考图像的子部分?)。不同的子部分会导致     质地变化?

  
     

子图像将共享相同的纹理,但您必须确保   渲染共享相同纹理的所有图像。如果你   有一堆来自图像A的子图像和一堆来自图像B和   你渲染A,B,A,B,A,B,A,B,你的表现与之相同   如果你渲染了八个不同的图像。你需要渲染A,A,A,A,   B,B,B,B。

看来我情况最糟糕。

我有许多不同的纹理(比如50),它们都是不同图像的一部分,并且都是随机渲染的。我最终会得到一些接近N纹理开关的东西,其中N是我渲染的对象的数量。

当我得到一些工作时,我会更新这个:)。

编辑2:

我现在渲染100个objet指向同一个Image(所以没有纹理交换?)。我仍然在android上获得大约10 fps,调试日志仍在每帧中说:

保留1个纹理 创建了2个纹理

我觉得我错过了一些重要的事情......帮助:)。

1 个答案:

答案 0 :(得分:0)

经过一些更深入的测试后,我发现:

1)htc欲望不可能达到60 fps,即使共享相同的图像也可以绘制数百个对象。

2)附加到组图层的imageLayer似乎在android

上提供了更好的性能

3)在渲染器回调开始时调用surface.clear()(使用立即图层)大大提高了绘制的性能并删除了“纹理创建”调试日志。

4)最后通过纹理对对象进行排序并减少纹理交换次数(绘制A A A A B B B而不是A B A B A B)给了我更好的结果。

应用程序现在以30 fps的速度运行,在星系S2上以60 fps运行,在屏幕上绘制500个对象。