如何優化大場景實時渲染?HMS Core 3D Engine這麼做

来源:https://www.cnblogs.com/hmscore/archive/2022/12/20/16993856.html
-Advertisement-
Play Games

在先前舉辦的華為開發者大會2022(HDC)上,華為通過3D數字溪村展示了自有3D引擎“HMS Core 3D Engine”(以下簡稱3D Engine)的強大能力。作為一款高性能、高畫質、高擴展性的3D引擎,3D Engine不僅能通過實時光追、水體渲染、體積雲霧、多維GPU粒子系統等技術還原真 ...


在先前舉辦的華為開發者大會2022(HDC)上,華為通過3D數字溪村展示了自有3D引擎“HMS Core 3D Engine”(以下簡稱3D Engine)的強大能力。作為一款高性能、高畫質、高擴展性的3D引擎,3D Engine不僅能通過實時光追、水體渲染、體積雲霧、多維GPU粒子系統等技術還原真實世界的物理表現,對於大規模數字世界的實時渲染,3D Engine同樣也能為開發者提供有力的技術支持。

大規模數字世界的需求與挑戰

今天,如何更好地實現大場景下的實時渲染,已經成為行業的熱門話題,相關技術在眾多領域都有著廣闊的應用前景。我們可以明顯感受到,從3D游戲到虛擬現實,從三維GIS到數字城市,涉及場景的規模都在呈指數級增長,部分游戲中的世界地圖甚至沒有邊界。可以說,大規模場景的實時交互渲染能力正在成為構築數字世界的基礎設施

然而,這並非易事。

場景規模的擴大帶來的結果就是海量的內容和數據。一個城市涉及的物件數差不多是百萬級,面片數更是可能達到億級,而硬體配置卻始終是相對有限的,即使再高級的硬體配置也有力不從心的時候。

數據和硬體之間的矛盾,對3D引擎的大場景實時渲染能力提出了挑戰:

• 由於物件、網格、材質等內容數量太多,受限於顯存容量,傳統的全場景預先載入方式無法實現;

• 在傳統3D繪製模式下,GPU的算力不足以支撐萬級規模物件數和億級規模面片的實時渲染;

• 如果使用流式載入場景的方式,可以實現一邊渲染一邊載入數據,但需要預處理場景數據,諸如分區分層、模型合併、材質合併、紋理烘焙等預處理往往極為耗時,幾萬個物件就需要小時級的等待,且僅支持場景中靜止不動的物件。

譬如上圖這個伺服器大樓,三角面片數達到了千萬級,並且有將近萬件的模型。為了實現實時渲染,通常需要通過HLOD的方式將整個場景進行Spatial-Coherent的層次重組。

類似於右圖紅圈所示,以不同半徑為一個空間節點,將圈圈內的模型進行合併處理,從而降低場景物件的遍曆數量,提高繪製性能。而這個預處理操作本身就需要耗費近一個小時,大大增加了調試和開發成本。

那麼,HMS Core 3D Engine將如何應對挑戰,構建大規模場景的實時渲染能力?

Hi-Mesh層級網格渲染加速技術

為瞭解決這三個“放不下”、“算不了”、“等不起”的問題,華為2012菲爾茲實驗室基於HMS Core 3D Engine自研了“Hi-Mesh”層級網格渲染加速技術,針對場景中的資產進行多維度、多層級的結構優化,確保場景結構在生成、遍歷、處理過程中的高效。譬如針對一個大規模場景,可將其數字內容進行多維分區:

  1. 按空間結構分區

3D場景中利用物件原生隱含的空間屬性,進行快速位置編碼和索引,大幅降低傳統樹形結構的線性遍歷耗時;

  1. 按視角空間分層

利用視角的局限性,對場景中的物件進行不同細節層次的區分或合併處理,從而降低場景的數據量;

  1. 按內容特征分組

利用場景物件的特征,如按網格、材質的同源性進行分組,從而使用特定優化的繪製指令來強化它們的繪製效率;

  1. 按拓撲連接分片

將模型網格進行更精細粒度的分片,實現高效率的剔除和遮擋操作,優化實時渲染的性能。

Hi-Mesh架構圖

基於將場景化整為散的原則,以高效率的空間/視角結構來實現多層級的數據優化,並以GPU驅動的方式,最終實現百萬級物件、億級片面的數字世界的實時渲染。

一千個物件實時動態更新

為了實現上述的操作,3D Engine使用了一種隱式編碼樹的空間層次結構——“Hi-Mesh Tree”。不同於傳統基於鏈表形式的空間結點樹的方式,3D Engine通過一種常量級性能的構造和遍歷方法,相較現有的商業引擎,大規模場景的實時渲染性能可提升15%~120%。此外,還可以大幅提升三維空間場景組織結構的生成效率,甚至達到毫秒級,大大降低了工作流的時間成本。

數據來源: 華為內部實驗室測試結果

同時,3D Engine還使用了基於GPU驅動的Cluster Rendering (GDCR)繪製技術

GPU驅動在業界已有一些探索和應用,其理想目標是用一個Draw Call(DC)來繪製整個場景,以充分發揮GPU的並行流水線能力,實現渲染性能的提高。下圖是Ubisoft 在Siggraph 15上提出的GPU驅動管線的架構圖,其核心思想就是將原本基於CPU的可視性檢測處理遷徙到GPU上,利用GPU的並行和可編程能力,提供高併發、不同粒度的可視性檢測能力,從而大幅提高渲染性能。

3D Engine為了更充分的實現GPU驅動的效率,對GPU驅動的管線節點、數據傳輸、圖形資產進行深度優化和耦合,將場景下的所有3D物件在GPU上進行各個維度(包圍盒、實例、片區、三角面)的可視性剔除,配合多層的重組(材質、頂點),從而實現以最少量的繪製指令來實現場景的光柵化和著色,同等規模場景下相比傳統模式的渲染性能實現了翻倍。

同等規模場景下渲染性能對比

可以預見,未來的數字世界無論是元宇宙、數字孿生、還是開放大世界,趨於龐大的豐富多彩場景都將會是不可或缺的組成部分。在Hi-Mesh技術的加持下,3D Engine得以通過高效的空間層級結構和GPU友好的繪製管線,大幅提高大規模數字場景下的實時渲染能力,使場景中的3D內容“盡情放”、“更快看”、“少等待”,幫助開發者大大提升生產力。

關於HMS Core 3D Engine

3D Engine是HMS Core面向行業伙伴推出的重要圖形能力,不僅提供高性能、高畫質、高擴展性的實時3D引擎,配合低代碼的可視化開發,能夠幫助開發者便捷高效地創造出高品質的3D內容和體驗。如需進一步瞭解更多信息,請訪問: developer.huawei.com/consumer/cn/hms/3d-engine/?ha_source=hms1

瞭解更多詳情>>

訪問華為開發者聯盟官網
獲取開髮指導文檔
華為移動服務開源倉庫地址:GitHubGitee

關註我們,第一時間瞭解 HMS Core 最新技術資訊~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一:背景 1.講故事 今天是🐏的第四天,頭終於不巨疼了,寫文章已經沒什麼問題,趕緊爬起來寫。 這個月初有位朋友找到我,說他的程式出現了CPU爆高,讓我幫忙看下怎麼回事,簡單分析了下有兩點比較有意思。 這是一個安全生產的信息管理平臺,第一次聽說,我的格局小了。 這是一個經典的 CPU 爆高問題,過往 ...
  • 一 引入 在設計設備界面時,經常會有一種需求,展示一個閥門,閥門有通斷兩種狀態: 二 CommonValveControl 考慮實現一個自定義控制項,CommonValveControl。 使用自定義控制項比用戶控制項更靈活,更具擴展性,可以使用不同的樣式和模板。 CommonValveControl定義 ...
  • 說明 基於微服務項目,產生的的多項目倉庫管理腳本。可直接保存 shell 腳本後酌情修改後試用 目錄結構 xxxx Xxx1Api/ Xxx2Api/ git_clone_api.sh git_branch_dev.sh git_pull_all.sh git_status.sh api-build ...
  • 1. 查看當做操作目錄位置 > pwd2. 查看(當前)目錄裡邊的文件內容 > ls //list > ls -l 或ll //顯示文件的詳細信息 > ls -al //all顯示文件的詳細信息(包括隱藏文件) > ls -a //顯示目錄全部文件名字(包括隱藏文件) > ls [-al] 目錄 / ...
  • “數據湖”、“湖倉一體”及“流批一體”等概念,是近年來大數據領域熱度最高的辭彙,在各大互聯網公司掀起了一波波的熱潮,各家公司紛紛推出了自己的技術方案,其中作為全鏈路數字化技術與服務提供商的袋鼠雲,在探索數據湖架構的早期,就調研並選用了Iceberg作為基礎框架,在落地過程中深度使用了Iceberg並 ...
  • 摘要:openGemini的設計和優化都是根據時序數據特點而來,在面對海量運維監控數據處理需求時,openGemini顯然更加有針對性。 IT運維誕生於最早的信息化時代。在信息化時代,企業的信息化系統,主要為了滿足企業內部管理的需求。通常是集中、可控和固化的煙囪式架構。傳統IT運維,以人力運維為主, ...
  • 說說幾種薅免費伺服器羊毛的方法吧 經過我多年的薅羊毛經驗,總結得知,編程只需要: Terminal + VPS主機 + 網路 為了達到這些目的,肯定需要Vim搭建IDE,安裝環境等等操作 當時記得使用的是ChromeOS的筆記本,所有的應用都是在Chrome瀏覽器當中的,續航時間長,又輕薄屬實快得飛 ...
  • 主要闡述InnoDB存儲引擎(MySQL5以後的預設引擎)。 資料庫中最基本的組成結構是數據表,視覺上的表和其對應的磁碟結構如下: 此圖參考了廈門大學課堂:MySQL原理 。但是視頻中一些更多細節沒有涉及,比如Leaf node segment和Non-leaf node segment其實就是葉子 ...
一周排行
    -Advertisement-
    Play Games
  • 一:背景 1. 講故事 年前遇到了好幾例托管堆被損壞的案例,有些運氣好一些,從被破壞的托管堆記憶體現場能觀測出大概是什麼問題,但更多的情況下是無法做出準確判斷的,原因就在於生成的dump是第二現場,借用之前文章的一張圖,大家可以理解一下。 為了幫助更多受此問題困擾的朋友,這篇來整理一下如何 快狠準 的 ...
  • 前言 .NET6 開始,.NET Croe API 項目取消了 Startup.cs 文件,在 Program.cs 文件的 Main 函數中完成服務的註冊和中間件管道的管理。但當我們項目引入更多包的時候,Program.cs 文件也會看起來很臃腫。 而且,我們不只會有一個後端項目,為了方便快速創建 ...
  • 目錄 背景 get 與 post 的區別 所有介面都用 post 請求? 背景 最近在逛知乎的時候發現一個有趣的問題:公司規定所有介面都用 post 請求,這是為什麼? 看到這個問題的時候其實我也挺有感觸的,因為我也曾經這樣問過我自己。在上上一家公司的時候接到一個項目是從零開始搭建一個微服務,當時就 ...
  • *以下內容為本人的學習筆記,如需要轉載,請聲明原文鏈接 微信公眾號「englyf」https://mp.weixin.qq.com/s/2GFLTstDC7w6u3fTJxflNA 本文大概 1685 個字,閱讀需花 6 分鐘內容不多, 但也花了一些精力如要交流, 歡迎關註我然後評論區留言 謝謝你的 ...
  • 在新版本的pandas中,上述代碼會引起警告,建議改成SQLAlchemy connectable(engine/connection),後續代碼將引入這種升級的連接方式。 ...
  • 幾乎所有的高級編程語言都有自己的垃圾回收機制,開發者不需要關註記憶體的申請與釋放,Python 也不例外。Python 官方團隊的文章 https://devguide.python.org/internals/garbage-collector 詳細介紹了 Python 中的垃圾回收演算法,本文是這篇 ...
  • 如果您想查找高於或低於平均值的數字,可以不必計算該平均值,就能查看更高或更低的值。通過Java應用程式,可以自動突出顯示這些數字。除了快速突出顯示高於或低於平均值的值外,您還可以查看高於或低於的值的個數。現在讓我們看看如何在 Java應用程式中實現此操作。 引入jar包 導入方法1: 手動引入。將  ...
  • 第一種方式:使用{} firstDict = {"name": "wang yuan wai ", "age" : 25} 說明:{}為創建一個空的字典對象 第二種方式:使用fromkeys()方法 second_dict = dict.fromkeys(("name", "age")) #valu ...
  • 在golang中可以使用a := b這種方式將b賦值給a,只有當b能進行深拷貝時a與b才不會互相影響,否則就需要進行更為複雜的深拷貝。 下麵就是Go賦值操作的一個說明: Go語言中所有賦值操作都是值傳遞,如果結構中不含指針,則直接賦值就是深度拷貝;如果結構中含有指針(包括自定義指針,以及切片,map ...
  • 本文結合京東監控埋點場景,對解決樣板代碼的技術選型方案進行分析,給出最終解決方案後,結合理論和實踐進一步展開。通過關註文中的技術分析過程和技術場景,讀者可收穫一種樣板代碼思想過程和解決思路,並對Java編譯器底層有初步瞭解。 ...