哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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ù)量的小任務(wù),比如計算成千上萬的頂點和在屏幕上繪制以百萬計的像素。

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)格會在一次渲染任務(wù)中進行繪制,他們的渲染數(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

    文章

    11319

    瀏覽量

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

    關(guān)注

    28

    文章

    5253

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(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 ?953次閱讀

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

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

    游戲畫面是什么原因

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

    NVIDIA 7nm游戲卡或不會立即發(fā)布 除非AMD能改變高端市場競爭態(tài)勢

    最近有關(guān)NVIDIA下一代顯卡RTX 3080系列的消息很多,暗示N這次提升很大,CUDA核心會從現(xiàn)在5000左右暴增到8000+,性能大漲。不過這種期待有可能落空,外媒認為這跟游戲卡無關(guān)。
    的頭像 發(fā)表于 03-06 16:40 ?2356次閱讀

    Win10玩游戲卡怎么辦

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

    iPhone12翻車,5G游戲卡嚴重

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

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

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

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

    UPS(不間斷電源)故障頻發(fā)?原因竟然是這樣
    的頭像 發(fā)表于 04-19 13:53 ?2054次閱讀
    UPS(不間斷電源)故障頻發(fā)?原因<b class='flag-5'>竟然是</b>這樣
    陆良县| 大方县| 乃东县| 贵定县| 江油市| 溧水县| 台北县| 夹江县| 郓城县| 繁峙县| 榕江县| 上虞市| 班玛县| 东阿县| 普洱| 伊川县| 景宁| 安庆市| 昭通市| 磐石市| 徐闻县| 灵台县| 呼伦贝尔市| 静乐县| 京山县| 罗平县| 屏东市| 根河市| 枣阳市| 永寿县| 河北省| 丹阳市| 无棣县| 大新县| 玉门市| 柯坪县| 新巴尔虎左旗| 和硕县| 河间市| 苏尼特左旗| 湘潭市|