【问题标题】:Drawing Android UI on top of GLSurfaceView在 GLSurfaceView 之上绘制 Android UI
【发布时间】:2012-12-24 15:04:00
【问题描述】:

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

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

问题:

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

这是我用来设置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);

【问题讨论】:

    标签: android glsurfaceview


    【解决方案1】:

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

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

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

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

    我将更新 UI 元素的内容(比如 TextView) 通过使用 runOnUiThread() 方法定期(每 16 毫秒)... 这是 不好?

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

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

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

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

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

    【讨论】:

    【解决方案2】:
    • 在 GLSurfaceView 上绘制 UI 元素是一种好习惯,还是直接将所有 UI 内容自己绘制到 GLSurfaceView 更好?

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

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

    • 我将使用 runOnUiThread() 方法定期(每 16 毫秒)更新 UI 元素(例如 TextView)的内容...这样不好吗?

    我觉得不错。

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

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

    【讨论】:

      猜你喜欢
      • 2014-04-22
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      相关资源
      最近更新 更多