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

游戲引擎的cpu/gpu粒子系統(tǒng)設計思想

這篇具有很好參考價值的文章主要介紹了游戲引擎的cpu/gpu粒子系統(tǒng)設計思想。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

開篇

網上有很多篇粒子系統(tǒng)源碼解析,但是只是簡單的接口羅列,沒有從最原理出發(fā)去講清楚粒子系統(tǒng)的來龍去脈,我將從粒子系統(tǒng)的本質去講清楚它的設計理念,當理解了它的理念以后,很多粒子遇到的問題就會迎刃解決了,這篇文章主講粒子的實現和一些框架級的優(yōu)化方式,其實有很多優(yōu)化細節(jié)就不贅述

粒子系統(tǒng)的設計思想

在早期游戲發(fā)展的時候,有一些粒子效果是實現一些鼠標特效的,比如《刀劍封魔錄》中滑動鼠標后,鼠標本身就會作為一個粒子發(fā)射器,在鼠標拖動后,會產生很多粒子并隨著時間消亡,這就是最早的粒子系統(tǒng)模型

游戲引擎的cpu/gpu粒子系統(tǒng)設計思想,游戲引擎,unity,ue4,圖形渲染

?在早期的桌面系統(tǒng)中實現的粒子全是用cpu在屏幕上渲染的,如果需要世界中的3D粒子,則會將世界坐標轉換為屏幕坐標,在屏幕指定位置渲染個粒子,而且這個粒子是每一幀去更新的

我給一個imgui類型渲染系統(tǒng)的粒子偽代碼方便大家去理解,每一幀都去更新所有粒子的信息,當然現代游戲引擎粒子實現也類似于此

//定義粒子結構
struct particle

{
	float x;
	float y;
	image  img;
}

//定義粒子集合
vector<particle> particles

//設置粒子位置
void setparticlepositon(particle &p)
{
	p.x++;
	p.y++;
}

tick::update()  //每一幀更行所有需要渲染的信息
{
	for(auto i : particles)
	{    
		setparticlepositon(i);//循環(huán)更新粒子位置
		draw(i);//循環(huán)更新粒子繪制
	}
}

更復雜的話就是定義每個粒子的周期,并定義粒子發(fā)射器,另外可以在setparticlepositon中設置更復雜的更新條件

class ParticleEmitter{
protected:
    void Tick() {
        Spawn();                //生成階段:創(chuàng)建新粒子
        UpdateAndRecycle();     //更新階段:更新每個粒子的狀態(tài)數據并回收已死亡的粒子
        Render();               //渲染階段:使用粒子渲染器將粒子效果渲染出來
    }
private:
    vector<Particle> Particles;

};

萬變不離其宗,都是源于這個思想

既然有大量相同的粒子,那么結合現代游戲引擎的特性,可以用到實例化(Instancing),將相同的mesh和材質用一套,大大減少了數據量,另外也可以用GPU粒子優(yōu)化

使用幾何著色器優(yōu)化

Nvidia在2006年的GeForce 8系列中出了DirectX 10.0,并推出了幾何著色器

簡單說,就是幾何著色器可以把單個頂點擴充成多個頂點,如果粒子的mesh都一樣的話,只需要從頂點著色器中傳入的單個頂點和擴展規(guī)則,就可以生成想渲染的粒子mesh,而并不需要每回傳入大量的頂點了

使用之前:

游戲引擎的cpu/gpu粒子系統(tǒng)設計思想,游戲引擎,unity,ue4,圖形渲染

可見每個粒子需要傳入五個位置然后生成五角星?

使用之后:

游戲引擎的cpu/gpu粒子系統(tǒng)設計思想,游戲引擎,unity,ue4,圖形渲染

?想渲染一個五角星只要傳入一個頂點,就可以用幾何著色器擴充為五角星,大大減少了draw所占的帶寬

使用SMID優(yōu)化

關于smid的介紹我前面有篇文章可以看看,這里就不贅述它的原理了

使用SIMD指令加速計算_星空_MAX的博客-CSDN博客

這種情況試用語cpu對大量粒子計算和更新的情況

unreal引擎的nigara和chaos就是用這種緩存友好的內存布局,和unity的ECS架構原理一樣

游戲引擎的cpu/gpu粒子系統(tǒng)設計思想,游戲引擎,unity,ue4,圖形渲染

?寫個大概的數據結構參考一下:


//定義粒子的組件集合
vector<particle> particlesx;
vector<particle> particlesy;


//設置粒子x位置
void setparticlepositonx(particlex &px)
{
	px++;
}
//設置粒子y位置
void setparticlepositonx(particley &py)
{
	py++;
}

//定義粒子和組件集合
class particle
{
	vector<particle> *particlesx = particlesx;
	vector<particle> *particlesx = particlesy;
}

//定義粒子集合
vector<particle> particles;

tick::update()  //每一幀更行所有需要渲染的信息
{
	for(auto i : particlesx)
	{    
		setparticlepositonx(i);//循環(huán)更新粒子位置	
	}
	
	for(auto i : particlesy)
	{    
		setparticlepositony(i);//循環(huán)更新粒子位置	
	}
	
	for(auto i : particles)
	{    
	 	draw(i);//循環(huán)更新粒子繪制
	}
}

使用GPU粒子優(yōu)化

CPU粒子設計上和我上一節(jié)提到的東西大同小異,不過原來的draw是CPU去繪制,現代會把這個內容送到GPU,會調用一次drawcall,但是粒子的消耗消耗會非常大,粒子渲染的數量非常有限

這時候能不能把把粒子更新的邏輯放在gpu里面呢,當然可以了

同樣是DirectX 10.0引用了Stream Output的新特性,在OpenGL3.0中也加入了這種特性,不過在OpenGL稱為Transform Feedback,在頂點著色器或者幾何著色器之后,可以把頂點數據緩存到這個結構中,而這個結構在gpu中,這樣每回就可以根據這個信息去更新頂點信息,重新傳入頂點著色器中去做渲染

整體流程如下:

游戲引擎的cpu/gpu粒子系統(tǒng)設計思想,游戲引擎,unity,ue4,圖形渲染

?這時候就會發(fā)現GPU和cpu可以不進行數據傳輸了,粒子完成自我更新,大大減少了傳輸量和cpu的計算負擔

帶來的問題

如果用gpu粒子的話無法實時計算出剔除范圍了,因為剔除步驟在傳入頂點著色器之前,所以一開始就需要傳入效果的bounds,并預估出粒子的最大范圍,否則可能出現特效消失的問題

游戲引擎的cpu/gpu粒子系統(tǒng)設計思想,游戲引擎,unity,ue4,圖形渲染

結尾

粒子系統(tǒng)還有其他很多部分,可做優(yōu)化的部分非常多,我這里只介紹了一些粒子系統(tǒng)設計的基礎思想,其他更全面的內容網上很多,就不贅述了文章來源地址http://www.zghlxwxcb.cn/news/detail-532498.html

到了這里,關于游戲引擎的cpu/gpu粒子系統(tǒng)設計思想的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 算法設計思想——動態(tài)規(guī)劃

    算法設計思想——動態(tài)規(guī)劃

    是一種常見的算法設計方法,用于解決一類重疊子問題的優(yōu)化問題。他的基本思想是將問題分解成多個重疊的子問題,遞歸求解,并將子問題的求解緩存起來,避免重復計算,從而得到問題的解。 動態(tài)規(guī)劃通常適用于以下兩個條件的問題: 1.重疊子問題:原問題可以分解為若

    2024年02月03日
    瀏覽(22)
  • 【Spring】核心與設計思想

    【Spring】核心與設計思想

    ?哈嘍,哈嘍,大家好~ 我是你們的老朋友: 保護小周??? 談起Java 圈子里的框架,最年長最耀眼的莫過于 Spring 框架啦,如今已成為最流行、最廣泛使用的Java開發(fā)框架之一。不知道大家有沒有在使用 Spring 框架的時候思考過這些問題, 什么是框架?Spring 是什么?如何理解

    2024年02月08日
    瀏覽(27)
  • Spring 核心與設計思想

    ??作者:銀河罐頭 ??系列專欄:JavaEE ?? “種一棵樹最好的時間是十年前,其次是現在” 通常所說的 Spring 指的是 Spring Framework(Spring 框架)。 Spring 是包含多種工具方法的 IoC 容器。 IoC(Inversion of Control): 控制反轉 \\\"控制反轉\\\"又是什么意思? 下面以一個程序來舉例。 假如我

    2024年02月02日
    瀏覽(22)
  • 閃電網絡協議設計思想剖析

    閃電網絡協議設計思想剖析

    閃電網絡可能是比特幣之上部署的最受期待的技術創(chuàng)新。閃電網絡,為由 Joseph Poon 和 Tadge Dryja 于2015年首次提出的支付層,承諾支持: 用戶之間幾乎無限數量的鏈下交易, 幾乎免費, 同時利用比特幣提供的安全性。 2016年時,至少三個公司——Poon 和 Dryja 的 Lightning、 Block

    2024年03月20日
    瀏覽(27)
  • Spring框架核心與設計思想

    Spring框架核心與設計思想

    我們一般所說的Spring指的是Spring Framework(Spring 框架),它是一個開源的框架,Spring支持廣泛的應用場景,它可以讓Java企業(yè)級的應用程序開發(fā)變得更簡單,官方一點的回答:spring是J2EE應用程序框架,是輕量級的IoC和AOP的容器框架,主要是針對javaBean的生命周期進行管理的輕量級

    2023年04月15日
    瀏覽(34)
  • 從架構設計思想出發(fā)看Flutter

    Flutter 是一種流行的移動應用程序開發(fā)框架,它的設計特點之一是可以使用單一代碼庫構建 iOS 和 Android 應用程序。然而,對于功能比較多、模塊比較復雜的應用程序,僅憑單一的代碼庫就可能導致代碼的復雜性和維護難度的增加。在這種情況下,通過合適的應用程序架構設計

    2024年02月07日
    瀏覽(22)
  • Spring框架概述及核心設計思想

    Spring框架概述及核心設計思想

    我們通常所說的 Spring 指的是 Spring Framework(Spring 框架),它是?個開源框架,有著活躍而龐大的社區(qū),這就是它之所以能長久不衰的原因;Spring 支持廣泛的應用場景,它可以讓 Java 企業(yè)級的應用程序開發(fā)起來更簡單。 用?句話概括 Spring: Spring 框架是包含了眾多工具方法的

    2024年02月16日
    瀏覽(24)
  • 數據倉庫之建模理論以及倉庫設計思想

    數據倉庫之建模理論以及倉庫設計思想

    數據倉庫是一個為數據分析而設計的企業(yè)級數據管理系統(tǒng)。數據倉庫可集中、整合多個信息源的大量數據,借助數據倉庫的分析能力,企業(yè)可從數據中獲得寶貴的信息進而改進決策。同時,隨著時間的推移,數據倉庫中積累的大量歷史數據對于數據科學家和業(yè)務分析師也是十

    2023年04月15日
    瀏覽(25)
  • 【JavaEE進階】Spring核心與設計思想

    【JavaEE進階】Spring核心與設計思想

    我們通常所說的 Spring 指的是 Spring Framework (Spring 框架),它是一個輕量級的 Java 開源框架,有著活躍龐?的社區(qū)。Spring 是為了解決企業(yè)應用開發(fā)的復雜性而創(chuàng)建的,不僅?持?泛的應?場景,還讓 Java 企業(yè)級的應?程序開發(fā)更加簡單。 如何簡單地使??句話概括 Spring:

    2024年02月13日
    瀏覽(33)
  • 【JavaEE進階】 Spring核?與設計思想

    【JavaEE進階】 Spring核?與設計思想

    我們通常所說的 Spring 指的是 Spring Framework(Spring 框架),它是?個開源框架,有著活躍?龐?的社區(qū),這就是它之所以能?久不衰的原因。Spring ?持?泛的應?場景,它可以讓 Java 企業(yè)級的應?程序開發(fā)起來更簡單。 ??句話概括 Spring: Spring 是包含了眾多?具?法的 I

    2024年02月04日
    瀏覽(25)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領取紅包

二維碼2

領紅包