0

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

  1. 画开始了,有些东西画好了
  2. 事件中断绘图并导致逻辑更新
  3. 以不一致的逻辑继续绘图

我仍然没有找到明确的答案:是或否。因为如果这种代码:

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

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

4

1 回答 1

0

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

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

它看起来确实是线程安全的——虽然有点有趣:我在 SurfaceView 中的日志记录代码,放在 queueEvent 之前,总是被双重调用:首先在触摸的那一刻,然后在触发 Renderer 的事件处理程序之前。

    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);
                        }
                    });
                }
于 2013-11-28T14:26:09.630 回答