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 fps。如果我关闭位图过滤,它会增加到大约 24 fps,但对我来说仍然很低。

我知道 Canvas 上的 2d 绘图并没有以任何方式加速,但仍然想问我是否有任何其他选项可以加快此代码的速度?以某种方式本地绘制位图?也许还有别的?

使用 OpenGL 是一种选择,但它并不那么简单,因为 LiveWallpapers 不支持 GL 绘图,所以我需要使用 3rd 方黑客(我知道存在)来做我不想做的事情......

4

3 回答 3

2

“还有其他选择吗?” 你问。你有两个:

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

在您的帖子中,您说 24 fps 对您来说“仍然很低”。据我了解,24 fps 大约是人类感知的极限(无论如何,这是 Flash 默认使用的)。我建议你不要再往上走,即使可以,以保持电池寿命。

编辑:要考虑的另一个“黑客”:renderscript。这就是许多手机附带的一些复杂壁纸(银河、草、水)的工作原理。在此处查看启用 java 文件的渲染脚本:https ://android.googlesource.com/platform/packages/wallpapers/Basic/+/master/src/com/android/wallpaper

于 2011-04-15T20:14:42.707 回答
1

每次分针变化时将您的手形配置渲染到中间位图,然后在每一帧上将该静态位图渲染到画布上如何?

于 2011-04-14T16:51:55.597 回答
0

发现一些有助于提高帧速率的东西,将在这里发布作为我自己的答案:)

首先是使用Canvas.drawBitmap(Bitmap, Matrix, Paint)重载来提供矩阵,而不是使用canvas.save() + canvas.rotate() + canvas.restore() - 更有效。

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

于 2011-04-14T17:38:40.370 回答