TBR架构的一些理解
a. 一個shader-core可以執行1024個threads (注:thread可以理解為streaming processor(sp): 最基本的處理單元),但它們不是同時執行的,而是將其分成64個warp, 每個warp有16個threads(16-wide warps),shader-core同時只能執行2個warp,如果某個warp在執行時阻塞了,調度單元就會先去執行其它warp,類似于CPU中線程調度的概念;
b. 每個warp中的threads它們才是并發執行的,所以每個shader-core真正能并發執行的thread是32個,(一個job可能被拆分執行,因為每個thread的寄存器數量有限32個,如果是過于復雜的vs可能要占用很多寄存器所以只能拆開執行);
其它補充:(源自針對移動端TBDR架構GPU特性的渲染優化,https://www.likecs.com/show-203322391.html)
7. TBR架構下什么時候真正對Tile進行渲染?
TBR一般的實現策略是對于cpu過來的commandbuffer,只對他們做vetex process,然后對vs產生的結果暫時保存(對當前Tile渲染有關的三角形保存至Tiling list或者Framedata),等待非得刷新整個FrameBuffer的時候,才真正的隨這批繪制做光柵化,做tile-based-rendering。什么是非得刷新整個FrameBuffer的時候?比如Swap Back and Front Buffer,glflush,glfinish,glreadpixels,glcopytexiamge,glbitframebuffer,queryingocclusion,unbind the framebuffer。
不使用Framebuffer的時候clear或者discard
glclear操作是可以把當前的framedata清空的;比如你一直往一個Rendertexture上繪制,過了一會當你不再使用這張rendertexture的時候(即unbind)也會觸發這些framedata的繪制,如果在你不再使用這張圖之前能夠調用一次clear,那么unbind的時候framedata就是清空的,可以減少很多不必要的繪制;因為如果不clear,那么每個tile在初始化的時候都要從dram上的framebuffer把那一塊的內容完整拷貝過來,而clear后這個初始化就變得非常簡單了,
不要在一幀里面頻繁的切換framebuffer
須知每次切換都意味著一次全量的Tile Rending;
避免大量的drawcall和頂點量
若頂點數量太大,可能會導致framedata爆炸,framedata暫時被移到其它地方存儲,嚴重影響效率,一般百萬以上的頂點量不管drawcall多少,無論shader多簡單,大部分機器都肯定會觸發這個瓶頸。
Alpha Test 和 Alpha Blending區別
Alpha Test就是在執行FS的時候,需要從一個類似Alpha Texture上讀當前像素做采樣對比,如果比較不過則直接discard,不會寫Depth;因此如果存在AlphaTest會導致FrameData失效(無法提前緩存準確的z值),最終AlphaTest之前保存的FrameData無法進行early-z,整個early-z失效;
AlphaBlending不會修改深度值,所以不影響early-z,但是它會增加對FB的讀操作。
總結
以上是生活随笔為你收集整理的TBR架构的一些理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 总结下花了大约半年的时间从零开始的uni
- 下一篇: 用画中画剪辑技巧,给每个视频添加背景图片