【问题标题】:Efficient 2D drawing in AndroidAndroid 中的高效 2D 绘图
【发布时间】:2010-08-04 15:09:44
【问题描述】:

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

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

感谢您的帮助。

【问题讨论】:

  • OpenGL ES 的性能比使用画布要好得多。如果你能走这条路,那是值得的。 API Demos 项目中也有一些 2d 绘图演示。
  • 你在真机上测试过吗?模拟器图形性能不能代表您在真实设备上看到的效果。

标签: java android performance canvas ondraw


【解决方案1】:

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

Bitmap mField = null;

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

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

【讨论】:

  • 非常感谢。这似乎无济于事。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2015-10-19
    • 1970-01-01
    • 2017-08-10
    • 2012-09-20
    相关资源
    最近更新 更多