1

我的游戏在第一次启动时正确显示纹理,然后我退出并再次启动它,只显示白屏。我认为纹理加载和 android 活动生命周期存在一些问题,例如在暂停或销毁时清理东西。有趣的是它只在我运行时显示白屏,但在我调试时显示完美。请给我一些建议,谢谢。

4

3 回答 3

0

到目前为止我的经验:

  • 以二的幂创建纹理,并确保在绘制时将它们缩放和剪辑到正确的比例。
  • 可以做ALPHA_8(文字渲染)的时候不要坚持RBGA_8888
  • 在调用 OnSurfaceDraw 之前,在 OnSurfaceCreated 中做任何你能做的事情
  • 避免使用 GL11 上下文强制转换。有些事情不会起作用,例如 glColor4ub 会编译但不起作用。
  • 平衡每个组件的启用和禁用调用,将调用绘制到场景图中。
  • 预先分配你的 nio 缓冲区
  • 使用 DrawElements 但对于一个顶点的最简单的形状
  • 在尽可能多的设备上进行测试。只是不要满足于仿真器,例如非双电源在仿真器上工作但在手机上不行。
  • 如果您可以使用按需绘图。
  • 使用在 onTouchEvent 调用中等待 20 毫秒并在 onDraw 中发出通知的技巧来减少您必须处理的大量运动事件。您可以绕过 onTouchEven 并使用较低的调用来节省一些周期。
  • 尽可能多地使用纹理图集,例如绘制乐谱和文本或动画
  • 禁用花哨的渲染选项(DITHER_TEST 等),除非您渴望在纹理上进行逼真的渲染。
  • 如果您在 2D 中绘制,则禁用 DEPTH_TEST
  • 完成绑定纹理后,不要忘记调用 Bitmap.recycle()。
  • 在渲染例程中避免对象创建破坏(PointF Rect)。GC 调用会减慢您的帧速率。
  • 广泛预加载您的纹理。不要等到你在最后一分钟绘制来绑定你的纹理。如果您这样做,则延迟会很明显,最好在应用程序启动时进行。
于 2013-01-10T11:14:15.053 回答
0

您应该使用 onPause 和 onResume 方法,如果它不能解决问题,我会添加更多建议。几个月前我遇到了同样的问题。

@Override
protected void onPause() {
    super.onPause();

    mGLView.onPause();
}

@Override
protected void onResume() {
    super.onResume();

    mGLView.onResume();
}

好吧,也许:

public void onSurfaceChanged(GL10 gl, int w, int h) {
    gl.glViewport(0, 0, w, h);
}
于 2013-01-10T11:26:14.687 回答
0

您是在 onSurfaceCreated() 还是在其他地方重新加载纹理?你会希望在 onSurfaceCreated() 中有这些东西。

于 2013-02-22T02:16:12.317 回答