在GLSurfaceView上绘制Android UI

BLO*_*LOB 8 android glsurfaceview

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

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

问题:

  • 在上面绘制UI元素GLSurfaceView或者直接绘制所有UI内容是否更好GLSurfaceView
  • 我将TextView通过使用runOnUiThread()方法定期更新UI元素(Say )的内容(每16毫秒)...这是不是很糟糕?
  • 我的游戏是否会受到Force Closes的影响?

这是测试java代码,我用它来设置RelativeLayout ... 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);
Run Code Online (Sandbox Code Playgroud)

Tim*_*Tim 3

  • 在 GLSurfaceView 之上绘制 UI 元素是一个很好的做法,还是直接将所有 UI 内容自己绘制到 GLSurfaceView 更好?

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

自己渲染所有内容是一种选择,但这样你就失去了可以从 Android UI 系统获得的所有功能。

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

对我来说听起来不错。

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

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