2011-04-14 37 views
0

我正在开发一个将绘制模拟时钟的动态壁纸应用程序。到目前为止,我已经达到了使用三个位图绘制时钟的程度:拨号,时针,分针。在画布上绘制旋转的位图很慢:还有其他选项吗?

当我画小时和分钟我做这样的(伪代码):

// without this it looks weird after rotate 
Paint smoothPaint = new Paint(FILTER_BITMAP_FLAG); 
canvas.drawBitmap(dialBitmap, 0, 0, null); 

canvas.rotate(ANGLE_FOR_HOUR_HAND, w/2, h/2); 
canvas.drawBitmap(hourBitmap, 0, 0, smoothPaint); 

canvas.rotate(ANGLE_FOR_MINUTE_HAND, w/2, h/2); 
canvas.drawBitmap(minuteBitmap, 0, 0, smoothPaint); 

这工作,除了我得到一个非常低帧率好:约13帧。 如果我关闭位图过滤,它会增加到约24 fps,但对我而言仍然很低。

我知道在Canvas上绘制的2D图不会以任何方式加速,但仍然想要问有没有其他选项可以加速此代码?以某种方式本地绘制位图?也许还有其他的东西?

利用OpenGL是一种选择,但由于其LiveWallpapers不那么简单不支持GL绘图,所以我需要使用第三方黑客(我知道存在)对于我宁愿不做......

回答

2

“其他选项?”你问。你有两个:

  1. 不要使用位图。例如,第二个Cube SDK示例弹出了一个以25 fps旋转的20行十二面体。
  2. 正如你所提到的,你有时可以在动态壁纸中使用“黑客”来制作特殊用途的图形。我建议你至少要看看以下三个...你可能会发现它们有用一天:AndEngine(有一个动态壁纸扩展),LibGDX(允许你在桌面环境中的原型;动态壁纸设施仍在开发中,以及GLWallpaperService(专门设计用于将GLSurfaceView带入动态壁纸)。

在你的文章中,你说24fps对你来说“仍然很低”。我的理解是24fps大约是人类感知的极限(无论如何,这是Flash默认使用的)。为了延长电池的使用寿命,我建议你不要更高,即使可以。

编辑:另一个“黑客”考虑:renderscript。这就是许多手机配备的复杂壁纸(银河,草地,水)的工作原理。看到renderscript在这里启用java文件:https://android.googlesource.com/platform/packages/wallpapers/Basic/+/master/src/com/android/wallpaper

+0

感谢您的回复:)编号1)不计数,我的意思是“其他选项”为这个确切的设置 - 显示旋转图像: )2)你提供了一个非常好的信息,谢谢。我会看看AndEngine。我已经知道GLWallpaperService,已经使用过了,正如我所说的,我现在不想使用它 - 我要求在2D Canvas中提供选项。关于libgdx + livewallpapers的非常有趣的信息 - 我知道那个很好的lib,它对于它的支持真的很酷:)如果你对我发现的更多东西感兴趣,可以增加fps,请参阅我自己的答案:) – dimsuz 2011-04-17 17:04:42

+1

@dpimka刚刚编辑的答案,以添加renderscript到“黑客”的全景。可能没有用于你目前的目的,但有些事要熟悉......祝你好运。 – 2011-05-13 17:51:04

1

如何在每次分针更改时将手形配置渲染到中间位图,然后将每个帧的静态位图渲染到画布上?

+0

是的,谢谢。我也考虑过这个问题,这样可以,但我想添加一个不断动画的二手作品(对不起,忘了提及这个)。而且分针每秒会提前一小部分 - 我精确计算其位置(旋转到浮动角度)。所以看来,我仍然需要旋转他们几乎所有的每一帧... – dimsuz 2011-04-14 17:23:22

+0

我刚刚发现了一件事,帮助我:减少手位图的大小。早些时候,他们的屏幕尺寸与周围的透明像素。剪掉这些透明像素后,旋转变得更有效率(如预期的那样)。 – dimsuz 2011-04-14 17:34:25

0

发现几件事情,有助于提高帧速率,将张贴在这里的回答为自己:)

首先是使用Canvas.drawBitmap(位图,矩阵,油漆)超负荷供应矩阵,而不是使用canvas.save() + canvas.rotate() + canvas.restore() - 效率更高。

第二:减小位图的大小。早些时候,他们被填充到接近屏幕尺寸的hdpi(480pix),并在其周围添加了透明像素。剪掉这些透明像素并修改了渲染代码来解决这个问题后,旋转变得更加高效(如预期的那样)。

+0

使用Canvas.drawBitmap(Bitmap,Matrix,Paint)旋转480x480位图需要多长时间?它带我约10mS在双核1 GHz Cortex-A9似乎slooow – steveh 2014-07-13 03:34:57