unity 最後一次drawcall 如何避免?

各位渲染老司機:

unity5跟unity4比較,渲染管線有了更改。通過Adreno觀察,發現 unity在調用glClear後會創建一個framebuffer綁定上去。最後會在把framebuffer blit到默認的framebuffer上去。在像素填充率比較差同時解析度較高的機型挺影響應能的。大概差10幀左右。所以想問各位老司機,有什麼思路避免這個嗎?(我現在思路是一開始把framebuffer綁成默認的,然後更改最後那次draw的VertexShader,但是shader替換成功了,frameBuffer unity會在我調用完後恢復狀態,重新綁定成新生成的。然後考慮替換openGl函數指針,但是感覺無從下手。android系統層有持有函數指針的變數,但是外圍訪問不到。其他暫時想不到思路。)求各位大牛指點迷津。


這個我還真研究過……當時在官方論壇問過這個事情 Why unity always draw a full screen quad after frame

官方的意思是不好避免,主要是版本適配和各種dirty fix...所以我最後放棄節約這個了

I dont remember fully honestly but i believe the main reasons for it were to workaround LOTS of egl context bugs/issues/"features". For example - starting with some android version lots of phones started to have the feature of "please use framebuffer directly in compositor" meaning your backbuffer alpha would be used by OS to do alpha blending with views behind yours (or with simply black backgrounds)


我的想法和 @錢康來 的答案一樣,這個東西是為了簡化unity本身的開發,上層很難避免。這麼用framebuffer相當於有一個自己的back buffer,保證不會被別的東西碰到。之後再把它刷到系統的back buffer就是了。而在有些tile-based硬體上,切換render target非常慢,有可能有個高達1ms的固定開銷。在這種情況下,多一次切換很可能就讓遊戲到不了60fps了。

這個修改的本質原因很可能是android的surface flinger。現在android的做法是app提供一個back buffer,surface flinger通過系統獲得那張圖,混合上UI的內容後畫到屏幕。按說應該把這些都畫到系統的back buffer,但為了降低能耗和提高性能,變成直接在那上面混合,並設定每一幀都不管裡面的內容。不過即便如此,其實也不需要專門一個frame buffer,但unity的人偷懶了。


之前電話unity問過類似問題 unity說現在手機硬體發展挺快的巴拉巴拉巴拉巴拉(°_°) 然後unity一生黑


又掉坑裡了……


推薦閱讀:

在U3D等引擎當道的年代,我有沒有必要學opengl/dx或者osg???
如何開始寫一個virtual globe軟體,類似於google earth那樣?
3d引擎開發需要那些技能儲備?
求實時渲染基本演算法好書推薦?
如何判定一點是否在給定頂點的不規則封閉區域內?

TAG:遊戲 | OpenGL | Unity遊戲引擎 | 渲染 |