【问题标题】:to Draw() or DrawBitmap()?Draw() 还是 DrawBitmap()?
【发布时间】:2011-11-29 03:17:49
【问题描述】:

我的应用程序在连续循环中绘制到画布上,并且在每个循环中重新评估可绘制对象的位置并循环它们以进行动画处理。我的问题是以下两种方法中哪一种更好,为什么?我是一个初学者,所以我不知道如何对方法进行基准测试和类似的东西,所以如果你可以,或者你已经有了,我会很感激你的意见。

第一种方法(我正在使用的方法)是为 png 资源分配一个 Handle 作为 Drawable。然后每次我想绘制我调用的对象时:

Drawable.setBounds(x,y,x,y);
Drawable.draw(canvas);

我的问题是(在构造函数中)将资源解码为位图,然后将其缩放到适当的大小是否会更快。然后在每个循环上通过以下方式绘制资源:

canvas.drawBitmap(DrawableName, 0, 0, null);

我问的原因是我的应用程序占用了数百个资源,因此更改一些资源并不足以说明区别,我想知道在大修之前这样做是否会明显更快编码。无论如何,我需要以某种方式提高性能,因此也欢迎任何其他好的想法。

【问题讨论】:

标签: java android animation drawable drawbitmap


【解决方案1】:

一般来说,绘制位图比绘制正确的准备更快,绘制位图只是将内存转储到屏幕上。如果您需要绘制缩放位图,则使用createScaledBitmap 将其绘制为一个,而不是创建它然后缩放它。您可以通过以下方式实现:

Bitmap myBitmap = BitmapFactory.decodeFile(myFile.getPath());
myBitmap = myBitmap.createScaledBitmap(myBitmap, width, height, true);

The Android developers documentation on the above function

在运行时计算和绘制图元会进行计算,并且在绘制许多图元时会降低性能,因此请尽可能使用更多位图 - 但要小心进行过早优化 - 如果没有必要,创建大量位图是没有意义的不会是显着(即显着)的性能提升。

【讨论】:

  • 感谢您的帮助,也感谢您的上述评论。我想我可能不得不这样做。我创建了一个 fps 计数器,发现我在某些地方以低于 20 fps 的速度触底,通过消除主循环中的绘图,fps 上升到超过 5000,告诉我绘图在我的应用程序中很重,需要优化。因为物理计算仅在绘制最后一帧后完成,所以我将循环限制为仅在 33 毫秒过去后进行下一次迭代。这意味着我将动画限制为 30 fps,无论设备完成绘制序列的速度有多快......
  • ... 如果设备能够在 33 毫秒内完成单个循环,这可以使每个设备的物理特性保持一致。如果不是整个游戏只是滞后,直到处理器赶上。我正在考虑添加一个跳帧功能来帮助解决速度较慢的设备上的问题,但可以通过显着加快绘图速度来避免这种情况。
猜你喜欢
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多