2010-05-07 4 views
0

그냥 훌륭한 사이트처럼 보이기 시작하는 것으로 시작하고 싶습니다. 사람들이 도울 수 있기를 바랍니다.이 터치 이벤트/루프 "교착 상태"를 어떻게 수정합니까?

LunarLander에 배치 된 구조를 사용하여 사용자가 화면에서 일부 비트 맵을 드래그 할 수있는 간단한 게임을 만들려고합니다 (실제 게임은 더 복잡하지만 중요하지 않습니다). 나는 단순히 몇 가지 배열을 통해 산책과 캔버스에 비트 맵을 던졌습니다

BoardThread (an inner class of BoardView): 
run() 
{ 
    while(mRun) 
    { 
    canvas = lockSurfaceHolder... 
    syncronized(mSurfaceHolder) 
    { 
     /* drawStuff using member position fields 
     in BoardView */ 
    } 
    unlockSurfaceHolder 
    } 
} 

내 drawStuff처럼 뭔가를 LanderLander의 관련이없는 부분을 찢어, 내 자신의 비트 맵 그림을 설정합니다. 모두 잘 작동합니다. 그런 다음 터치 이벤트 처리를 시작하여 사용자가 비트 맵을 누를 때 선택되고, 사용자가 비트 맵을 누르지 않은 경우 선택 취소되며 터치 이동 이벤트 중에 비트 맵이 선택되면 비트 맵이 드래그됩니다. 나는 BoardView의 부모 인 BoardActivity에서 터치 이벤트를 듣고 BoardView로 전달하여이 작업을 수행했습니다. 예 :

In BoardView 
handleTouchEvent(MotionEvent e) 
{ 
    synchronized(mSurfaceHolder) 
    { 
    /* Modify shared member fields in BoardView 
     so BoardThread can render the bitmaps */ 
    } 
} 

이 ALSO는 정상적으로 작동합니다. 내 타일을 화면 주위로 드래그 할 수 있습니다.

그러나 앱이 처음 시작될 때마다 내 첫 번째 터치 이벤트가 트리거 될 때마다 handleTouchEvent가 동기화 된 행 (DDMS에서 볼 때)에서 실행을 중지합니다. 그리기 루프는이 시간 동안 활성화됩니다 (타이머가 화면 상에 바뀌기 때문에 말할 수 있음). 많은 수의 터치 이벤트가 파이프 라인을 통해 들어가기 전에 일반적으로 몇 초 이상 걸리고 모든 것이 다시 정상적으로 작동합니다.

드로우 루프가 싱크로나이즈 블록에서 끊임없이 들어오고 있기 때문에 이것은 나에게 교착 상태처럼 보이지 않습니다. 이것은 mSurfaceHolder에 대한 잠금을 잡기 위해 이벤트 처리 스레드를 허용해서는 안됩니까? 무슨 일 이니? 누구든지이 구조를 어떻게 개선했는지에 대한 제안이 있습니까?

일부 기타 정보 이 "중단"은 활동 시작 후 첫 번째 터치 이벤트에서만 발생합니다. 여기에는 restoreState가 호출 된 후 방향 변경이 포함됩니다. 또한 이벤트 처리기에서 syncronized 블록 내의 모든 항목을 제거 할 수 있으며 동기화 된 호출에서 끊어 질 수 있습니다.

감사합니다.

답변

0

그래서 롭 그린 (Rob Green)이 rbgrn에서 나에게 이것에 대한 정보를 좀 더 얻을 수있었습니다. 나는 동시 대기열을 사용하여 게임 이벤트에 터치 이벤트를 전달했지만 결국 saveInstanceState가 호출되었을 때 여전히 문제가 발생하여 내 게임 스레드가 반복 될 때마다 Thread.sleep (16)을 호출하고 있습니다. 고리. 전체 토론 here.

관련 문제