2011-01-30 63 views
5

我正在寻找示例代码示例,展示如何使用 Android SurfaceView每秒达到30帧?假设每个框架从x和y位置开始绘制一个圆,每个框架将x和y增加1。如何使用Android SurfaceView实现每秒30帧?

奖励问题: 除上述之外,我想覆盖另一个视图以显示文本内容,以便在此文本内容下显示任何图形。如何做到这一点?

回答

3

让一个线程执行此30次:

  1. 呼叫SurfaceHolder.lockCanvas()。
  2. 绘制到画布中(必须完全重绘所有像素)。
  3. 调用SurfaceHolder.unlockCanvasAndPost()。

事实上,如果你的线程只是坐在那里做,而不试图暂停,它将被扼杀到屏幕的帧速率。

您需要确保该线程与表面视图的管理正确同步 - 例如,如果表面正在更改或被销毁,那么您的代码应该与线程同步以确保线程停止运行有时候是这样的。

当然这意味着你正在软件渲染到画布中。根据你在做什么,这可能很好,给你30帧/秒的动画。如果没有,你需要使用GLSurfaceView。无论如何,您可能会考虑使用它,只是因为它会为您处理线程部分。

6

如果你想要高帧率,你真的需要阅读GLSurfaceView。在正常的表面视图下,您将受到费用布局计算和以CPU为中心的渲染的束缚。借助GLSurfaceView,您可以将其卸载到GPU上,并对布局进行严格有效的控制。

+0

GLSurfaceView能加速绘图(因为你使用OpenGL绘制的话)。它不排除布局计算......事实上,在绘制过程中不应该有布局计算,甚至是绘制常规视图层次结构。 – hackbod 2011-01-30 22:10:41

+1

“它不会摆脱布局计算” - 我说过了吗? “在绘图期间不应该有布局计算发生” - 我没有说我是不是?但是,谈论**帧速率**通常意味着某些东西在移动/改变,这会影响布局计算。如果你使用本地布局管理器,这将是昂贵的。 – 2011-01-30 23:32:44

2

这可能是一个古老的线程,但我认为这可以帮助其他人。 这里是一个很好的教程中,我使用surfaceView发现: http://www.droidnova.com/playing-with-graphics-in-android-part-i,147.html

这里是关于如何实现游戏环,它可以帮助限制FPS 30一篇好文: http://www.koonsolo.com/news/dewitters-gameloop/

您可以添加文字直接向您的surfaceView如果你喜欢, 下面是一个例子

public void onDraw(Canvas canvas) { 
    ... 
    // Add text 
    Paint paint = new Paint(); 
    paint.setAntiAlias(true); 
    paint.setFakeBoldText(true);    // if you like bold 
    paint.setShadowLayer(5, 5, 5, Color.GRAY); // add shadow 
    paint.setColor(Color.WHITE); 
    paint.setTextSize(30); 
    canvas.drawText("FPS: " + _fps, 10, 35, paint);    
}