Android OpenGL: GLSurfaceView.Renderer.onDrawFrame () вызывается дважды при запуске - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть простое приложение для Android, которое использует OpenGL (через 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() }
...