0

我正在尝试使用 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 个已创建纹理

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

4

1 回答 1

0

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

1) 不能指望 htc 的愿望能够以 60 fps 的速度绘制数百个对象,即使共享相同的图像。

2) 附加到组层的 imageLayer 似乎在 android 上提供了更好的性能

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

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

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

于 2012-08-05T10:15:03.770 回答