Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 排队事件能否中断onDrawFrame调用?_Java_Android_Rendering_Opengl Es 2.0 - Fatal编程技术网

Java 排队事件能否中断onDrawFrame调用?

Java 排队事件能否中断onDrawFrame调用?,java,android,rendering,opengl-es-2.0,Java,Android,Rendering,Opengl Es 2.0,我即将开始在我的OpenGL ES 2.0游戏中为游戏逻辑奠定基础,我非常关心只有在完成渲染后才处理事件(主要是输入事件)。我不希望发生以下情况: 画画开始了,有些东西画出来了 事件会中断图形并导致逻辑更新 继续绘制,逻辑不一致 我仍然没有找到一个明确的答案:是或否。因为如果这种代码: if(event.getAction() == MotionEvent.ACTION_DOWN){ mGLSurfaceView.queueEvent(new Ru

我即将开始在我的OpenGL ES 2.0游戏中为游戏逻辑奠定基础,我非常关心只有在完成渲染后才处理事件(主要是输入事件)。我不希望发生以下情况:

  • 画画开始了,有些东西画出来了
  • 事件会中断图形并导致逻辑更新
  • 继续绘制,逻辑不一致
  • 我仍然没有找到一个明确的答案:是或否。因为如果这种代码:

        if(event.getAction() == MotionEvent.ACTION_DOWN){
                        mGLSurfaceView.queueEvent(new Runnable(){
                            @Override
                            public void run(){
                                triangleRenderer.handleTouchPress(normalizedX, normalizedY);
                            }
                        });
                    }
    

    不足以保证绘制和处理触摸事件始终是连续的,从不交错,那么我想我必须实现一些东西来存储和处理“事件”。

    我做了一些测试,现在我非常确定事件不会中断渲染器的绘制调用,并且在这些绘制调用之间传递

    我在onDrawFrame中使用了一个2000 x 1ms=2s的总睡眠循环,同时记录了事件到达GLSurfaceView的时刻和渲染器的事件处理程序被触发的时刻

    它看起来确实是线程安全的——虽然有点滑稽:我在SurfaceView中的日志代码放在queueEvent之前,总是被双重调用:首先是在触摸的时候,然后是在触发渲染器的事件处理程序之前

        if (event.getAction() == MotionEvent.ACTION_DOWN)
                    {
                        long tmp = System.nanoTime() / 1000000;
                        Log.w("EVENT", "SurfaceView " + tmp); // executed doubly! funny stuff.
                        queueEvent(new Runnable()
                        {
                            @Override
                            public void run()
                            {                              
                                gameRenderer.handleTouchPress(normalizedX, normalizedY);
                            }
                        });
                    }
    

    我检查了当您直接调用渲染器的方法(没有queueEvent)时会发生什么,这是不好的。显然,它是来自另一个线程的方法调用,并且是纯异步的。一点也不在乎画画。