如何使用Android SurfaceView实现每秒30帧的效果?

5
我正在寻找一个示例代码,演示如何使用Android SurfaceView实现每秒30帧?假设每一帧都画一个圆,以位置x和y开始,并且每一帧将x和y增加1。
额外问题: 除了上面的内容之外,我想叠加另一个视图来显示文本内容,以便无论绘制什么图形,都会在这个文本内容下面显示。如何实现?
3个回答

6

如果你想要高帧率,你需要仔细阅读GLSurfaceView。在普通的Surface View下,你将受制于昂贵的布局计算和CPU中心渲染。使用GLSurfaceView,你可以将这些任务转移到GPU上,并且对布局进行更紧密、高效的控制。


GLSurfaceView 只加速绘图(因为您使用 OpenGL 进行绘制)。它不会消除布局计算... 实际上,在绘制过程中,甚至是常规视图层次结构的绘制过程中,都不应该发生布局计算。 - hackbod
1
它并没有消除布局计算,我说过它可以吗?绘制时不应该发生布局计算,我也没这么说过吧?然而,谈论帧率通常意味着某些东西在移动/改变,这将影响布局计算。如果您正在使用本地布局管理器,则代价很高。 - Andrew White
如果我使用GLSurfaceView而不是SurfaceView,这对电池的使用会有多大影响?如果设备没有GPU,CPU正在处理所有工作,这将对电池使用造成什么影响?最终用户并不关心CPU/GPU周期,但他们确实关心应用程序消耗了多少电池电量。我的目标是找到一种方法,它不会对电池施加过重的负担。 - ace
1
一般来说,GPU 对电池的消耗要小得多(这是从经验中得出的结论)。当然,如果设备没有 GPU 加速,则性能会受到影响,但实际上我还没有遇到过任何没有 GPU 加速的手机。此外,我认为您可以在市场上筛选出不符合最低硬件要求的设备。 - Andrew White

3
制作一个线程,每秒执行30次以下步骤:
  1. 调用SurfaceHolder.lockCanvas()。
  2. 在Canvas上绘制(必须完全重绘所有像素)。
  3. 调用SurfaceHolder.unlockCanvasAndPost()。
事实上,如果您的线程仅仅做这些而不尝试暂停,它将被限制在屏幕的帧率。
您需要确保这个线程与Surface View的管理正确同步--例如,如果Surface正在发生变化或被销毁,您的代码应该与线程同步以确保线程在此期间停止运行。
当然,这意味着您正在对Canvas进行软件渲染。根据您的需求,这可能足以为您提供30fps的动画效果。如果不行,则需要使用GLSurfaceView。您可能考虑使用GLSurfaceView,因为它可以为您处理线程部分。

这真的是最好的方法吗? - Derzu

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接