【发布时间】:2018-11-11 19:53:12
【问题描述】:
我有一个使用 OpenGL 的简单 Android 应用程序(通过 GLSurfaceView)。 代码如下:
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyGLSurfaceView(this));
}
class MyGLSurfaceView extends GLSurfaceView implements GLSurfaceView.Renderer {
MyGLSurfaceView(Context context) {
super(context);
setEGLContextClientVersion(2); // OpenGL ES 2.0
setRenderer(this); // callbacks go to this class
setRenderMode(RENDERMODE_WHEN_DIRTY); // draw on request
}
public void onSurfaceChanged(GL10 gl, int width, int height) { }
public void onSurfaceCreated(GL10 gl, EGLConfig config) { }
public void onDrawFrame(GL10 gl) {
/* if (startup) do_only_once(); */
try { Thread.sleep(250); } catch (Exception ignored) { }
}
}
}
在应用程序启动时onDrawFrame()(GLSurfaceView.Renderer)大多数时候调用了两次。 据我所知,onSurfaceChanged()(GLSurfaceView.Renderer)应该调用onDrawFrame(),但我不明白为什么发生多次。
我想计算和绘制一些“背景”对象,应该只做一次。我使用 setRenderMode(RENDERMODE_WHEN_DIRTY)。但是 onDrawFrame() 仍然被调用了几次。 我怎样才能让它只被调用一次?这种重复调用的原因是什么?
在每个函数的开始和结束时为这些函数(以及一些默认的 Activity 回调)添加日志记录将导致下面的输出。活动生命周期似乎工作正常:
// Example of function with Logging:
protected void onCreate(Bundle savedInstanceState) {
Log.d("__DEBUG__", "onCreate() {");
super.onCreate(savedInstanceState);
setContentView(new MyGLSurfaceView(this));
Log.d("__DEBUG__", "onCreate() }");
}
22:12:46.361 __DEBUG__: onCreate() {
22:12:46.376 __DEBUG__: MyGLSurfaceView() {
22:12:46.376 __DEBUG__: MyGLSurfaceView() }
22:12:46.430 __DEBUG__: onCreate() }
22:12:46.431 __DEBUG__: onStart() {
22:12:46.431 __DEBUG__: onStart() }
22:12:46.432 __DEBUG__: onResume() {
22:12:46.433 __DEBUG__: onResume() }
22:12:46.498 __DEBUG__: onSurfaceCreated() {
22:12:46.498 __DEBUG__: onSurfaceCreated() }
22:12:46.498 __DEBUG__: onSurfaceChanged() {
22:12:46.498 __DEBUG__: onSurfaceChanged() }
22:12:46.498 __DEBUG__: onDrawFrame() {
22:12:46.748 __DEBUG__: onDrawFrame() }
22:12:46.754 __DEBUG__: onDrawFrame() {
22:12:47.004 __DEBUG__: onDrawFrame() }
【问题讨论】:
-
@muradm,我的 Activity.onCreate() 工作正常(根据日志只调用一次),问题是关于 GLSurfaceView 生命周期。
-
根据记录,一切都被调用了两次。并且您的
GLSurfaceView在onCreate()方法中初始化。所以如果它被调用了两次,那么onCreate()被调用了两次。否则你也在其他地方初始化GLSurfaceView,这在代码sn-ps中没有说明。 -
@muradm,对于日志记录,我在 func_name() 和“func_name() 开头使用了“func_name() {” }”结尾。它表明 new onDrawFrame() 仅在前一个结束后调用。
-
@muradm,添加了一个日志记录示例。每个函数应打印 2 次span>
标签: android opengl-es glsurfaceview