我正在開發一個由多個「幀」組成的OpenGL ES 2.0應用程序(在Windows上使用angularproject進行開發)。EGL/OpenGL ES /切換上下文很慢
每個框架是一個獨立的應用程序,不應該干擾周圍的框架。框架使用OpenGL ES 2.0,通過在該框架內運行的代碼繪製。
我的第一次嘗試是爲每個幀分配一個幀緩衝區。但是有一個問題 - OpenGL的內部狀態在一幀正在繪製時發生變化,如果下一幀沒有全面重置每個已知的OpenGL狀態,則可能會產生副作用。這違背了我的要求,即每個框架應該被隔離並且不會互相影響。
我的下一個嘗試是每幀使用上下文。我爲每一幀創建了一個獨特的上下文。我正在使用共享資源,以便我可以爲每個幀創建當前幀,將每個幀渲染到自己的幀緩衝區/紋理,然後eglMakeCurrent返回到全局,以將每個紋理組合到最終屏幕。
這在隔離實例方面做得很好,但是.. eglMakeCurrent是很慢很慢。只要其中4個可以讓它花費一秒或更多的時間來渲染屏幕。
我可以採取什麼方法?有沒有一種方法可以加速上下文切換,或通過某種方式避免上下文切換每幀保存OpenGL狀態?
即使直接使用平臺提供的EGL和OpenGL ES庫,繞過ANGLE,eglMakeCurrent的問題仍存在於許多平臺上。根本問題是eglMakeCurrent通常是一個昂貴的調用,因爲EGL規範有效地要求驅動程序在eglMakeCurrent返回之前內部調用glFlush。 glFlush可以燒燬很多CPU。 EGLContext交換也在驅動程序驗證其內部GL狀態機器時發生抖動。 – Chadversary