5

我正在寻找显示如何使用 Android SurfaceView实现每秒 30 帧的示例代码示例?假设每一帧从位置 x 和 y 开始绘制一个圆,并且每一帧将 x 和 y 递增 1。

额外的问题:在上面我想覆盖另一个视图以显示文本内容,以便绘制的任何图形都显示在此文本内容下方。如何做到这一点?

4

3 回答 3

6

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

于 2011-01-30T20:03:28.603 回答
3

创建一个每秒执行 30 次的线程:

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

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

您需要确保该线程与表面视图的管理正确同步——例如,如果表面正在更改或被破坏,您的代码应该与线程同步,以确保线程在发生这种情况时停止运行。

当然,这确实意味着您正在对画布进行软件渲染。根据您正在做什么,这可能可以为您提供 30fps 的动画。如果没有,您将需要使用 GLSurfaceView。无论如何,您可能都想考虑使用它,只是因为它会为您处理线程部分。

于 2011-01-30T22:15:29.427 回答
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);             
}
于 2011-11-11T20:54:54.847 回答