2010-08-04 76 views
3

我已经搜索了好几个小时,一直没能找到简明明确的答案和我的问题。我有一个应用程序,我需要在屏幕上画一个运动场(包括所有的间距线)。到目前为止,我已经扩展了SurfaceView,并且非常复制了LunarLander演示的其余部分。 应用程序需要的所有数据将音高调整到正确的尺寸时,从套接字接收的数据也可以正常工作。然而,在onDraw()函数的最后一刻,我绘制了每帧的所有行,这在仿真器中导致相当慢的帧率(例如〜10fps)。这里是我的onDraw()函数:在Android中高效的2D绘图

@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(); 
} 

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

感谢您的任何帮助。

+0

OpenGL ES比使用画布更好。如果你可以走这条路,这是值得的。 API Demos项目中还有一些2D绘图演示。 – 2010-08-04 15:17:23

+1

你在真实设备上测试过吗?仿真器图形性能不代表您将在真实设备上看到的内容。 – adamp 2010-08-04 17:22:31

回答

10

您肯定应该缓存任何画布绘图,它不会在初始化时更改为位图,然后在onDraw()中绘制该位图。这将有助于渲染很多次。例如:

Bitmap mField = null; 

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

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

非常感谢。这似乎已经无法结束。 – 2010-08-05 08:28:34

0

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