簡體   English   中英

在Android上進行OpenGL ES 2.0渲染的最佳實踐

[英]Best practice for OpenGL ES 2.0 rendering on Android

使用到目前為止我已經使用的語言和庫,總有一個選項可以將程序的主循環(游戲或上下文始終變化的任何內容)同步到當前顯示器的刷新率。 因此,我可以選擇打開VSYNC或只是讓循環每秒執行盡可能多的次數。 我指的是SDL2,帶有GLFW的OpenGL 3.0,HTML5畫布等。

我現在正在OpenGL ES 2.0中尋找Android上類似的東西,但是到目前為止,我可以找到的所有示例代碼都只是使用了睡眠的變化,並將幀速率設置為60或30。因此,它們基本上是計算自最后一次迭代,並且僅在經過給定時間(如果每秒60幀的情況下為0.016毫秒,等等)之后才進一步前進並調用requestRender()函數。

我只是想知道是否有比這更好的選擇。 我只是擔心並不是每部手機都具有相同的屏幕刷新率,因此硬編碼任何數量似乎都不是理想的方法。 據我了解,弄清給定手機的刷新率並不是那么簡單,或者至少使用“純” Java和OpenGL是不可能的。

您需要做的就是匹配顯示器的幀頻,並根據自上一幀以來已經過的時間前進游戲狀態。 有兩種解決方法:

  1. 將BufferQueue塞滿,並依靠“交換緩沖區”背壓。

    這很容易實現:只需盡快交換緩沖區即可。 在早期的Android版本中,這實際上可能會導致SurfaceView#lockCanvas()使您進入睡眠狀態100毫秒的懲罰。 現在,它由BufferQueue加快速度,並且BufferQueue的排空速度與SurfaceFlinger一樣快。

  2. 使用編舞。

    Choreographer允許您設置在下一個VSYNC上觸發的回調。 實際的VSYNC時間將作為參數傳遞。 因此,即使您的應用沒有立即喚醒,您仍然可以准確了解顯示刷新周期的開始時間。 使用此值而不是當前時間可以為您的游戲狀態更新邏輯提供一致的時間源。

來源: https : //source.android.com/devices/graphics/arch-gameloops

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM