Unity DOTS中的baking(一) Baker簡介

Unity DOTS中的baking(一) Baker簡介


baking是DOTS ECS工作流的一環,大概的意思就是將原先Editor下的GameObject數據,全部轉換為Entity數據的過程。baking是一個不可逆的過程,原先的GameObject在運行時不復存在,都會變成Entity。

baking只會在Editor環境下運行,而且只會對SubScene中包含的GameObject進行烘焙。SubScene是Unity提供的一種場景格式,SubScene中的GameObjects和MonoBehaviour會轉換成ECS中的entity和component。之所以搞出一個新的格式,是因為ECS和之前老的scene system不兼容。

baking主要分為兩個關鍵步驟,其一是Bakers,負責將GameObjects轉換為entities和components,其二是Baking systems,對上一步中生成的entities可以再做額外處理。

通常,一個Baker和一個MonoBehaviour綁定,Baker可以使用MonoBehviour中的數據,為Entity添加組件,例如:

using Unity.Entities;
using UnityEngine;public class MyAuthoring : MonoBehaviour
{public int bakeIntData = 0;class MyBaker : Baker<MyAuthoring>{public override void Bake(MyAuthoring authoring){var entity = GetEntity(TransformUsageFlags.None);AddComponent(entity, new IntComponent { value = authoring.bakeIntData });}}
}public struct IntComponent : IComponentData
{public int value;
}

代碼很簡單,就是為當前的Entity添加了一個IntComponent的Component,這個IntComponent的value是用MyAuthoring里的bakeIntData設置的。我們在Editor下也可以預覽到GameObject轉換為Entity時所擁有的Components:

Unity DOTS中的baking1

運行時還能看到更詳細的信息:

Unity DOTS中的baking2

我們在代碼中獲取當前Enity時,使用了TransformUsageFlags.None這個參數。根據Unity給出的官方文檔,這個flag是用來告訴Unity如何將GameObject中的transform轉換成ECS的Components的。如果flag為None,說明Entity不需要transform相關的Components,而如果flag為dynamic,則會盡可能把transform的信息復制到Entity里。完整的flags列表如下,摘自官方文檔:

NameDescription
DynamicIndicates that an entity requires the necessary transform components to be moved at runtime (LocalTransform, LocalToWorld).
ManualOverrideIndicates that you want to take full manual control over the transform conversion of an entity.
NonUniformScaleIndicates that an entity requires transform components to represent non uniform scale.
NoneSpecifies that the entity doesn’t need transform components.
RenderableIndicates that an entity requires the necessary transform components to be rendered (LocalToWorld), but it doesn’t require the transform components needed to move the entity at runtime.
WorldSpaceIndicates that an entity needs to be in world space, even if they have a Dynamic entity as a parent.

我們可以對比一下使用TransformUsageFlags.NoneTransformUsageFlags.Dynamic的區別:

Unity DOTS中的baking3

對比一下可以發現,右邊Dynamic的多了LocalToWorldLocalTransform兩個Component,它們包含了transform的各種信息。

那么,Baker觸發的時機是怎樣的呢?

首先,對于SubScene,它在Hierarchy中有兩種狀態,一種是open,一種是closed,在Editor環境下,SubScene的右側有個勾選,如果沒有勾選,就是closed,反之則是open。

根據官方文檔,closed狀態下,Unity會執行full baking,這是一個異步的過程。

Unity DOTS中的baking4

官方文檔給出的觸發時機有以下若干種:

  • The entity scene is missing (not present on disk).
  • The authoring scene has been modified and the entity scene is outdated.
  • The baking code is in an assembly that doesn’t contain a single [BakingVersion] attribute. This means that the assembly has been modified and the entity scene is outdated.
  • A [BakingVersion] attribute on baking code has been modified.
  • The Entities Project Settings have been modified.
  • You request a reimport from the subscene Inspector. This feature is intended for troubleshooting.
  • You clear the baking cache in the Editor Preferences.

我們不妨挑幾個試驗一下。首先在之前的代碼里加下觸發的log:

public override void Bake(MyAuthoring authoring)
{Debug.Log("==========================Bake Invoked!========================== " + authoring.name);var entity = GetEntity(TransformUsageFlags.None);AddComponent(entity, new IntComponent { value = authoring.bakeIntData });
}

然后在SubScene里放兩個空的GameObject,分別叫GameObject1和GameObject2,給它們都掛上MyAuthoring這個腳本:

Unity DOTS中的baking5

這時,進入掛有SubScene的場景時,就會觸發Bake了。說明只有SubScene需要被load時,才會觸發它的baking。

Unity DOTS中的baking6

下面,我們回到SubScene,只修改某一個GameObject的transform或者MyAuthoring的BakeIntData:

Unity DOTS中的baking7

保存之后再次回到場景,會發現沒有修改過的GameObject2也重新進行了baking,也的確是full baking。但是,如果我們把GameObject1修改回之前,卻發現此時并不會觸發full baking,原來Unity對baking的結果是會進行緩存的,如果緩存中存在就不會再次baking了。

不過,我們也可以手動觸發full baking,比如直接reimport SubScene:

Unity DOTS中的baking8

或者在Preference中clear掉緩存:
Unity DOTS中的baking9

現在,我們再勾上SubScene的open,open subscene的好處是可以實時預覽SubScene中的GameObjects和Entities:

Unity DOTS中的baking10

除此之外,open subscene會執行incremental baking,也就是只bake發生修改過的data,不過這要取決于需要處理的數據量。

比如此時如果只修改GameObject1的transform,MyAuthoring的Bake是不會被觸發的,因為它本身并沒有發生改變。incremental baking的log也提供了相關的信息:

Unity DOTS中的baking11

如果我們再修改MyAuthoring的BakeIntData,此時就會觸發Bake了,不過因為只有GameObject1發生了修改,所以也只有GameObject1需要重新進行Bake:

Unity DOTS中的baking12

Reference

[1] Baking overview

[2] Enum TransformUsageFlags

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

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

相關文章

leetcode 股票DP系列 總結篇

121. 買賣股票的最佳時機 你只能選擇 某一天 買入這只股票&#xff0c;并選擇在 未來的某一個不同的日子 賣出該股票。 只能進行一次交易 很簡單&#xff0c;只需邊遍歷邊記錄最小值即可。 class Solution { public:int maxProfit(vector<int>& prices) {int res …

Vue-安裝及安裝vscode相應插件

安裝Vue 安裝nodejs&#xff0c; 地址&#xff1a;https://nodejs.org/en 下載后直接安裝。 安裝后重新打開命令行工具&#xff0c;輸入 node -v PS C:\Users\zcl36> node -v v20.10.0 2. 安裝vue包npm install -g vue/cli安裝之后&#xff0c;你就可以在命令行中訪問 vue…

【git】關于git二三事

文章目錄 前言一、創建版本庫1.通過命令 git init 把這個目錄變成git可以管理的倉庫2.將修改的內容添加到版本庫2.1 git add .2.2 git commit -m "Xxxx"2.3 git status 2.4 git diff readme.txt3.版本回退3.1 git log3.2 git reset --hard HEAD^ 二、理解工作區與暫存…

操作系統內部機制學習

切換線程時需要保存什么 函數需要保存嗎&#xff1f;函數在Flash上&#xff0c;不會被破壞&#xff0c;無需保存。函數執行到了哪里&#xff1f;需要保存嗎&#xff1f;需要保存。全局變量需要保存嗎&#xff1f;全局變量在內存上&#xff0c;無需保存。局部變量需要保存嗎&am…

Leetcode—337.打家劫舍III【中等】

2023每日刷題&#xff08;五十二&#xff09; Leetcode—337.打家劫舍III 算法思想 實現代碼 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(null…

I.MX6ULL_Linux_驅動篇(46)linux LCD驅動

LCD 是很常用的一個外設&#xff0c;在Linux 下LCD 的使用更加廣泛&#xff0c;在搭配 QT 這樣的 GUI 庫下可以制作出非常精美的 UI 界面。本章我們就來學習一下如何在 Linux 下驅動 LCD 屏幕。 Linux 下 LCD 驅動簡析 Framebuffer 設備 先來回顧一下裸機的時候 LCD 驅動是怎…

前端入門:HTML初級指南,網頁的簡單實現!

代碼部分&#xff1a; <!DOCTYPE html> <!-- 上方為DOCTYPE聲明&#xff0c;指定文檔類型為HTML --> <html lang"en"> <!-- html標簽為整個頁面的根元素 --> <head> <!-- title標簽用于定義文檔標題 --> <title>初始HT…

單點登錄方案調研與實現

作用 在一個系統登錄后&#xff0c;其他系統也能共享該登錄狀態&#xff0c;無需重新登錄。 演進 cookie → session → token →單點登錄 Cookie 可以實現瀏覽器和服務器狀態的記錄&#xff0c;但Cookie會出現存儲體積過大和可以在前后端修改的問題 Session 為了解決Co…

【其他數學】結式 resultant

結式 resultant 2023年11月30日 #analysis 文章目錄 結式 resultant介紹Sylvester矩陣應用在消元中的應用傳遞函數的化簡 下鏈 介紹 結式用來計算曲線的交點、消元、找參數化曲線的隱含方程。 為了引出定義&#xff0c;思考如下問題&#xff1a; f ( x ) x 2 ? 5 x 6 g (…

UVM建造測試用例

&#xff08;1&#xff09;加入base_test 在一個實際應用的UVM驗證平臺中&#xff0c;my_env并不是樹根&#xff0c;通常來說&#xff0c;樹根是一個基于uvm_test派生的類。真正的測試用例都是基于base_test派生的一個類。 class base_test extends uvm_test;my_env e…

14-2(C++11)類型推導、類型計算

14-2&#xff08;C11&#xff09;類型推導、類型計算 類型推導auto關鍵字auto類型推斷本質auto與引用 聯用auto關鍵字的使用限制 類型計算類型計算分類與類型推導相比四種類型計算的規則返回值后置 類型推導 auto關鍵字 C98中&#xff0c;auto表示棧變量&#xff0c;通常省略…

Leetcode刷題筆記題解(C++):25. K 個一組翻轉鏈表

思路&#xff1a;利用棧的特性&#xff0c;K個節點壓入棧中依次彈出組成新的鏈表&#xff0c;不夠K個節點則保持不變 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ #include <stack> class Solution { …

在國內,現在月薪1萬是什么水平?

看到網友發帖問&#xff1a;現在月薪1W是什么水平&#xff1f; 在現如今的情況下&#xff0c;似乎月薪過萬這個標準已經成為衡量個人能力的一個標準了&#xff0c;尤其是現在互聯網橫行的時代&#xff0c;好像年入百萬&#xff0c;年入千萬就應該是屬于大眾的平均水平。 我不是…

kafka入門(四):消費者

消費者 (Consumer ) 消費者 訂閱 Kafka 中的主題 (Topic) &#xff0c;并 拉取消息。 消費者群組&#xff08; Consumer Group&#xff09; 每一個消費者都有一個對應的 消費者群組。 一個群組里的消費者訂閱的是同一個主題&#xff0c;每個消費者接收主題的一部分分區的消息…

大師學SwiftUI第18章Part2 - 存儲圖片和自定義相機

存儲圖片 在前面的示例中&#xff0c;我們在屏幕上展示了圖片&#xff0c;但也可以將其存儲到文件或數據庫中。另外有時使用相機將照片存儲到設備的相冊薄里會很有用&#xff0c;這樣可供其它應用訪問。UIKit框架提供了如下兩個保存圖片和視頻的函數。 UIImageWriteToSavedPh…

JAVA后端自學技能實操合集

JAVA后端自學技能實操 內容將會持續更新中,有需要添加什么內容可以再評論區留言,大家一起學習FastDFS使用docker安裝FastDFS(linux)集成到springboot項目中 內容將會持續更新中,有需要添加什么內容可以再評論區留言,大家一起學習 FastDFS 組名&#xff1a;文件上傳后所在的 st…

leetcode 100.相同的樹

涉及到遞歸&#xff0c;最好多畫圖理解&#xff0c;希望對你們有幫助 100.相同的樹 題目 給你兩棵二叉樹的根節點 p 和 q &#xff0c;編寫一個函數來檢驗這兩棵樹是否相同。 如果兩個樹在結構上相同&#xff0c;并且節點具有相同的值&#xff0c;則認為它們是相同的。 題目鏈接…

GPIO的使用--滴答定時器--pir人體紅外傳感器

目錄 一、滴答定時器的使用與原理 1、定義 2、原理 &#xff08;1&#xff09;向上計數?編輯 &#xff08;2&#xff09;向下計數 &#xff08;3&#xff09; 代碼流程 a、配置滴答時鐘喚醒頻率 b、滴答時鐘中斷函數 &#xff08;4&#xff09;結果 3、優化-->寄存…

Proxy Hook Trace JSON

Proxy var window {key: "qww",age: 22 } window new Proxy(window, {get(target, p, receiver) {console.log("target: ", target);console.log("p: ", p);// return window[username];/// 這里如果這樣寫. 有遞歸風險的...// return Reflec…

【線性代數與矩陣論】Jordan型矩陣

Jordan型矩陣 2023年11月3日 #algebra 文章目錄 Jordan型矩陣1. 代數重數與幾何重數2. Jordan塊與Jordan標準型2.1 最小多項式與Jordan標準型2.2 兩類重要矩陣 3. 矩陣的Jordan分解3.1 Jordan分解的應用 下鏈 1. 代數重數與幾何重數 在對向量做線性變換時&#xff0c;向量空間…