我正在尝试使用 PlayN 让我的游戏在 android 上顺利运行,一切都按预期运行,但我的帧速率非常低。我想我可能做错了,所以如果有人能给我一些帮助,那就太好了:D。
所以我目前正在创建一个 ImmediateLayer 并清理它并在每一帧绘制每个对象,使用 graphics.getImage(...) 加载一次图像。在绘制大约 100 张图像时,我在 HTC Desire(以调试模式连接)上获得了大约 10 fps。当我添加对象时它会变慢。是什么让我觉得我做错了什么是 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 个指向同一图像的对象(所以没有纹理交换?)。我仍然在 android 上获得大约 10 fps 并且调试日志仍然在每一帧中说:
保留 1 个纹理 2 个已创建纹理
我觉得我错过了一些重要的东西......帮助:)。