Unity3d花屏處理

延澈左發表於2017-08-17

原文地址:http://blog.csdn.net/yanchezuo/article/details/77337755

4年前遇到的花屏問題,如今又遇到了。這次通過不斷的測試、重現、修改、反思,終於得出了最終原因和最終答案!

  • 你的介面花屏了?
    去檢查一下,你遊戲中的相機clearFlag的設定,是不是沒有clearFlag設定為SolidColor或者SkyBox的相機?
    解決方案:

    一定要有一個clearFlag設定為SolidColor或者SkyBox的相機,並且這個相機的depth為你所有相機中depth的最小值(保證這相機先渲染)

  • 原理
    Unity每個渲染幀的開始,並不會清空顏色緩衝區和深度緩衝區,是通過設定相機的clearFlag來起作用的,具體如下:

    ClearFlag 顏色緩衝區 深度緩衝區
    SkyBox 改變,設定為skyBox的顏色 不改變
    SolidColor 改變,設定為BackGround顏色 不改變
    DepthOnly 不改變 改變,清空深度緩衝

    因此,如果場景中沒有一個改變顏色緩衝區的相機,在渲染的初始幀,顏色緩衝區會保留上一幀的結果。

    在此,給一種出現花屏的現象的例項:
    場景中有兩個相機,設定分別為:

    相機 clearFlag depth Culling Mask
    gameCam depthOnly -1 GameScene
    uiCame depthOnly 1 UI

    渲染順序為:
    顏色緩衝上一幀殘留(A) -> 當前渲染幀開始 -> gameCame 渲染,修改顏色緩衝區 (B)-> uiCam渲染,修改顏色緩衝(C) -> 顯示到螢幕上.
    最終渲染的是A+B+C

  • 擴充:花屏和卡幀

    當然,如果在切換介面的時候,不卡幀,其實也不會出現花屏的現象。這一條先佔上坑,改天詳細說明。

  • 擴充:花屏和多執行緒渲染

    在我的測試中,如果開啟了多執行緒渲染,一卡幀,很容易就出現花屏。相反,不開啟多執行緒渲染,基本上是不會有花屏現象的。特別是開了垂直同步之後,cpu會等待gup渲染結束再進行下一幀的計算。
    ps.Unity3d垂直同步有個坑,和幀率相關
    垂直同步QualitySettings.vSyncCount的設定,值可以為0,1,2。

    vSyncCount 是否等待GPU渲染完成 遊戲幀率
    0 不影響幀率設定
    1 是,一個緩衝buffer 影響,強制60fps
    2 是,2個緩衝buffer 影響,強制30fps
  • 擴充:花屏和GL.Clear()

    GL.Clear()當然是可以清除顏色緩衝的。不過,由於不知道卡幾幀,每幀都設定GL.Clear()也是挺奇怪的。
    所以,在切換介面的時候呼叫一次GL.Clear()不能完全解決花屏的問題。
    GL.Clear()是使用,參見:
    http://blog.csdn.net/yanchezuo/article/details/12751917

相關文章