国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Unity URP 小知識(shí)】SRP如何提升了性能

這篇具有很好參考價(jià)值的文章主要介紹了【Unity URP 小知識(shí)】SRP如何提升了性能。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

SRP如何提升了性能

渲染的原理

渲染過程,一般都是先設(shè)置各類狀態(tài)(設(shè)置如何清除各種顯卡中的幀緩沖,設(shè)置使用的Shader程序,設(shè)置要繪制的頂點(diǎn)數(shù)據(jù)(以及Shader中的頂點(diǎn)數(shù)據(jù)如何對(duì)應(yīng)到這些頂點(diǎn)數(shù)據(jù)),設(shè)置要使用的Uniform變量,設(shè)置面剔除,設(shè)置深度緩沖、模板緩沖,Blend混合等等),然后調(diào)用DrawCall命令來繪制。

其中設(shè)置這些狀態(tài)的過程Unity中就叫SetPassCall,而設(shè)置這些狀態(tài)的命令的性能消耗是非常高的,特別是其中從內(nèi)存?zhèn)鬏敂?shù)據(jù)到顯卡內(nèi)存中這些。

一、如何減少SetPassCall

既然SetPassCall這么耗性能,那么如何減少呢?在老版的Unity渲染流程中,可以發(fā)現(xiàn)有兩大塊可以節(jié)省很多性能:
1.在Shader使用中的很多Uniform變量,其實(shí)都是不變的(大部分時(shí)間),比如燈光那些(位置,方向,亮度之類的),相機(jī)的View矩陣、投影矩陣,以及自定義的一些也是很少變化的。這里的很少變化指的是,每一幀變化這種情況。
2.很多Uniform變量的數(shù)據(jù)只發(fā)生很小的改變,也要對(duì)這個(gè)整個(gè)Uniform進(jìn)行重新設(shè)置數(shù)據(jù)。同時(shí),Uniform變量本身也是有數(shù)量限制的。

鑒于以上原因,以O(shè)penGL為例子,他提供了一種方法來優(yōu)化上面的情況,即UBO(Uniform Buffer Object)對(duì)象與Uniform Block(Uniform塊),在DX中或者Unity中叫常量緩沖區(qū)。
即可以上傳一個(gè)全局的Uniform組合塊,他們可以在各種Shader中通用,不用每渲染一個(gè)物體,就要設(shè)置一次這些Uniform的值,同時(shí)還提供了接口來修改這個(gè)塊中的一部分值。

這樣當(dāng)渲染相同Shader的時(shí)候,將那些相同的Uniform變量組合到一起,就可以節(jié)省多次設(shè)置這些狀態(tài)值的開銷。
同時(shí)如果有部分值變化了,也可以通過只修改部分的接口,來提升整體的性能。

二、OpenGL中的UBO使用

1.設(shè)置塊布局

由于硬件不同所以在構(gòu)造uniform組合時(shí),要明確規(guī)定這個(gè)組合的數(shù)據(jù)要如何分布,所以在Shader中要明確設(shè)置布局(這里是std140布局,默認(rèn)的共享布局方式會(huì)導(dǎo)致不同的內(nèi)存分布)。

layout (std140) uniform ExampleBlock
{
    float value;
    vec3  vector;
    mat4  matrix;
    float values[3];
    bool  boolean;
    int   integer;
};

這樣在內(nèi)存設(shè)置好對(duì)應(yīng)的內(nèi)存布局后,就可以映射到對(duì)應(yīng)的顯卡內(nèi)存中。

2.創(chuàng)建并使用Uniform Buffer Object

代碼如下(示例):

unsigned int uboExampleBlock;
glGenBuffers(1, &uboExampleBlock);
glBindBuffer(GL_UNIFORM_BUFFER, uboExampleBlock);
glBufferData(GL_UNIFORM_BUFFER, 152, NULL, GL_STATIC_DRAW); // 分配152字節(jié)的內(nèi)存
glBindBuffer(GL_UNIFORM_BUFFER, 0);

這樣就可以申請(qǐng)并設(shè)置對(duì)應(yīng)的緩沖對(duì)象數(shù)據(jù),然后去填充這個(gè)數(shù)據(jù):

glBindBuffer(GL_UNIFORM_BUFFER, uboExampleBlock);
int b = true; // GLSL中的bool是4字節(jié)的,所以我們將它存為一個(gè)integer
glBufferSubData(GL_UNIFORM_BUFFER, 144, 4, &b); 
glBindBuffer(GL_UNIFORM_BUFFER, 0);

3.Shader與Uniform Buffer Object綁定

由于UBO可能有多個(gè),Shader中的Uniform Buffer Block也可能有多個(gè),所以需要一種方式來映射他們。OpenGL中使用綁定點(diǎn)的方式來映射。

UBO的綁定:

glBindBufferBase(GL_UNIFORM_BUFFER, 2, uboExampleBlock); 
// 或
glBindBufferRange(GL_UNIFORM_BUFFER, 2, uboExampleBlock, 0, 152);

對(duì)應(yīng)Shader中的綁定

unsigned int lights_index = glGetUniformBlockIndex(shaderA.ID, "Lights");   
glUniformBlockBinding(shaderA.ID, lights_index, 2);

這樣Shader中的Uniform Buffer Block就知道去哪一個(gè)UBO去取數(shù)據(jù)了,且已經(jīng)分配好布局,能搞正常拿到對(duì)應(yīng)的數(shù)據(jù)。

4.修改部分?jǐn)?shù)據(jù)

如果我們想只修改其中的一部分?jǐn)?shù)據(jù),我們可以

glBufferSubData(GL_UNIFORM_BUFFER, 144, 4, &b);

來修改一個(gè)UBO中的一部分?jǐn)?shù)據(jù)。

總結(jié)

Unity使用SRP時(shí),對(duì)我們封裝了上面類似OpenGL的一大串功能設(shè)置及相關(guān)功能,且做到各個(gè)平臺(tái)兼容。SRP Batch就是利用全局的數(shù)據(jù)緩沖的方式,以及局部修改的方式,來幫助提高渲染性能。文章來源地址http://www.zghlxwxcb.cn/news/detail-533371.html

到了這里,關(guān)于【Unity URP 小知識(shí)】SRP如何提升了性能的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Unity知識(shí)記錄--項(xiàng)目升級(jí)URP

    Unity知識(shí)記錄--項(xiàng)目升級(jí)URP

    URP是指Unity的通用渲染管線,此處主要針對(duì)原有項(xiàng)目進(jìn)行升級(jí)使用,但并不是所有的內(nèi)容都可以直接通過升級(jí)完成,直接使用的Unity默認(rèn)的shader通常可以完成直接升級(jí),自己編寫的shader通常需要重做。 首先我們先要安裝這個(gè)Package,打開Package Manager。 ? 找到我們的URP這個(gè)packa

    2024年02月08日
    瀏覽(23)
  • Unity URP渲染管線與內(nèi)置渲染管線的性能差別

    首先,我們來了解一下Unity的內(nèi)置渲染管線。內(nèi)置渲染管線是Unity較早版本中使用的默認(rèn)渲染管線,它使用的是傳統(tǒng)的圖形渲染技術(shù)。內(nèi)置渲染管線提供了一系列的渲染功能,如陰影、反射、抗鋸齒等。但是,由于其較為龐大且復(fù)雜的設(shè)計(jì),它的性能相對(duì)較低。在高質(zhì)量圖形效

    2024年02月08日
    瀏覽(34)
  • Unity中URP下實(shí)現(xiàn)能量罩(性能優(yōu)化 和 BRP適配)

    在之前的文章中,我們實(shí)現(xiàn)了URP下的能量罩效果。 Unity中URP下實(shí)現(xiàn)能量罩(扭曲流光花紋) 我們?cè)谶@篇文章中,對(duì)其進(jìn)行性能優(yōu)化 和 BRP下的適配。 我們這里把 能量罩花紋紋理 和 抓屏扭曲紋理 合并成同一個(gè)來使用,在效果上沒多大變化。但是,可以少使用一次紋理采樣。

    2024年02月01日
    瀏覽(15)
  • 如何擴(kuò)展Unity URP的后處理Volume組件

    如何擴(kuò)展Unity URP的后處理Volume組件

    Unity在更新到Unity2019.4之后,大家或許已經(jīng)發(fā)現(xiàn),在使用URP(通用渲染管線)的情況下,Unity原來的Post Processing插件好像不起效了。 原來Unity在Unity2019.4之后在URP內(nèi)部集成了屏幕后處理的功能,使用方法也很簡(jiǎn)單,直接在Hierachy視圖右鍵,選擇Volume/Global Volume,我們就可以在Hie

    2024年02月16日
    瀏覽(21)
  • 【Unity SRP】實(shí)現(xiàn)基礎(chǔ)的Temporal AA(未完)

    【Unity SRP】實(shí)現(xiàn)基礎(chǔ)的Temporal AA(未完)

    寫在前面 【技術(shù)美術(shù)圖形部分】簡(jiǎn)述主流及新的抗鋸齒技術(shù),花了點(diǎn)時(shí)間盤點(diǎn)了一些主流AA技術(shù),再在SRP下的URP管線中實(shí)現(xiàn)一下目前游戲用得比較多的TAA。參考Unity的TAA(比較容易懂)以及sienaiwun的實(shí)現(xiàn)思路,也參考了很多文章(主要是這位大佬),可以說這次實(shí)現(xiàn)其實(shí)是對(duì)

    2024年02月10日
    瀏覽(18)
  • Unity3D:提升場(chǎng)景畫面品質(zhì)&平衡性能優(yōu)化

    Unity3D:提升場(chǎng)景畫面品質(zhì)&平衡性能優(yōu)化

    在日常開發(fā)中,提升場(chǎng)景畫面品質(zhì)的同時(shí)平衡性能優(yōu)化一直是很重要且頭疼的一部分,尤其是當(dāng)場(chǎng)景類型不同及效果需求不一樣時(shí)。 所以怎么同時(shí)提升場(chǎng)景畫面品質(zhì)和平衡性能優(yōu)化呢,下面介紹一些適用度高且實(shí)用性好的設(shè)置。 介紹之前先說一下結(jié)論:怎么樣才能說的上是

    2024年02月08日
    瀏覽(95)
  • Unity GPU Skinning Tool: 提升3D游戲動(dòng)畫性能的新利器

    項(xiàng)目地址:https://gitcode.com/ForeverZack/Unity-Gpu-Skinning-Tool 在Unity引擎的世界里,Unity GPU Skinning Tool是一個(gè)強(qiáng)大的工具,它將骨骼動(dòng)畫計(jì)算從CPU轉(zhuǎn)移到GPU,顯著提高了游戲中的角色動(dòng)畫性能。對(duì)于那些需要大量3D角色與復(fù)雜動(dòng)畫的游戲開發(fā)者而言,這是一個(gè)非常值得嘗試的技術(shù)。 Un

    2024年04月25日
    瀏覽(21)
  • Unity填坑-燈光烘焙相關(guān)

    Unity填坑-燈光烘焙相關(guān)

    項(xiàng)目組對(duì)燈光烘焙那塊參數(shù)以及工作流程有一定疑問,單獨(dú)抽時(shí)間把整個(gè)機(jī)制做了一次單獨(dú)的調(diào)研,錯(cuò)漏之處懇請(qǐng)指點(diǎn)。 Unity中的Light模式分為三種: 實(shí)時(shí),混合,烘焙。 這三種要結(jié)合在Lighting設(shè)置一起工作來看。 一種是直接光照,即光直接照到物體上,反射到相機(jī)里。 二

    2024年01月16日
    瀏覽(27)
  • 【Unity 踩坑系列】項(xiàng)目升級(jí)URP/HDRP渲染管線時(shí)如何解決材質(zhì)丟失問題 (模型全部為粉紅色)

    【Unity 踩坑系列】項(xiàng)目升級(jí)URP/HDRP渲染管線時(shí)如何解決材質(zhì)丟失問題 (模型全部為粉紅色)

    在我們創(chuàng)建項(xiàng)目時(shí)候如果我們一開始使用的是默認(rèn)內(nèi)置渲染管線,后期項(xiàng)目需要升級(jí)到URP或者HDRP渲染管線時(shí)有可能會(huì)出現(xiàn)預(yù)制體材質(zhì)丟失的問題(原因是大部分資源的預(yù)制體在Unity官方推薦使用URP渲染管線之前,都只是使用默認(rèn)內(nèi)置管線的材質(zhì)。所以并不適配現(xiàn)在的URP渲染管

    2024年02月16日
    瀏覽(35)
  • 【Unity URP】URP Camera使用及動(dòng)態(tài)設(shè)置

    【Unity URP】URP Camera使用及動(dòng)態(tài)設(shè)置

    官方文檔:? ?攝像機(jī) | Universal RP | 12.1.1 https://docs.unity3d.com/cn/Packages/com.unity.render-pipelines.universal@12.1/manual/cameras.html 相機(jī)類型: Render Type(渲染類型) Base(基礎(chǔ)相機(jī)):渲染到特定渲染目標(biāo)的通用相機(jī),場(chǎng)景中必須至少有一個(gè)。 Overlay(疊加相機(jī)):將其視圖渲染在另一個(gè)攝

    2024年02月12日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包