昨天參加了公司組織的nvdia的培訓,講了一些關於d3d的優化和可能的瓶頸所在,具體的條目就不說了,這裡說一些關於資源的lock和unlock,以及我在gl下的測試。
老師講到向draw*這類函式是將其指令放入指令佇列,帶填滿後或者強制重新整理時交給顯示卡去畫,也就是說它並不是即時的,而像對資源的lock和unlock確是即時的操作,而且cpu和gpu是平行計算的,當lock的資源正是當前gpu正在使用的資源會導致lock堵塞直到gpu使用完後才返回,也就是說不當的使用lock會造成cpu等待gpu的情形。當然d3d的lock函式有乙個標記用來告訴lock是否立即返回,使用這個標記後lock會立即返回,並且拿到資源位址,此時cpu如果向該位址寫入新的資料,但gpu也正在使用之,則將出現不可預知的效果。比如lock下乙個文理並填入新的資料,此時gpu正使用該紋理進行渲染,則使用該紋理渲染出來東西的紋理將是亂的。
我用opengl並且一直使用這麼一種方式來管理頂點buffer和索引buffer(見下面的描述),但從沒考慮過上面的提到的lock造成的堵塞,當然我用的是opengl,但我想lock這個機制應該是驅動或者顯示卡那一級的事情,d3d和gl都應該存lock的問題。
for (int indexmesh = 0; indexmesh < 100; indexmesh++)
vertex *pv = lock(); // 從共享buffer中獲得
for (int indexvertex = 0; indexvertex < 1024; indexvertex++)
pv[indexvertex] = position;
unlock(pv);
render();
如果按照之前提到的lock會被阻塞和資料交叉的問題,那麼這麼做將會出現效率下降,更嚴重的是會出現資料混亂的問題,或者畫的是最後一次填充的資料。
但是在實際使用和測試中發現這並沒有任何問題,首先說一下效率,lock和unlock只消耗0.025毫秒(當然這個和我提交的資料量關係),渲染幾乎沒有消耗(一共渲染10萬左右個面,顯示卡是nv8600gt)。而資料也沒有出現任何混亂。我沒有a卡,沒辦法進行相關測試。
莫非lock,unlock這個真的是d3d9才有的問題?
渲染優化 lock unlock
昨天參加了公司組織的nvdia的培訓,講了一些關於d3d的優化和可能的瓶頸所在,具體的條目就不說了,這裡說一些關於資源的lock和unlock,以及我在gl下的測試。老師講到向draw 這類函式是將其指令放入指令佇列,帶填滿後或者強制重新整理時交給顯示卡去畫,也就是說它並不是即時的,而像對資源的lo...
Unity 優化 渲染優化
渲染優化主要是減少gpu的壓力。1 透明效果 overdraw就是過度繪製,是指在一幀的時間內 16.67ms 畫素被繪製了多次,理論上乙個畫素每次只繪製一次是最優的,但是由於重疊的布局導致一些畫素會被多次繪製,而每次繪製都會對應到cpu的一組繪圖命令和gpu的一些操作,當這個操作耗時超過16.67...
優化網頁渲染
css檔案放在頭部載入 可以保證解析dom的同時,解析css檔案。因為,css 外鏈或內聯 會阻塞整個dom的渲染,然而dom解析會正常進行,所以將css檔案放在頭部進行解析,可以加快網頁的構建速度。假設將其放在尾部,那時dom樹幾乎構建結束,這時就得等到cssom樹構建完成,才能夠繼續下面的步驟。...