2009-04-27 5 views
14

저는 Android 용 게임을 개발 중입니다. 계속 진행되고 있지만 원활하게 실행됩니다. 그것은 물론 사용자가 화면을 터치 할 때까지입니다.터치 이벤트가 내 Android 프레임을 파괴하는 이유는 무엇입니까?

그들은을 터치하는 동안은, onTouchEvent가 호출 (action = ACTION_MOVE, x = 0y = 0 포함) 약 한 번이 절대적으로 프레임 속도를 말살으로, 상당히 높은 우선 순위로 보이는에서 매 10 밀리 초. 터치가 끝나면 프레임 속도는 좋은 상태로 돌아갑니다. 내가 바로이

  • onTouchEvent 모든
  • 에서 구현 있지 않는 문제가 지속 onTouchEvent 반환 true을 가진 보통

  • 과 게임 onTouchEvent 핸들 입력을 가진

    • 을 시도했습니다

      세 가지 상황 모두에서.

      누구에게이 문제가 발생 했습니까? ACTION_MOVE 이벤트가 생성되는 속도를 줄이거 나 실제 이동이있을 때만 생성되도록하거나 단순히 현재 터치 위치를 가져 오는 폴링 메서드를 사용하는 방법이 있습니까? 아니면 완전히 비활성화하는 방법일까요?

  • 답변

    12

    Read이 스레드. 기본적으로 이벤트 스레드를 잠자기하려면 시스템에서 처리해야하는 많은 이벤트 (x, y 및 압력 사이에 항상 일정한 움직임이 있음)를 펌프해야하므로 잠자기를 원합니다.

    +0

    링크는 더 이상 작동하지 않습니다. –

    0

    아마도 다소 분명한 해결책 이겠지만 ... 약 1/10 만 처리하려고 했습니까? UI 스레드에서 10ms마다 트리거되는 처리를 수행하는 경우 프레임 속도가 느려질 수 있습니다. 그렇다면 카운터를 어느 정도 축적 한 다음 몇 가지 최소 임계 값을 초과 한 처리 만 수행하면 어떻습니까?

    1

    나는 너희들에 대해 을 이야기 한 모든 것을 따르도록 노력했습니다,하지만 난 당신이 제안 무엇 을 구현하는 여러 가지 방법을 시도한 후, 나는 아직도 긍정적를 달성 할 수 없었던 것을 인정해야 결과. 여러분 중 한 명이 예제 코드를 제공 할 수 있습니까? 특히, 주/UI 스레드를 잠자기 상태로 만드는 방법을 알고 싶습니다. 내 게임에 적용 할 수 있다면 Jon과 같은 폴링 모델을 으로 설정하는 방법을 알고있는 것이 좋습니다.

    내 코드는 다음과 같습니다. UI 스레드에서 :

    public boolean onTouchEvent(MotionEvent event) { 
        // Store event somewhere the game thread can see it: 
        // ... 
    
        synchronized (someObject) { 
         try { 
          someObject.wait(1000L); 
         } catch (InterruptedException e) { 
         } 
        } 
    
        return true; 
    } 
    

    및 게임 스레드에서

    :

    void myGame() { 
        while (!stopping) { 
         // ... 
    
         // Get a touch event: 
         synchronized (someObject) { 
          someObject.notify(); 
         } 
         Thread.yield(); 
    
         // ... 
        } 
    } 
    
    0

    당신은 내가이 사건과 관련을 보낼 핸들러 인터페이스를 사용하는 것이 좋습니다 수 동기화 스레드를 처리하지 않고 솔루션을 원하는 경우 데이터를 게임 렌더링 스레드에 메시지/번들을 사용합니다. 여기에 암시 된 수면 해결 방법이 여전히 적용됩니다.

    0

    이벤트에는 일반적으로 타임 스탬프 속성이 있으므로 이벤트 속도를 쉽게 계산하고 조절할 수 있습니다.

    if (currentEventTimestamp - lastEventTimestamp > 500) { 
     
    
     
        lastEventTimestamp = currentEventTimestamp; 
     
    
     
        // do something 
     
    
     
    }