簡體   English   中英

當我第一次打開手機時,為什么我的OpenGL ES iPhone游戲會閃爍?

[英]Why does my OpenGL ES iPhone game flicker when I first turn on the phone?

我使用OpenGL ES為iPhone做了一個簡單的游戲。 除了這個問題,一切正常:

我完全關閉手機,然后重新打開,然后啟動我的應用程序,我得到了這個奇怪的閃爍! 每隔一幀都是正確的...不正確的幀一遍又一遍地是同一幀。 如果我退出應用程序,再次啟動它一切都很好。 如果我連續10次退出並重新啟動,那么每次都很好。

但是,如果我關閉手機,然后再打開,然后啟動應用程序,我第一次啟動應用程序時會得到同樣的閃爍。

為什么會這樣?!

有沒有其他人有這個問題?

干杯!

Apple發布了有關此問題的其他信息:

問:我的OpenGL ES應用程序閃爍。 特別是在iPhone 3GS上運行時,每一幀都會出現閃爍現象。 我該如何解決這個問題?

答:默認情況下,渲染緩沖區的內容在顯示到屏幕后會失效(通過調用-EAGLContext / presentRenderbuffer :)。 每次繪制框架時,您的應用程序必須完全重繪渲染緩沖區的內容,否則您可能會觀察到閃爍或其他意外結果。

您必須為屏幕上的每個像素提供一種顏色。 在繪圖代碼的開頭,最好使用glClear()來初始化顏色緩沖區。 在幀開始時全屏清除每個顏色,深度和模板緩沖區(如果您正在使用它們)通常也可以提高應用程序的性能。

如果應用程序需要在幀之間保留可繪制內容,則可以將選項kEAGLDrawablePropertyRetainedBacking = YES添加到CAEAGLLayer對象的drawableProperties屬性中。 使用此選項需要額外的內存,可能會降低應用程序的性能。

是否有可能在沒有進行任何OpenGL更新的情況下調用glRenderBuffer()並將presentRenderBuffer消息發送到您的EAGLContext,即沒有新的glDrawElements或glDrawArrays。 如果在沒有將kEAGLDrawablePropertyRetainedBacking設置為YES的情況下執行此操作,則可能會出現煩人的閃爍。

查看CAEAGLLayer的drawableProperties屬性中的kEAGLDrawablePropertyRetainedBacking。 此屬性確定可繪制曲面顯示其內容后的行為。 如果此屬性設置為NO,則不保留內容,因此不保證在顯示后保持不變。 如果將其設置為YES,則內容將保留,並在顯示后保持不變。

我相信將kEAGLDrawablePropertyRetainedBacking設置為YES會掩蓋問題,但不能修復它。

我相信這個問題與頂層緩沖區中的損壞有關,當iphone OS控制應用程序(鎖定和恢復,或警告彈出窗口)時會發生這種情況。 我也有這個問題但是沒有找到合適的修復,它似乎是場景中的一個或多個對象。 我們使用紋理圖集,並且共享紋理的其他對象似乎都沒有受到影響。 也許破壞和重新創建頂點緩沖區將解決問題。

嗯。 我沒有在iPhone上使用OpenGL做太多,但我不得不說我沒有注意到其他應用程序的這種行為。 我懷疑它與你如何切換活動幀緩沖區有關。

也許看看一些示例代碼,看看你的做法有何不同?

我在當前圖像和固定圖像之間交替閃爍/閃爍時遇到了同樣的問題......它會發生在3GS上,而不是3G,第一代或模擬器。

在我的情況下,問題是我在ESRenderer中設置上下文時引起的,但實際上沒有繪制任何內容,即在下面的代碼中[場景繪制]在某些狀態下沒有繪制任何內容。 在較舊的iPhone和Sim上,當你沒有繪制任何東西時,它似乎沒有翻轉OpenGL緩沖區......但是在3GS上它確實如此。 無論如何,我的解決方法是在我沒有繪制任何東西時停止那些狀態下的動畫(即停止調用繪圖rountine的計時器)。

- (void) draw
{
   [EAGLContext setCurrentContext:context]; 
   glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
   glViewport(0, 0, backingWidth, backingHeight);

   //Render the GLScene...
   [scene draw];

   glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
   [context presentRenderbuffer:GL_RENDERBUFFER_OES];   
}

暫無
暫無

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

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