游戲引擎分層簡介

游戲引擎分層架構(自上而下)

工具層(Tool Layer)
在一個現代游戲引擎中,我們最先看到的可能不是復雜的代碼,而是各種各樣的編輯器,利用這些編輯器,我們可以制作設計關卡、角色、動畫等游戲內容,這一系列編輯器就構成了引擎最上面的一層——工具層。
在這里插入圖片描述
功能層(Function Layer)

  • 將一個三維虛擬世界轉換為一幀一幀的二維圖像的過程,我們需要用到渲染系統(Rendering);
  • 讓一個個靜止的模型運動起來,做出惟妙惟肖的動作,形成連續的畫面,我們需要用到動畫系統(Animation);
  • 物理的碰撞,各種力的作用,讓物體的運動更貼近真實世界,我們需要用到物理系統(Physics);
  • 每一個游戲世界都有著自己的規則,還要有NPC來豐富游戲可玩性,這就需要用到腳本(Script)、狀態機(FSM)和AI;

任何一個游戲的操作都離不開人機交互,這其中又涉及一系列功能。以上的種種功能組合在一起便構成了游戲引擎的功能層。
在這里插入圖片描述
資源層(Resource Layer)
游戲中有的不只是一行行的源代碼,還有各種格式的多媒體文件,如PhotoShop的PSD文件、3DSMAX的MAX文件,加載管理這一系列的圖形、圖像、音頻、視頻文件以及其他數據,就是資源層的任務了。資源層位于功能層之下,不斷為功能層提供數據,這就好像上面是一個畫家在畫畫,而資源層在下面不斷為其提供顏料。
在這里插入圖片描述
核心層(Core Layer)
游戲引擎中最核心,最重要的一層就是核心層。核心層負責響應上面層次頻繁的調用,提供各種基礎功能,如內存管理、容器的分配、數據的運算、多線程的創建等等。
在這里插入圖片描述
平臺層(Platform Layer)
平臺層是最容易被忽略的一層,一款游戲或者引擎可能被發布在不同的平臺上,會有不同的圖形接口;并且不同的用戶可能使用不同的硬件設備,如鍵鼠和手柄。適應不同的平臺,就是平臺層的任務。在這里插入圖片描述
第三方庫(Third Party Libraries)
中間件和第三方庫通過SDK(Software Development Kit)的形式或文件格式進行轉化。
在這里插入圖片描述
為什么要分層架構?

在這里插入圖片描述
為了使游戲引擎解耦并降低復雜度,每一層都將獨立完成自己的任務,底層為上層提供基礎服務,上層調用底層的工具。這樣的分層架構使得上層靈活,底層穩定,更有利于功能的更新和開發。

資源層

Photohop中的PSD文件、3DSMAX中的MAX文件等一般包含工具自帶信息,大量與引擎無關的數據,數據格式比較復雜, 直接使用會很大程度上降低效率。為了提高調度資源的效率,需要引擎在導入時將不同資源都轉換為資產(assets)文件。例如引擎中使用貼圖文件時,我們可能導入JPG、PNG格式的文件,但這兩種文件的壓縮算法對于GPU來說并不高效,直接在GPU中使用會浪費性能,所以其通常被轉換成dds格式再存入顯存中。
在這里插入圖片描述
對于任意一個游戲人物,例如上圖的小機器人,可能需要綁定對應的材質、貼圖、網格、動畫等資源,定義一個Composite asset文件關聯這些資源,比如XML文件,并使用GUID(全局唯一標識符)進行標識管理。
在這里插入圖片描述
實際運行時,游戲還需要用到資產管理器(Runtime Asset Manager),其根據資產的生命周期(Asset Life Cycle)對資產進行管理操作,資產的實時加載卸載、資源的分配、垃圾回收(GC)、延時加載等都包括在其中。

功能層

在這里插入圖片描述
功能層的使用,使得每過一個tick時間,游戲中的虛擬世界就會前進一步。一個tick時間內,分別執行tickLogic()和tickRender()函數,其中邏輯方面的tickLogic()一般先執行,主要用于模擬游戲世界,包括輸入輸出的處理、相機視角位置的變換、碰撞的檢測等操作;用于繪制世界的tickRender()則依據tickLogic()計算出的各資產的位置情況進行渲染繪制。
在這里插入圖片描述
功能層非常的復雜龐大,特別是涉及到網絡編程時,所以通常需要借助多線程計算。當前主流的多線程是將可以并行計算的任務拆分開來,分別放到多個線程運算,但若有不適用于并行計算的任務,其缺陷便顯露出了。在未來,引擎會將每個任務劃分為極小的可執行單元,將這一個個原子般的任務分配到多個線程中執行,更加高效的利用資源。
在這里插入圖片描述

核心層

核心層為上層的所有邏輯提供一個基礎,它提供數學庫(如矩陣運算)、數據結構和容器(如二叉樹)、內存管理等工具。因為引擎的一切都是以效率為核心的,所以在進行數學運算時,可以使用近似運算或者SIMD(單指令多數據流,以同步方式,在同一時間內執行同一條指令)提高運算效率;至于數據結構和容器,編程語言中自帶的數據結構可能會出現一些問題,比如C++中的Vector在添加對象時開辟的儲存空間會成倍增長,在添加大量對象后,使用的儲存空間我們將無法得知,可能會產生內存空洞,而引擎中的數據結構更加方便內存的管理,提高訪問效率;引擎的內存管理和操作系統很相似,核心原理可以概括為:盡可能把數據儲存在一起,訪問時按順序訪問,處理時批量處理
在這里插入圖片描述

平臺層

平臺層使得游戲能夠兼容如Xbox、Mac、Windows等不同平臺,手柄、鍵鼠等不同設備。平臺層通過使用Render Hardware Interface(RHI)來去除不同Graphics API(如DirectX11、DirectX12、OpenGL)之間的差異,使上層無需關心使用不同API可能會帶來的問題。
在這里插入圖片描述

工具層

在這里插入圖片描述
工具層一般以編輯器的形式(藍圖編輯器、材質編輯器等)呈現,可以使用不同編程語言開發(C++、C#、Html5等),以開發效率優先,它需要使不同使用者能夠創造游戲內容。因為很多游戲的數字資產是在不同DCC(Blender、MAYA等)中創建的,所以工具層一般包含導入、導出工具用于導入、導出游戲資源。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718106.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718106.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718106.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據類型和變量

1.數據類型 在Java中數據類型主要分為兩類:基本數據類型和引用數據類型。 基本數據類型有四類八種: 1. 四類:整型、浮點型、字符型以及布爾型 2.八種: 整形是分為如上四種 byte short int long 浮點型分為 float 和double …

Docker Compose系列--搭建halo與mysql

原文網址:使用Docker Compose系列--搭建halo與mysql_IT利刃出鞘的博客-CSDN博客 簡介 說明 本文介紹如何使用Docker Compose搭建halo與mysql。 官網網址 使用 Docker 部署 Halo 和 MySQL | Halo Documents Docker Compose搭建mysql 見:Docker Com…

【大廠AI課學習筆記NO.64】機器學習開發框架

機器學習開發框架本質上是一種編程庫或工具,目的是能夠讓開發人員更容易、更快速地構建機器學習模型。 機器學習開發框架封裝了大量的可重用代碼,可以直接調用,目的是避免“重復造輪子’大幅降低開發人員的開發難度,提高開發效率…

軟考高級:候選碼、主碼、全碼、外碼、主屬性、主鍵、主關鍵字、非主屬性概念和例題

一、AI 講解 候選碼、主碼、全碼、外碼、主屬性、主鍵、主關鍵字、非主屬性是數據庫設計和數據建模中的基本概念,特別是在關系數據庫模型中。下面將對這些概念進行簡單講解,并給出相應的例子。 概念講解 候選碼(Candidate Key)…

Spring框架精髓:帶你手寫IoC

個人名片: 🐼作者簡介:一名大三在校生,喜歡AI編程🎋 🐻???個人主頁🥇:落798. 🐼個人WeChat:hmmwx53 🕊?系列專欄:🖼?…

足球青訓俱樂部|基于Springboot的足球青訓俱樂部管理系統設計與實現(源碼+數據庫+文檔)

足球青訓俱樂部管理系統目錄 目錄 基于Springboot的足球青訓俱樂部管理系統設計與實現 一、前言 二、系統設計 1、系統架構設計 三、系統功能設計 1、管理員登錄界面 2、公告信息管理界面 3、學員管理界面 4、商品信息管理界面 5、課程安排管理界面 四、數據庫設計…

ArcGIS Runtime For Android開發之符號化和圖層渲染

一、用Symbol對要素進行符號化 首先我們看一下Symbol 接口關系: 1、SimpleFillSymbol 他是用來進行簡單的Graphic面要素填充符號化的,它可以設置要素的填充顏色,邊線顏色、線寬,其用法如下: Polygon polygonnew Po…

常用的電阻、電容的種類和應用場合?

電阻的 a.按阻值特性:固定電阻、可調電阻、特種電阻(敏感電阻),不能調節的,我們稱之為固定電阻,而可以調節的,我們稱之為可調電阻.常見的例如收音機音量調節的,主要應用于電壓分配的,我們稱之為電位器. b.按制造材料:碳膜電阻、金屬膜電阻、線繞電阻,捷…

Go切片特點筆記

特點 1.只有append操作2.支持子切片3.內存共享問題 1.只有append操作 不支持隨機增刪 2.支持子切片 數組和切片都可以通過[start:end] 的形式 來獲取子切片: 1.arr[start:end],獲得[start,end)之間的元素。 2.arr[:end],獲得[0,end)之間的元素。 3.arr[start:],獲得[start,l…

二叉樹葉節點個數,根節點個數,樹的深度,查找數據為x的節點

文章目錄 一、計算二叉樹葉節點個數二、葉節點的個數 引言:補充樹的概念 節點的度:一個節點含有的子樹的個數稱為節點的度 葉節點或終端節點:度為0的節點稱為葉節點 節點的層次:從根開始為第一層,以此類推 樹的度&…

Leetcode150二刷總結

滑動窗口(ok) 題號:3、209、76 定義好窗口的左邊界left和右邊界right一般是只需要遍歷right,滿足條件后調整left 鏈表 題號:206、92、146、25、21 反轉鏈表主要是設置好pre(初始為null)和c…

【Godot 4.2】Tree控件與TreeItem完全解析

概述 本篇是控件完全解析系列之一,主要總結一下Tree控件與TreeItem的使用。 Tree控件是一個非常強大的控件,尤其是在編寫一些相關的程序或編輯器插件時,非常適合展示樹形組織的節點型數據。 本篇將從簡單的添加根節點,根節點子…

uniapp和vue項目配置多語言,實現前端切換語言

在uniapp中配置多語言功能,實現前端切換語言,可以按照以下步驟進行: 1. 創建語言包 首先,創建一個名為 lang 的目錄,并在該目錄下為每種支持的語言創建對應的JSON或JS文件。例如: lang/en.js&#xff08…

Threejs之場景標注標簽信息CSS2DRenderer

參考資料 CSS2DRenderer(HTML標簽)…單擊按鈕關閉HTML標簽 知識點 注:基于Three.jsv0.155.0 CSS2DRenderer(HTML標簽) HTML標簽遮擋Canvas畫布事件Canvas尺寸變化(HTML標簽)標簽位置不同設置方式標簽位置(標注工廠設備)標簽指示線或箭頭指向標注點鼠標選中模型…

Microsoft PyRIT能自動化完成AI紅隊的任務

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

兩數相加的問題

題目是:給兩個非空的鏈表,表示兩個非負整數。它們每位數都是按照逆序的方式存儲,并且每一個節點只能存儲一位數字。現在兩個數相加,并且以相同的形式返回一個表示和的鏈表。 首先回顧一下,什么是鏈表?鏈表…

《異常檢測——從經典算法到深度學習》26 Time-LLM:基于大語言模型的時間序列預測

《異常檢測——從經典算法到深度學習》 0 概論1 基于隔離森林的異常檢測算法 2 基于LOF的異常檢測算法3 基于One-Class SVM的異常檢測算法4 基于高斯概率密度異常檢測算法5 Opprentice——異常檢測經典算法最終篇6 基于重構概率的 VAE 異常檢測7 基于條件VAE異常檢測8 Donut: …

使用遞歸方法和類數組兩種方法計算斐波那契數列

菲波納契數列又稱"菲波納契神奇數列",是由13世紀的意大利數學家菲波納契提出的,當時是和兔子的繁殖問題有關的,它是一個很重要的數學模型。這個問題是:有小兔一對,若第二個月它們成年,第三個月生下小兔一對&…

3333666777

? 通用計算機啟動過程 1??一個基礎固件:BIOS 一個基礎固件:BIOS→基本IO系統,它提供以下功能: 上電后自檢功能 Power-On Self-Test,即POST:上電后,識別硬件配置并對其進行自檢&#xff0c…