이것은 잠시 동안 가지고 있었던 문제이며, 여기 누군가가 그것에 대해 밝힐 수 있기를 바랍니다. 안드로이드 GLSurfaceView.Renderer가 불완전 터치 이벤트를 중단하고 있습니다.
나는 렌더링이 같은 설정의 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()
전화가 걸려 오는 문제가 있음을 알게되었습니다. touch 이벤트가 완료되지 않았기 때문에로드를 아직 완료하지 않은 객체를 렌더링하려고 시도하기 때문에 일부 오류가 발생합니다.
네이티브 코드 자체에 문제가있을 수 있지만 지금까지 문제를 찾을 수 없었기 때문에 자바 코드가 touch
에 대한 호출을 방해하고 또 onDrawFrame()
을 호출 할 가능성이 있는지 물어보고 싶었습니다. 완료하기 전에.
예,이 정확히 문제였다 밝혀졌다 : 터치 및 렌더링 스레드 사이에 충돌이 있었다. 이 링크의 도움으로 해결 http://developer.android.com/reference/android/opengl/GLSurfaceView.html –
@NickGotch 솔루션에 대해 자세히 설명해 주시겠습니까? 나는 내가 여기 정확히 똑같은 문제를 겪었다 고 생각한다. 그리고 어떤 추가적인 세부 사항도 훌륭 할 것이다! –
내 View의 onTouchEvent() 메서드에서 터치 좌표를 가져오고 직접 BaseLib.touch (x, y)를 호출하여 처리하는 대신 Runnable을 통해 호출합니다. 기본적으로 queueEvent (new Runnable() {public void run() {BaseLib.touch (x, y);}})를 호출합니다. –