8

对于我的游戏,我正在考虑在GLSurfaceView使用 RelativeLayout 的基础上绘制 UI 元素(用于显示已用时间的 TextView、用于暂停/重新启动游戏的按钮)......

到目前为止,我自己直接将所有 UI 元素绘制到 surfaceView,但考虑到 Android UI 提供的广泛选项(例如更改字体和颜色的字体),我决定使用它。

问题:

  • 在上面绘制 UI 元素是一种好习惯,GLSurfaceView还是直接将所有 UI 内容自己绘制到上面更好GLSurfaceView
  • 我将TextView通过使用方法定期(每 16 毫秒)更新 UI 元素(Say)的内容runOnUiThread()......这很糟糕吗?
  • 我的游戏会受到强制关闭的影响吗?

这是我用来设置RelativeLayout的测试java代码......glViewGLSurfaceView实例。

    rl = new RelativeLayout(this);
    rl.addView(glView);        
    tv = new TextView(this);
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    lp.addRule(RelativeLayout.ALIGN_TOP);
    tv.setLayoutParams(lp);
    tv.setText("FPS: 0");
    tv.setBackgroundColor(0x4060ff70);
    rl.addView(tv);

    setContentView(rl);
4

2 回答 2

3
  • 在 GLSurfaceView 之上绘制 UI 元素是一种好习惯,还是直接将所有 UI 内容自己绘制到 GLSurfaceView 更好?

如果您希望 android 布局系统提供的灵活性,那么在 GLSurfaceView 上绘制 android 控件似乎是一个好主意。警告尽管这些控件的绘制速度可能比您的 glSurfaceView 慢得多,因此请确保 UI 不需要太多图形能力来呈现并且不会更新太快。

自己渲染所有内容是一种选择,但是您会失去所有可以从 android UI 系统获得的功能。

  • 我将使用 runOnUiThread() 方法定期(每 16 毫秒)更新 UI 元素(比如 TextView)的内容……这很糟糕吗?

对我来说听起来不错。

  • 我的游戏会受到强制关闭的影响吗?

这与其他问题无关。如果您遵循正确的用法并且不会引发异常,那么您应该没问题。如果您确实导致异常,那么您的应用程序将被强制关闭(除非您正确处理异常)。

于 2013-01-10T19:06:06.107 回答
3

我目前在我正在制作的 Android 游戏中这样做,所以我想我会分享我的经验。

在 GLSurfaceView 之上绘制 UI 元素是一种好习惯,还是直接将所有 UI 内容自己绘制到 GLSurfaceView 更好?

就我个人而言,我认为使用 Android 提供的内置 UI 小部件来绘制 UI 是一种很好的做法。在某些情况下它不适合,例如,可以在游戏区域周围拖动的 UI 控件或具有复杂动画或行为的 UI 控件。

如果您喜欢按钮和 textViews,那么我推荐您建议的方法。

我将使用 runOnUiThread() 方法定期(每 16 毫秒)更新 UI 元素(比如 TextView)的内容……这很糟糕吗?

我的游戏会受到强制关闭的影响吗?

我使用相同的系统来更新我的 UI 组件。我不需要每 16 毫秒更新一次,但我当然没有任何强制关闭或无响应 UI 的问题。

如果您有很多(我说的是 10-20+)组件定期更新,那么您可能会遇到无响应的 UI 问题。

您是否需要每 16 毫秒(大约 60 FPS)更新一次视图?您可以更新基础值以保持正确的逻辑,但仅每 20-30FPS 更新一次视图以减少在 UI 线程上运行的数量(如有必要)。

我认为 UI 不需要像你的 openGL 视图那样频繁地更新,因为你没有以同样的方式到处乱跑。如果 textView 每秒更新 20 次,您仍然会感觉到它在不断变化。

于 2013-03-05T15:23:01.880 回答