Unity3d花屏處理
原文地址: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
相關文章
- win10玩帝國時代3花屏怎麼回事_win10電腦玩帝國時代花屏如何處理Win10
- 視訊花屏分析
- CSS3花屏文字效果CSSS3
- 多對一處理 和一對多處理的處理
- 如何在直播中解決花屏問題?
- JSP 異常處理如何處理?JS
- windows批處理之一:字串處理Windows字串
- 影像處理或其他多媒體處理中的值溢位處理
- PHP錯誤處理和異常處理PHP
- 處理百萬級以上的資料處理
- 模板處理
- 事件處理事件
- 待處理
- Cookie處理Cookie
- gson 處理
- Office處理
- 處理交接
- clob處理
- 平滑處理
- 字串處理字串
- webgl 影像處理2---影像畫素處理Web
- APM RUEI processor處理程式hang死處理方法
- Apache Beam,批處理和流式處理的融合!Apache
- Python錯誤處理和異常處理(二)Python
- Python資料處理(二):處理 Excel 資料PythonExcel
- Python影像處理丨5種影像處理特效Python特效
- 【故障處理】一次RAC故障處理過程
- 【故障處理】CRS-1153錯誤處理
- Python自然語言處理 3 處理原始文字Python自然語言處理
- 【故障處理】ORA-19809錯誤處理
- Windows批處理學習(二)——批處理(3)薦Windows
- rust學習十、異常處理(錯誤處理)Rust
- Oracle SQL處理OracleSQL
- iframe高度處理
- Flutter | 事件處理Flutter事件
- Ruby例外處理
- JavaScript事件處理JavaScript事件
- React事件處理React事件