引擎瓶頸被確定為過多DP DIP Calls

2022-05-17 16:24:41 字數 896 閱讀 2739

這個訊息真是可喜可悲。可喜的是如果消除了dp/dip calls的瓶頸,那麼引擎能力會有大幅提高(至少是同屏三角形數目上);可悲的是要消除這個瓶頸帶來的重構代價應該不小。

下面說一下為什麼dp/dip calls會造成瓶頸。

現代pc的體系結構決定了我們在提交三角形時需要通過d3d runtime和driver。我們每一次提交三角形都要通過呼叫d3d runtime給我們的介面,而d3d runtime又會通知driver去對相關硬體做操作。如果你的場景中有10,000個三角形,但你每次只提交10多個,那麼這樣下來就會需要提交1,000次左右,也就是說呼叫1,000次左右的dp/dip。這樣d3d runtime和driver就忙於和硬體(主要應是agp匯流排和gpu)打交道,而高度優化的顯示卡流水線只是每次處理了10多個三角形就被迫全線停止,然後等待下一次啟動流水線。

這樣大部分時間都被cpu花在了愚蠢的「多次提交三角形」上,而gpu閒在那邊沒事做。gpu沒事做意味著什麼?意味著我們可以大幅增加三角形複雜度!反正gpu閒著也是閒著,每次處理10個三角形停下和每次處理100個三角形停下,差不了多少時間。還意味著我們可以用更多的vertex shader/pixel shader,反正是閒著嘛!

當然這裡不是討論如何在這些idle時間中加些什麼給gpu處理。而是:既然知道了dp/dip calls太多,怎麼去解決這個問題。

首先利用vertex buffer/index buffer。就以靜態的場景來說,當場景從磁碟載入記憶體時,把所有的頂點都讀入vertex buffer。該vertex buffer可以建立為static(或dynamic亦可)。然後每次裁剪之後,通過裁剪結果,組織生成新的index buffer。然後一舉dp/dip將它渲染出來!

這樣,再對shader/state進行管理的話(這裡就不進行討論了),將場景通過乙個dp/dip完全渲染就不再是個夢想了。

確定程序被鎖住的其他資源

確定程序被鎖住的其他資源 if exists select from master.sys.sysprocesses where spid in select blocked from master.sys.sysprocesses begin 確定程序被鎖住的其他資源 select spid 程序...

(1)確定物件被使用前已經被初始化

在物件使用之前將它初始化,對於無任何成員的內建型別,你必須手工完成此事。例如 int x 0 const char text double d std cin d 以input stream 的方式完成初始化 內建型別以外的任何其他東西,初始化責任落在建構函式身上。確保每乙個建構函式都將物件的每乙個...

c 確定物件被使用前已先被初始化

1 對於內建型物件來說,應該進行手工初始化,因為c 不保證初始化他們。2 建構函式最好使用成員初始值 member initialization list 而不是要在建構函式本體內使用賦值操作。初始列列出的成員變數,其排列次序應該是和它們在class中的生命次序相同。class aaa public...