好吧,我一直在查看您的项目,一切似乎都很好,但我对导致帧速率下降的原因有一个想法。
您在运行时分配对象。如果你不这样做,它会让你在开始时创建所有对象,因此你应该直接注意到显着的下降(如果我的解决方案不能解决你的问题)。
也就是说;我不知道对象池是否可以解决您的问题,但您可以尝试。在构造函数中初始化对象,而不是在onTouchEvent():
new Element(getResources(), (int) event.getX(), (int) event.getY())
你应该有类似的东西mElement.add(objectPool.allocate())
,其中对象池在池中找到未使用的对象。此外,我们应该在该对象池中拥有指定数量的对象,从那里您可以检查是否是分配导致了此错误,或者是否是其他原因。
第 26 个元素的帧速率降至 25fps。
当(或者如果)你实现这个时,你应该直接看到帧速率下降(如果这不能解决你的问题),因为对象池会让你在开始时分配固定数量(例如可能100个元素?)(但你并没有在视觉上使用它们)。
另外,我在 Android 示例应用程序之一中使用了内存池模式(对象池)。在该样本中;我添加一行Canvas
on an onTouchEvent()
使用对象池(在运行时不分配)。在该源代码中,您可以轻松更改对象的总量并亲自检查并尝试。如果您想查看我的示例应用程序(和源代码),请写评论,我很乐意分享它,因为它尚未公开。我的评论在Swedish,但我想你应该能够理解,因为变量和方法都在English. :)
边注:您写道,您已经尝试(甚至成功)通过使您的Bitmap
static
。就像现在一样,您的元素具有不同的实例Bitmap
,这会让你分配一个新的Bitmap
每次你构建一个新对象时。这意味着每个对象都指向不同的Bitmap
当他们使用相同的资源时。static
是一个完全有效的解决方案(尽管神奇的数字 25 看起来很奇怪)。
This Bitmap
案例可以比作OpenGL
系统。如果您有 20 个对象,它们都应使用相同的资源,则有两种可能的解决方案:它们可以指向相同的 VRAM 纹理,或者它们可以指向不同的 VRAM 纹理(就像您不使用时的情况一样)static
),但资源仍然相同。
EDIT:
这是我的 Android 示例应用程序 http://code.google.com/p/viktor-lanner/downloads/detail?name=Memory_Pool_pattern_PART_THREE_SOURCE.zip演示了内存池。
关于您的解决方案BitmapFactory
,这可能取决于该类的工作方式。我不确定,但我认为其中之一decode...()
方法生成一个新的Bitmap
即使是同一个资源。可能的情况是new BufferedInputStream(res.openRawResource(R.drawable.icon))
正在重用BufferedInputStream
不过,从记忆来看,这是一个很大的猜测。
您应该做的(在这种情况下)是解码资源并将其引用存储在 Panel 类中,然后将该引用传递到new Element(bitmapReference, ...)
反而。这样,您只需分配一次,并且每个元素都指向同一个Bitmap
在记忆中。