这是一个我已经有一段时间的问题了,我希望这里有人能给我一些启发。
我有一个安卓游戏,它加载了一个GLSurfaceView,它的渲染器是这样设置的:
public class GameRenderer implements GLSurfaceView.Renderer
{
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
BaseLib.init(); // Initializes the native code
}
public void onSurfaceChanged(GL10 gl, int width, int height)
{}
public void onDrawFrame(GL10 gl)
{
BaseLib.render(); // Call to native method to render/update the current frame
}
}
视图如下所示:
public class GameView extends GLSurfaceView implements SurfaceHolder.Callback
{
private GameRenderer _renderer;
private GameListener _listener;
public GameView(Context context)
{
super(context);
this._renderer = new GameRenderer();
setRenderer(this._renderer);
this._listener = new GameListener();
BaseLib.setListener(this._listener);
}
public boolean onTouchEvent(final MotionEvent event)
{
int action = -1;
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN: action = 0; break;
case MotionEvent.ACTION_UP: action = 1; break;
case MotionEvent.ACTION_MOVE: action = 2; break;
}
if(action >= 0)
BaseLib.touch(action, event.getX(), event.getY());
return true;
}
}
我一直在跟踪本机代码,我注意到一个问题,在touch
事件中途,似乎正在进行另一个render()
调用。因为触摸事件还没有完成,所以它最终会产生一些错误,因为它试图渲染还没有完成加载的对象。
这可能是本机代码本身的问题,但由于到目前为止我还没有找到问题所在,所以我想问一下,Java代码是否可能中断了对touch
的调用,并在完成之前调用了另一个onDrawFrame()
。
发布于 2011-02-26 21:10:31
触摸事件和渲染发生在两个不同的线程上。你必须正确地同步你的数据读/写。
发布于 2012-03-09 19:37:22
这里的解决方案是,无论何时捕获触摸事件(发生在UI线程上),都会将相同的事件作为runnable放入GLSurfaceView中,因此它将在GLSurfaceView的渲染器线程上以正确的顺序执行。示例代码:
@Override
public boolean onTouchEvent(MotionEvent event)
{
if (event != null)
{
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
if (mRenderer != null)
{
// Ensure we call switchMode() on the OpenGL thread.
// queueEvent() is a method of GLSurfaceView that will do this for us.
queueEvent(new Runnable()
{
@Override
public void run()
{
mRenderer.switchMode();
}
});
return true;
}
}
}
return super.onTouchEvent(event);
}
有关此问题的更多信息的教程:
http://www.learnopengles.com/listening-to-android-touch-events-and-acting-on-them/
https://stackoverflow.com/questions/5129580
复制相似问题