Android中高效的2D绘图

时间:2010-08-04 15:09:45

标签: java android performance canvas ondraw

我搜索了几个小时,但未能找到一个简明明确的问题。我有一个应用程序,我需要在屏幕上绘制一个运动场(包括所有音高线)。到目前为止,我已经扩展了SurfaceView,并且几乎复制了LunarLander演示的其余部分。 应用程序将音高绘制到正确尺寸所需的所有数据都是从插座接收的,该插座也能正常工作。但是,在onDraw()函数的那一刻,我正在绘制每帧的所有行,这会导致模拟器中的帧速率相当慢(例如~10fps)。这是我的onDraw()函数:

@Override
public void onDraw(Canvas canvas) {
canvas.drawARGB(255,0,144,0);
canvas.drawLine(canvas, getFirstLine(), mPaint);
canvas.drawRect(canvas, getFirstRect(), mPaint);
canvas.drawRect(canvas, getSecondRect(), mPaint);
...
canvas.drawRect(canvas, getSecondRect(), mPaint);
drawAnimatedObjects();
}

然后我在这个背景上绘制圆圈和不同的位置。我的问题是如何提高效率?有没有办法可以在应用程序初始化时绘制线条,而不必每帧都重绘它们?

感谢您的帮助。

2 个答案:

答案 0 :(得分:12)

你绝对应该缓存任何在初始化时不会改变为位图的画布,然后在onDraw()中绘制该位图。这将有助于渲染时间。类似的东西:

Bitmap mField = null;

void init()
{
  mField = new Bitmap(...dimensions...);
  Canvas c = new Canvas(mField);
  c.drawRect(...);
  ...
}

void onDraw(Canvas c)
{
  c.drawBitmap(mField);
}

答案 1 :(得分:0)

您的运动场是否静止或是否在屏幕上滚动? 如果它是静态的,您应该考虑将其构建一次并将其保存为每次重绘的图像。 另一件事:与现代设备相比,仿真器非常慢。您应该至少在G1或更高版本上检查您的性能,以验证真实性能。