2013-07-17 3 views
-2

안녕하세요. 그래서 화면에 그리는 화면을 사용하는 1 개의 스레드가 있고 화면의 개체 위치를 업데이트하는 다른 스레드가 있습니다. 이러한 작업을 같은 속도로 실행하려면 어떻게해야합니까?UI 동기화 스레드 및 주말 스레드

+2

* 같은 속도로 * 무엇을 의미합니까? – m0skit0

+0

개체 위치가 그려지는 속도로 업데이트하려고합니다. – MikeT

+2

그리기 스레드의 위치를 ​​업데이트하십시오. – m0skit0

답변

1

이 트레이드 오프 :

  • 모든 모션이 매끄럽게 나타나는 것처럼 화면을 충분히 자주 업데이트하려고합니다.

    1. 작업 말 스레드가 가치 변경이있는 경우를 나타내는 플래그를 설정 :
    2. 당신은 주력 스레드

쉬운 솔루션은이 같은 것입니다에 가능한 한 많은 CPU를주고 싶어 다시 그리기.

  • UI 스레드 당신은 작업자 스레드의 컨텍스트에서 핸들러를 작성해야합니다 후, 운영체제를 Handler

    를 사용 .post 호출 조금이

    do { 
        renderScreen(); 
        while (!screenNeedsRedrawing) { 
         Thread.sleep(10); 
        } 
    } 
    
  • +0

    비판적이어서는 안되지만 짧은 시간 동안자는 것이 좋습니다. OS에 대해 너무 많은 컨텍스트 스위치를 강제 실행하여 앱의 성능을 끌어 내려야합니다. while 루프를 waitObject.wait()로 대체 할 동기화 된 객체를 사용하는 것이 더 좋을 것이며 작업자 스레드가 완료된 후에는 렌더링 스레드를 계속할 수있는 waitObject.notifyAll()을 호출합니다. 이렇게하면 작업이 모두 완료 될 때까지 OS가 UI 스레드를 포 그라운드로 가져 오는 것을 방해하지 않습니다. 잠을 자면 반복적으로 시도하고 다시 넣어야합니다. – user1132959

    +0

    나는 당신의 코멘트에 대해 생각 해왔다. 비록 내가 정말로 뭔가 할 일이있을 때 잠자는 깨우기를 원한다는 것에 동의 하겠지만 스레드가 게임에서 화면 렌더링을하고있을 때 정말로 최소 FPS 속도로 무언가를하십시오. 그래서, 아마도 10은 너무 짧지 만 100은 너무 길어질 것입니다. 화면은 10 초마다 다시 렌더링되기 때문에 사용자 경험이 좋지 않습니다. 아마도 25 (40Hz)가 좋은 절충안이 될 것입니까? –

    +0

    당신은 좋은 지적을하고 25는 좋은 타협이 될 것 같습니다. 좋은 숫자를 찾으려면 약간의 실험이 필요할 것입니다. 개인적으로 대기 핸들을 사용하여 동기화 할 때와 같은데, 준비가되었을 때만 깨울 것입니다. – user1132959

    1

    매우 간단합니다, 당신이 그것을 업데이트 할 때마다 바로 핸들러 또는 방법 runOnUiThread을 사용하여 메인 스레드에 대한 콜백을 작성하고 작업자 스레드에서 UI를 업데이트

    1

    같은 흐름을 가지고()를 호출하려는 실행 파일로 대체하십시오. 그릴 때마다이 작업을 수행하면 업데이트 스레드가 작업자 스레드에 게시됩니다. 이제는 업데이트가 완료 될 때까지 그리기 스레드를 잠그고 스레드 안전 변수와 같은 것이 있으면 그리기 스레드가 업데이트를 마칠 때까지 기다려야 할 수 있습니다.