6

我已经搜索了好几个小时,但无法找到一个简洁明确的答案来回答我的问题。我有一个应用程序,我需要在屏幕上绘制一个运动场(包括所有球场线)。到目前为止,我已经扩展了 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();
}

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

谢谢你的帮助。

4

2 回答 2

15

您绝对应该缓存在初始化时不会更改为位图的任何画布绘图,然后在 onDraw() 中绘制该位图。这将有助于渲染时间。就像是:

Bitmap mField = null;

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

void onDraw(Canvas c)
{
  c.drawBitmap(mField);
}
于 2010-08-04T18:33:38.307 回答
0

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

于 2010-08-04T15:42:55.607 回答