chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

游戲卡頓元兇竟然是 Draw Call!

穎脈Imgtec ? 2025-11-04 10:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文轉(zhuǎn)自:字符無限科技

玩游戲時遇到畫面掉幀、操作延遲,大概率和一個叫Draw Call的指標有關(guān)。它是游戲渲染的核心環(huán)節(jié),也是性能優(yōu)化繞不開的坎,哪怕是Unity、UE 引擎的資深開發(fā)者,也得在它身上下功夫。


什么是Draw Call?

Draw Call僅僅是一條指令!Draw Call指令從CPU傳到GPU,渲染一個網(wǎng)格。指令只指向一個被渲染的網(wǎng)格并且不包含任何材質(zhì)信息。

在發(fā)出指令后,GPU的渲染狀態(tài)值(材質(zhì)、紋理、shader等)和所有的頂點數(shù)據(jù)通過神奇的代碼轉(zhuǎn)化為以一個信息,然后再在你的屏幕上呈現(xiàn)出美麗的畫面。

2755d8a8-b929-11f0-8ce9-92fbcf53809c.png

渲染就是在做一個巨大數(shù)量的小任務,比如計算成千上萬的頂點和在屏幕上繪制以百萬計的像素。

Draw Call 本身的含義很簡單,就是CPU調(diào)用圖像編程接口,如OpenGL 中的glDrawElements 命令或者DirectX 中的DrawlndexedPrimitive命令,以命令GPU 進行渲染的操作。

其核心流程包含三個階段:

數(shù)據(jù)準備:CPU將網(wǎng)格數(shù)據(jù)、紋理、材質(zhì)屬性等資源從內(nèi)存(RAM)傳輸至GPU顯存(VRAM);

狀態(tài)配置:設(shè)置渲染管線狀態(tài)(如著色器、混合模式、深度測試)和全局參數(shù)(如光照、投影矩陣);

指令提交:調(diào)用glDrawElements或DrawIndexedPrimitive等API觸發(fā)GPU渲染。

關(guān)鍵特性:


命令緩沖區(qū)機制:CPU與GPU通過Command Buffer實現(xiàn)異步通信,CPU寫入指令,GPU按隊列順序執(zhí)行;

渲染狀態(tài)切換成本:每次材質(zhì)、紋理或著色器變更需重新配置全局狀態(tài),產(chǎn)生額外開銷。

你在游戲里看到的每棵樹、每個角色、每道特效,背后都需要 CPU 發(fā)一次(或多次)命令,告訴 GPU “該畫這個東西了”。比如屏幕上有 100 棵樹,默認情況下可能就有 100 個 Draw Call,GPU 收到命令后才會執(zhí)行渲染操作。

這里要明確一個關(guān)鍵點:Draw Call就是一個命令,它的發(fā)起方是CPU,接收方是GPU。這個命令僅僅會指向一個需要被渲染的圖元(primitives)列表,而不會再包含任何材質(zhì)信息,這是因為我們已經(jīng)在上一個階段中完成了!

276769a6-b929-11f0-8ce9-92fbcf53809c.png

一個常見的誤區(qū)是, Draw Call 中造成性能問題的元兇是GPU,認為GPU 上的狀態(tài)切換是耗時的,其實不是的,真正“拖后腿”其實的是CPU。


為什么Draw Call 多了會影響幀率?

我們先來做一個實驗:先創(chuàng)建10000個小文件,每個文件的大小為1KB,然后把它們從一個文件夾復制到另一個文件夾。你會發(fā)現(xiàn),盡管這些文件的空間總和不超過10MB ,但要花費很長時間。

現(xiàn)在,我們再來創(chuàng)建一個單獨的文件,它的大小是10MB,然后也把它從一個文件夾復制到另一個文件夾。而這次復制的時間卻少很多!

這是為什么呢?明明它們所包含的內(nèi)容大小是一樣的。原因在于,每一個復制動作需要很多額外的操作,例如分配內(nèi)存、創(chuàng)建各種元數(shù)據(jù)等。

如你所見,這些操作將造成很多額外的性能開銷,如果我們復制了很多小文件,那么這個開銷將會很大。

渲染的過程雖然和上面的實驗有很大不同,但從感性角度上是很類似的。在每次調(diào)用Draw Call 之前, CPU 需要向GPU 發(fā)送很多內(nèi)容,包括數(shù)據(jù)、狀態(tài)和命令等。

2781696e-b929-11f0-8ce9-92fbcf53809c.png

在這一階段, CPU 需要完成很多工作,例如檢查渲染狀態(tài)等。而一旦CPU 完成了這些準備工作, GPU 就可以開始本次的渲染。

GPU 的渲染能力是很強的,渲染200 個還是2000 個三角網(wǎng)格通常沒有什么區(qū)別,因此渲染速度往往快于CPU 提交命令的速度。

如果Draw Call 的數(shù)量太多, CPU 就會把大量時間花費在提交Draw Call 上,造成CPU 的過載。

2794aca4-b929-11f0-8ce9-92fbcf53809c.jpg


如何減少Draw Call?

盡管減少Draw Call 的方法有很多,但我們這里僅討論使用批處理(Batching )的方法。

我們講過,提交大量很小的Draw Call 會造成CPU 的性能瓶頸,即CPU 把時間都花費在準備Draw Call 的工作上了。

那么,一個很顯然的優(yōu)化想法就是把很多小的DrawCall 合并成一個大的Draw Call ,這就是批處理的思想。

需要注意的是,由于我們需要在CPU 的內(nèi)存中合并網(wǎng)格,而合并的過程是需要消耗時間的。因此,批處理技術(shù)更加適合于那些靜態(tài)的物體,例如不會移動的大地、石頭等,對于這些靜態(tài)物體我們只需要合并一次即可。

當然,我們也可以對動態(tài)物體進行批處理。但是,由于這些物體是不斷運動的,因此每一幀都需要重新進行合并然后再發(fā)送給GPU,這對空間和時間都會造成一定的影響。

27a47846-b929-11f0-8ce9-92fbcf53809c.png

在游戲開發(fā)過程中,為了減少Draw Call 的開銷,需要注意:

避免使用大量很小的網(wǎng)格。當不可避免地需要使用很小的網(wǎng)格結(jié)構(gòu)時,考慮是否可以合并它們。

避免使用過多的材質(zhì)。盡量在不同的網(wǎng)格之間共用同一個材質(zhì)。

合并的網(wǎng)格會在一次渲染任務中進行繪制,他們的渲染數(shù)據(jù),渲染狀態(tài)和shader都是一樣的,因此合并的條件至少是:同材質(zhì)、同貼圖、同shader。最好網(wǎng)格頂點格式也一致。

合并本身有消耗,因此盡量在編輯器下進行合并。

確實需要在運行時合并的,將靜態(tài)的物體和動態(tài)的物體分開合并:靜態(tài)的合并一次就可以,動態(tài)的只要有物體發(fā)生變換就要重新合并。

Draw Call 作為游戲性能的關(guān)鍵指標,優(yōu)化的核心從來不是讓GPU 少畫,而是讓 CPU 少發(fā)命令。掌握批處理技巧,再注意開發(fā)中的細節(jié),就能有效減少卡頓,讓游戲畫面更流暢。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11260

    瀏覽量

    224224
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    28

    文章

    5170

    瀏覽量

    134928
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    N9H20 GPIO上電竟然是高電平,有沒有辦法解決?

    一直很納悶,GPIO上電竟然是高電平。有沒有辦法解決,是不是要改動啟動程序才能解決問題?
    發(fā)表于 01-17 08:27

    [轉(zhuǎn)帖]這樣的建站程序,竟然是免費的!

    這樣的建站程序,竟然是免費的!廢話就不多說了,大家看了圖再發(fā)表意見吧![/url][url=http://b86.net]這樣的程序,只需要,購買耐思尼克www.b86.net/?s=cartoon
    發(fā)表于 05-22 16:06

    影響PCB價格的因素竟然是這些,表示都忽略了

    影響PCB價格的因素竟然是這些,表示都忽略了
    發(fā)表于 04-09 19:41

    那種小時候游戲插接的封裝怎么畫?

    ``問下上圖中那中小時候玩的游戲游戲卡插接部分(好像就是一排長條矩形的焊盤的樣子)的封裝哪里有?``
    發(fā)表于 06-11 11:37

    【NUCLEO-F412ZG試用體驗】Nucleo412竟然是6層板

    本帖最后由 zpzdd 于 2017-2-28 09:37 編輯 看了板子的圖紙才知道Nucleo412竟然是6層板,ST真是大手筆啊
    發(fā)表于 02-28 09:36

    AD421供電問題,Vcc引腳輸出竟然是12v是怎么回事?

    電路圖,如圖所示,mosfet采用,ND2020l,VCC竟然是12v,這是怎么回事呢?如何解決?謝謝!
    發(fā)表于 09-26 15:34

    器件功耗太大,元兇竟然是它!

    不同器件的電源,直至找到真正肇事者,這時我想起不久之前的一個類似案例,那個案例的“元兇”是一個獨自掛在供電軌和地之間的LED,沒有限流電阻與之為伍。LED最終失效是因為過流,還是純粹因為它覺得無聊了,我不能
    發(fā)表于 10-26 11:44

    新創(chuàng)公司:SD搖身變游戲卡

    新創(chuàng)公司:SD搖身變游戲卡 FXI Technologies AS公司CEO Isaac van Kempen希望把任天堂的游戲卡形式引入智能手機領(lǐng)域。該公司計劃在2011年初發(fā)布內(nèi)置游戲與硬件加速器的microSD
    發(fā)表于 11-17 09:15 ?907次閱讀

    500天不,榮耀V9這次吹的有點大!

    手機一直都是安卓手機用戶的痛點,打游戲卡到爆,開應用慢到底,而各品牌對付手機的招數(shù)也不盡相同。近日,聲稱500天不
    發(fā)表于 03-10 17:31 ?2035次閱讀

    游戲畫面是什么原因

    對于廣大玩家們而言,影響游戲體驗的一大元兇,就當屬和畫面撕裂了,特別是在玩動作游戲時,
    的頭像 發(fā)表于 04-18 10:13 ?1.5w次閱讀

    高通和騰訊聯(lián)合研發(fā),通過實時雙頻Wi-Fi技術(shù)解決游戲卡問題

    在 Wi-Fi 已經(jīng)成為生活必需品的當下,Wi-Fi 是否快速穩(wěn)定甚至會影響我們的生活品質(zhì)。 比如周末在家里打一盤《王者榮耀》,如果離路由器的位置隔著一兩堵墻,可能時不時就出現(xiàn)延遲高的情況。
    的頭像 發(fā)表于 09-23 16:18 ?3416次閱讀

    Win10玩游戲卡怎么辦

    很多網(wǎng)友都說Win10下玩游戲卡,相反在Win7里就會好很多。這一方面是由你的電腦硬件決定,另一方面也和游戲版本有關(guān)。通常來說,新游戲對于Win10的兼容性會更好一些。此外在Win1
    的頭像 發(fā)表于 04-02 09:34 ?5156次閱讀

    iPhone12翻車,5G游戲卡嚴重

    很多同學的 iPhone 12 到手之后,本來高高興興 ,結(jié)果玩十分鐘游戲就會發(fā)現(xiàn),、掉幀、暗屏的問題全都出現(xiàn)了,這是買了個假 12 ? 而且這不是個例,甚至還登上了知乎熱榜第一: 根據(jù)我的實測
    的頭像 發(fā)表于 11-10 10:23 ?5905次閱讀

    你不知道的FPC,它的發(fā)展史竟然是這樣的!

    你不知道的FPC,它的發(fā)展史竟然是這樣的!
    的頭像 發(fā)表于 11-15 10:48 ?2381次閱讀

    UPS(不間斷電源)故障頻發(fā)?原因竟然是這樣

    UPS(不間斷電源)故障頻發(fā)?原因竟然是這樣
    的頭像 發(fā)表于 04-19 13:53 ?1657次閱讀
    UPS(不間斷電源)故障頻發(fā)?原因<b class='flag-5'>竟然是</b>這樣