2011-04-25 2 views
1

실시간 스레드가 실행중인 응용 프로그램에서 작업하고 있습니다.에뮬레이터 클럭이 실제 시스템 클록에 동기화 되었습니까?

내 컴퓨터가 느리고 에뮬레이터가 매우 느리게 실행됩니다. 내 응용 프로그램을 테스트 할 때 마치 SystemClock.uptimeMillis() 호출이 실제 컴퓨터 시계에서 실시간 값을 반환하는 것처럼 보입니다. 즉, 에뮬레이터의 시간은 에뮬레이터가 느리게 실행되지 않습니다.

이 직감이 맞습니까? 에뮬레이터 클록이 실제 컴퓨터 시스템 클럭에 연결되어 있다는 것입니다 (자체적으로 에뮬레이트되고 호스트 컴퓨터의 CPU 부하에 따라 변동될 수 있습니다). 명백한 질문처럼 보이지만 인터넷에서 찾을 수 없습니다.

이 경우에 적합 할 것입니다. 내가 알고 있어야 할 것은 내 스레드가 계속 유지할 수 없다는 것이 단순히 에뮬레이터의 느려짐의 징후인지 아니면 실제로 재 설계해야 하는지를 알아야하기 때문입니다. (아직 가지고 있지 않기 때문에 실제 전화로는 테스트 할 수 없습니다.)

+1

대신 System.nanoTime을 사용해 보셨습니까? –

+0

제임스 감사합니다. 그냥 똑같은 결과를 보았습니다. 나는 몇 가지 대답 (?)을 내가 아래에 게시 할거야 ... – lacinato

답변

2

나는 내 직감이 정확하다고 판단했습니다.

내가 몇 가지 간단한 테스트를 실행, 예 : 관계없이 나는 (그 사이의 10 초 무슨 짓을했는지의

long start = SystemClock.uptimeMillis(); 
Log.d("blah", "start"); 
while (SystemClock.uptimeMillis() < start + 10000) 
{ 
    // do some work-intensive stuff here 
} 
Log.d("blah", "finish"); 

... 코드 루프 내부 및/또는 의도적으로로드 할 다른 물건을 할 내 컴퓨터를 사용하여 CPU가) 쓰레드는 LogCat 타임 스탬프와 스톱워치로 판단하여로드 된 호스트 CPU가 시간 감각을 넓히지 않는다는 것을 알기 시작합니다. 예상대로 에뮬레이터에서.

이 동작을 변경하려면, 본인은 QEMU 층에 옵션을 전달하려는 있다고 생각 :

$ emulator -avd my_avd -qemu -clock vm 

을하지만 실제로는 그냥 VM을 (시작할 때 시간 설정과 함께해야 할 수있는 QEMU 분명히 currentTimeMillis(), uptimeMillis() 및 nanoTime())의 결과를 독립적으로 관리합니다. 확실하지는 않습니다 (QEMU에 대한 문서는 상당히 거친 것입니다). 그렇지만 안드로이드 QEMU는 "VM"클럭이 부족한 것처럼 보이므로 위의 기능은 작동하지 않습니다. 참고 :

$ emulator -avd my_avd -qemu -clock ? 
Available alarm timers, in order of precedence: 
unix 

하지만 적어도 내 작은 이론이 맞는지 충분한 증거를 수집했습니다. :-) 에뮬레이트 된 앱이 오디오를 재생하거나 UI 전환 효과 등을 실제 시계에 연결하지 않고 실행하는 방법을 알 수는 없습니다. 그러나 시계를 에뮬레이션하는 옵션을 갖는 것이 좋을 것입니다.

관련 문제