2016-02-04 55 views
2

我試圖確定(在1毫秒內)何時在Android上發生特定的屏幕翻轉。每當畫面翻轉時,編舞者都會觸發,但無法確定實際顯示的畫面。根據https://source.android.com/devices/graphics/architecture.html,在這個過程中有幾個層次:用戶登陸緩衝區,它翻轉到三重緩衝隊列,翻轉到表面拋擲,然後翻轉到硬件。這些層中的每一層都可能會丟棄一幀,但此時我只確定如何監視用戶的陸地緩衝區。有沒有辦法監視其他緩衝區/翻轉(實時,在非根源,非自定義電話上)?在Android上確定確切的屏幕翻轉時間

我在HTC M8上觀察到意外的幀延遲(每5分鐘約1次),但Nexus 7似乎沒有這個問題。我通過使用Cedrus StimTracker(http://cedrus.com/stimtracker/)和一個光傳感器和Lab Streaming Layer(https://github.com/sccn/labstreaminglayer)來測量延遲。我曾嘗試使用eglPresentationTimeANDROID來控制屏幕翻轉的時間,但這並沒有解決問題。

請注意,我使用的是ndk,但通常我可以在需要時使用JNI訪問非ndk功能。

我關心的原因是爲了使用Android進行心理和神經學實驗,其中1 ms的精度非常可取。

回答

2

就可訪問的API而言,聽起來好像你已經找到了相關的零件。如果你還沒有,請通讀this stackoverflow item

使用編排器和外推法,您可以猜測下一次顯示刷新何時發生。在Android 5.0+設備上使用eglPresentationTimeANDROID(),您可以在需要將特定幀發送到顯示器時告訴SurfaceFlinger。假設SurfaceFlinger正確計算了所有延遲(例如「智能」面板添加的附加幀),那麼應該爲您提供可靠的時間。

(記住,所述定時是基於當顯示鎖存下一幀,而不是當所述下一幀在所述顯示器上完全可見於...的等待時間有將取決於在面板上。)

Grafika's「計劃交換」活動使用此功能,但聽起來您已經很熟悉。

當它進行交換時,顯示器發出信號的唯一方法是將dup()顯示器退出前一幀的退出柵欄fd,然後等待它。 SurfaceFlinger中的一些代碼執行此操作,值得注意的是,DispSync監視退休圍欄以查看軟件「VSYNC」是否漂移。沒有用於柵欄的公共API,無論如何用戶空間響應時間肯定可以超過1ms ......它通常比預先安排好的反應時間更好。您對非固定非定製設備的要求會造成問題。

如果你大多看到正確的行爲,但偶爾會看到一個小姐,你最好的選擇是使用systrace追查原因。

+0

謝謝法登。 「使用Choregorapher和推斷....使用eglPresentationTimeANDROID()....應該讓你得到可靠的時間。」這是我做的測試。不幸的是,它沒有導致HTC M8的可靠時機。典型的延遲隨着外推值的增加而改變,所以我知道我正確地使用了該功能。不幸的是,systrace在HTC M8上不起作用。請參閱http://stackoverflow.com/questions/32185412/unable-to-systrace-on-htc-one-m8-lollipop。如果沒有更多的工具,我們可能不得不將HTC M8推薦到科學列表中。 –

+1

每款Android設備都是特殊的雪花。根據您的要求,創建白名單可能更安全。如果你有特別的動機,你可以根植M8並安裝一個支持systrace的內核,但是有可能你會替換導致不穩定的任何組件,這對於那個設備來說很好,但是有點失敗目的。 – fadden