我想要獲得一個相當簡單的openGL ES 1程序,在那裏的兩臺設備上運行平滑穩固的60fps,並且我陷入了HTC的渴望。手機本身速度快,速度快,功能強大,整體使用起來很輕鬆;然而,我似乎無法用OpenGL在60fps全屏顯示任何東西。在與我的應用程序長時間陷入困境後,我決定使用代碼直接從文檔中創建示例代碼來測試應用程序。HTC Desire特定的OpenGL ES 1幀率 - 無法正確對比
這是我在做什麼。使用GLSurfaceView簡單初始化代碼。我有三個版本的onDrawFrame,都很簡單。一個是空的。一個只包含glClear。一個只包含足夠的狀態來繪製一個全屏四元組。跟蹤時間前後。在我的程序中除了我的GLSurfaceView以外沒有任何視圖。我無法解釋我得到的時間。
在所有情況下,onDrawFrame函數本身總是在2ms以下完成。但很多時候,onDrawFrame在30〜40ms之前不會再被調用,我的幀速率一直降到30fps或更低。 我用空的onDrawFrame獲得50fps,用glClear獲得45,用quad獲得35。 相同的代碼在HTC Magic上以60 fps運行,在Samsung Galaxy S上運行在Sharp ISO1上。因爲它的屏幕,索尼Experia X10以30fps的速度上限。我已經在HTC Magic上以60fps的速度完成了更爲複雜的場景,這是很與Desire相比動力不足。我沒有Nexus One方便測試。 當然,我除了緩衝區交換阻塞幾毫秒。但它只是一直跳過幀。
試圖找出手機在做什麼外部的onDrawFrame處理程序,我試圖使用Debug.startMethodTracing。我無法通過跟蹤來反映手機花費在循環中的實際時間。 在onDrawFrame結束時,我使用startMethodTracing,然後將當前時間(SystemClock.uptimeMillis)保存在變量中。在下一個函數開始時,我記錄了函數上次退出後的時間差,以及stopMethodTracing。這會一遍又一遍地被調用,所以我安排停止,一旦我得到一個40 + ms暫停迭代的跟蹤。 生成的曲線上的時間標度小於2毫秒,就好像系統在我的程序之外花費了38毫秒。
我嘗試了很多東西。枚舉EGL配置並依次嘗試它們。只是爲了看看它是否改變了任何東西,我在每幀需要重繪的髒方案時切換到渲染。無濟於事。無論我做什麼,交換緩衝區14到16ms的預期差距在一半時間內將花費30 + ms,無論我做什麼,似乎設備都在等待兩次屏幕刷新。設備上的ps顯示我的應用程序約爲10%cPU,而System_server爲35%。當然,我也嘗試了明顯的,殺死其他進程,重新啓動設備......我總是得到相同的確切結果。
我沒有畫布畫的問題。
有誰知道爲什麼慾望(和僅限於慾望)的行爲是這樣的?
僅供參考,這裏是我的測試代碼如下所示:
public class GLTest extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGLView = new GLSurfaceView(this);
mGLView.setRenderer(new ClearRenderer());
setContentView(mGLView);
}
@Override
protected void onPause() {
super.onPause();
mGLView.onPause();
}
@Override
protected void onResume() {
super.onResume();
mGLView.onResume();
}
private GLSurfaceView mGLView;
}
class ClearRenderer implements GLSurfaceView.Renderer {
public void onSurfaceCreated(GL10 gl, EGLConfig config) {}
public void onSurfaceChanged(GL10 gl, int w, int h) { gl.glViewport(0, 0, w, h); }
long start;
long end;
public void onDrawFrame(GL10 gl)
{
start = System.currentTimeMillis();
if (start - end > 20)
Log.e("END TO START", Long.toString(start - end));
// gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
end = System.currentTimeMillis();
if (end - start > 15)
Log.e("START TO END", Long.toString(end - start));
}
}
你可能想考慮使用文本格式來使這個答案更容易閱讀。 – 2012-12-09 16:49:17