我正在尝试使用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个纹理
我觉得我错过了一些重要的事情......帮助:)。
答案 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个对象。