Unity-Sprite Atlas+UGUI系統的運行原理

每日一句:別聽世俗耳語,看自己的風景就好

目錄

SA的原理:

SA的優點:

SA的缺點:

DrawCall是什么?

批處理是什么?

我們先了解一下UGUI系統的運行原理吧!


提到圖集優化,我想引出一個經典的游戲優化案例:

《超級馬里奧》的Tile壓縮方法:

由于紅白機的性能相比現在的家用主機來說極為有限,無論是儲存器性能還是處理器性能,所以當時的開發者采用“Tile瓦片”(每個瓦片8X8像素大小)作為基本的圖片存儲單元,然后再把這些瓦片拼接在一起。

如此以來畫面分辨率256X240的紅白機用8X8瓦片來填滿只需要32 * 30 = 960張瓦片,給每個瓦片一個0至255的編號,那么最多只需要960B來表示一個屏幕里的所有圖片,并且瓦片的內容是重復的并且個數是有限的,所要求的存儲性能以及內存性能都因此大大降低。

當然為了極致的性能壓縮性能,那個時代的開發者也應用了不少的技巧:

1.一個角色的行走動畫,用一張圖片進行左右交替翻轉就能實現,減少了存儲壓力。

2.天上的云地上的草疊加放置,表現大小規模不同。

3.角色的圖片只存儲一半,用的時候再翻轉拼接,又進一步壓縮了存儲。

這些前人的智慧也對主流的游戲引擎有著深遠影響:Sprite Atlas(精靈圖集,以下統稱SA)

不僅僅局限于以上描述的方面,SA甚至可以應用于2D 和 3D 項目中的 UI、粒子系統、貼圖等等。

現在我們對SA進行一個詳細的歸納總結:

SA的原理:

是一種將多張小圖匯總,打包成為一個大圖的技術。在游戲運行時只需要載入一張大圖到內存便可以實現多個素材的載入,是一種優化性能的手段,減少多次DrawCall對性能的占用。

SA的優點:

將多個圖片合并到一張大圖中,減少多次DrawCall對性能的占用。

SA的缺點:

當不經常使用的素材被放到圖集中時,即使改素材不被使用也會被載入內存,浪費了內存資源;并且圖集的大小固定為長邊的二次冪,如果圖集內素材的大小差距過大,會直接造成儲存的浪費。

前期要求:

首先我們先找到PackageManager,在Unity Registry中下載2D包。不然無法在項目中創建SA內容。


點擊“install”,下載這個包

然后找到Project Setting選項>Editor>Sprite Atlas>Mode

Mode默認是Disabled,更改為Always Enabled,V1和V2兩個版本目前沒有很大的區別,選V1就行

其他兩個選項的意思是:Enabled For Builds——在項目導出后應用圖集,所以在編輯器里面看到的圖集仍然是原來的那些圖片。

為了保證項目能接近玩家原生感受選擇Always Enabled。

SA的創建:

項目內右鍵Project>2D>Sprite Atlas創建SA。

這里如果沒有前期準備的內容,就無法創建SA。

配置SA:

點擊我們新創建的SA

解釋一下該面板的幾個重要內容的意義:

  1. Include in Build:是否在游戲發布后構建到游戲中
  2. Allow Rotation:是否允許旋轉圖片,如果勾選,在構建圖集時可能會旋轉對應的圖片,建議禁用
  3. Tight Packing:選中可根據圖片的輪廓而非默認矩形輪廓來打包精靈,讓圖片排列更緊密,建議禁用,否則UI元素在顯示時可能會重疊顯示其他的圖片,因為在獲取對應Sprite時是按矩形輪廓來獲取的
  4. Padding:不同UI元素之間的間隔,單位為像素,避免圖片之間過近導致顯示出問題
  5. Objects for Packing:需要打包的UI元素,可以放文件夾或者單個圖片,放文件夾可以將文件夾所有的圖片打包進這個圖集中,圖片的格式需要設置為Sprite(2D and UI),一個圖集最大的尺寸是2048*2048

以上為SA的使用方法以及原理當然還有其他的圖集系統類似于Texture Atlas的內容,不過原理上也大同小異,下面我們深入的了解一下圖集優化的內容。

前文提到了DrawCall,這里解釋一下DrawCall的相關概念:

DrawCall是什么?

當我們在渲染一個物體時,需要通知GPU執行渲染的指令,這一過程叫做“DrawCall”。而調用DrawCall的次數越多,對GPU和CPU的性能開銷就越大,本身電腦的性能就有限,因此我們便要減少DrawCall的次數,減輕對GPU的性能負擔。所以開發者們就想到了上述類似Sprite Atlas的方法,以減少性能開銷。

批處理是什么?

上面我們了解了Sprite Atlas的運行原理,而批處理便是該原理的名稱;由于每一次DrawCall就可以大致理解為一個渲染批次(batch)。Draw call屬于資源密集型的指令,圖形API要為每個Draw call做大量的工作。造成CPU性能消耗的主要是渲染狀態的切換導致的,例如切換到不同的材質,這會導致在圖形驅動中產生密集的資源驗證和切換。為了減少draw call的調用Unity引入了兩種優化技巧:

  1. 動態批處理對于足夠小的mesh,動態批處理通過將他們的頂點整合到一個批次中進行繪制。
  2. 靜態批處理:通過將不會移動的靜態物體合并到更大的mesh中,以提升渲染速度。

材質方面的要求

只有使用了相同材質的物體才能夠實現批處理。如果兩個不同的物體,使用的兩個材質,只是紋理上的差別,那就把他們的紋理合并到一起,這樣就可以使用同一個材質。腳本中使用Render.material屬性時,會重新生成一個原來材質的拷貝,所以用Render.sharedMaterial可以保持材質的一致性(但是使用同一個材質的物體,都會被改變)。關于陰影,只要材質中使用的是相同的Shadow Pass,就可以實現批處理,即便他們不是同一個材質。

我們先了解一下UGUI系統的運行原理吧!

UGUI是在3D網格下建立起來的UI系統,它的每個元素都是通過3D模型網格的形式構建起來的。當UI系統被實例化時,首先要做的就是構建網格。【也就是說,Unity在制作一個圖元,或者一個按鈕,或者一個背景時,都會先構建一個方形網格,再將圖片放入網格中。可以理解為構建了一個3D模型,用一個網格綁定一個材質球,材質球里存放要顯示的圖片。】

那么這里有一個問題界面上成千上萬個元素就會擁有成千上萬個材質球。如果GPU對每個材質球和網格都進行渲染,將會導致GPU的負擔重大,怎么辦呢?

UGUI對這種情況進行了優化,它

  1. 部分相同類型的圖片集合起來合成一張圖,
  2. 然后將擁有相同圖片、相同著色器的材質球指向同一個材質球,
  3. 并且把分散開的模型網格合并起來,
  4. 這樣就生成幾個大網格和幾個不同圖集的材質球

以及少許整張的圖集節省了很多材質球、圖片、網格的渲染,UI系統的效率提升了很多,游戲在進行時也順暢了許多。

這就是圖集概念,它把很多張圖片放置在一張圖集上,使得大量的圖片和材質球不需要重復繪制,只要改變模型頂點上的UV和顏色即可。

我們設想一下,如果每時每刻都在移動一個元素,那么UGUI系統就會不停地拆分合并網格,也就會不停地消耗CPU來使得畫面保持應有的樣子。這些合并和拆分的操作會消耗很多CPU,我們要盡一切可能節省CPU內存盡量把多余的CPU讓給核心邏輯。UGUI系統在制作完成后,性能優劣差距很多時候都會出現在這里。

我們要如何想方設法合并更多的元素,減少重構網格的次數,以達到更少的性能開銷目的呢?(UI優化)請閱讀這篇文章啦

Unity—UI-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_63330263/article/details/136473724?spm=1001.2014.3001.5501本文成果由CSDN博主“Lyrissss_”與我共同創作

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

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

相關文章

cocosCreator動態生成二維碼

cocosCreator 版本:3.7.2 開發語言:typeScript 我們在游戲開發中,經常會生成一個專屬于玩家個人的二維碼,比如說推廣、充值等功能。 接到這個任務,在網上找了下,還是有很多教程的。但是這些教程大部分都是用…

Ollydbg動態分析MessageBoxA輸出hellow world

一、目的 找到main函數找到調用的MessageBoxA函數 測試源碼 #include <iostream> #include <windows.h>int main() {MessageBoxA(NULL, "Hellow World", "Title", MB_OK);return 1; }二、快捷鍵 指令快捷鍵說明RestartCtrlF2重新開始調試S…

buu[HCTF 2018]WarmUp(代碼審計)

buu[HCTF 2018]WarmUp&#xff08;代碼審計&#xff09; 題目 訪問source.php <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php…

MySQL基礎學習: SET FOREIGN_KEY_CHECKS = 0

文章目錄 一、介紹二、使用方法三、注意事項 一、介紹 在MySQL中&#xff0c;SET FOREIGN_KEY_CHECKS 0; 是一個特殊的命令&#xff0c;用于臨時禁用外鍵約束檢查。這在你執行一些涉及多個表并且可能違反外鍵約束的批量操作時非常有用。 為什么需要禁用外鍵約束檢查&#xf…

電腦鍵盤如何練習盲打?

電腦鍵盤如何練習盲打&#xff1f;盲打很簡單&#xff0c;跟著我做&#xff0c;今天教會你。 請看【圖1】&#xff1a; 【圖1】中&#xff0c;紅色方框就是8個基準鍵位&#xff0c;打字時我們左右手的8個手指就是放在這8個基準鍵位上&#xff0c;F鍵和J鍵上各有一個小突起&…

Spring6基礎筆記

Spring6 Log4j2 1、概述 1.1、Spring是什么&#xff1f; Spring 是一款主流的 Java EE 輕量級開源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并創立&#xff0c;其目的是用于簡化 Java 企業級應用的開發難度和開發周期。Spring的用途不僅限于服務器端的開發…

mysql圖形化界面及將mysql注冊成后臺程序

安裝圖形化界面版本 右鍵新建數據庫 字符集使用utf8防止以后數據庫中存在中文字符導致亂碼 將mysql注冊成后臺程序 cmd進入命令行界面 切換路徑到cd /mysql/bin 將mysql注冊成后臺程序 mysqld.exe --install mysql1 (失敗&#xff0c;說明沒有權限) 以管理員身份打開成功…

ASP.NET防止流量攻擊的措施

請求速率限制&#xff1a; // 在 Global.asax.cs 文件中 Application_BeginRequest 方法中添加以下代碼 protected void Application_BeginRequest() {// 檢查請求頻率&#xff0c;限制每個 IP 地址的請求次數if (RequestThrottler.IsRequestLimitExceeded(Context.Request.Use…

如何跨過robots協議的限制爬取內容?

在討論如何“跨過robots協議的限制爬取內容”之前&#xff0c;重要的是強調遵循網絡禮儀和法律法規的必要性。robots協議&#xff08;Robots Exclusion Standard&#xff09;是網站所有者向網絡爬蟲&#xff08;包括搜索引擎和其他自動化工具&#xff09;傳達其爬取意愿的一種方…

SYSTEM文件夾介紹(sys文件夾、deley文件夾、USART 文件夾、SysTick、printf函數、fputc函數、半主機模式)

參考 http://t.csdnimg.cn/P9H6x 一、sys文件夾介紹 在上述介紹的 sys 文件夾中&#xff0c;涉及了一些與系統控制、中斷管理、低功耗模式、棧頂地址設置、系統時鐘初始化以及緩存配置等相關的函數。以下是對每個功能的簡要分析&#xff1a; 1.中斷類函數&#xff1a; sys_n…

CCF20230901——坐標變換(其一)

CCF20230901——坐標變換&#xff08;其一&#xff09; #include<bits/stdc.h> using namespace std; int main() {int n,m,x[101],y[101],x1[101],y1[101];cin>>n>>m;for(int i0;i<n;i)cin>>x1[i]>>y1[i];for(int j0;j<m;j)cin>>x[…

uniapp 高德地圖與百度地圖精準定位,高德地圖定位報錯

目前我這邊測試發現的問題 UNIAPP 獲取定位的代碼 在這里插入代碼片 data的參數 data() {return {id: 0, // 使用 marker點擊事件 需要填寫idtitle: map,latitude: 39.909,longitude: 116.39742,covers: [{latitude: 39.909,longitude: 116.39742,width: 50,height: 50,iconPa…

負反饋系統中運放的相位裕度仿真、環路增益的stb仿真

這里沒目錄標題 一、引言二、巴克豪森判據、最壞情況下的相位裕度、相位裕度三、相位裕度與開環&#xff0c;環路&#xff0c;閉環增益的關系四、環路增益、閉環增益和相位的仿真4.1 運放為雙入單出時4.1.1 系統的閉環增益4.1.2 stb仿真系統的環路增益和相位裕度&#xff08;環…

Python項目:數據可視化_下載數據【筆記】

源自《Python編程&#xff1a;從入門到實踐》 作者&#xff1a; Eric Matthes 02 下載數據 2.1 sitka_weather_07-2021_simple.csv from pathlib import Path import matplotlib.pyplot as plt import csv from datetime import datetimepath Path(D:\CH16\sitka_weather_0…

python web自動化(Allure報告)

Allure詳細安裝請看之前的博客 1.Allure配置與?? 運??例&#xff0c;?成allure報告 pip install allure-pytest -i https://mirrors.aliyun.com/pypi/simple/ 運??例&#xff0c;?成allure報告 # main.py import os import pytest if __name__ __m…

SpringBoot如何實現熱部署

熱部署 使用SpringBoot提供的DevTools實現熱部署 原理&#xff1a;實時監控classpath下文件的變化&#xff08;即編譯后的target目錄&#xff09;&#xff0c;如果發生變化則自動重啟 配置&#xff1a;添加DevTools的依賴即可&#xff08;需要開啟IDEA的自動編譯&#xff09…

ROS學習記錄:用C++實現IMU航向鎖定

前言 獲取IMU數據的C節點 在了解了如何獲取到IMU的姿態信息&#xff08;鏈接在上面&#xff09;后&#xff0c;接下來嘗試實現讓一個節點在訂閱IMU數據的時候&#xff0c;還能發布運動控制指令&#xff0c;使機器人能對姿態變化做出反應&#xff0c;達到一個航向鎖定的效果。 …

神奇動物在哪里,但導演是微軟

大數據產業創新服務媒體 ——聚焦數據 改變商業 一說到計算機視覺&#xff0c;大多數人第一時間聯想到的便是“人臉識別”、“自動駕駛“、道路檢測”等跟我們日常生活息息相關的關鍵詞。而在2024年的5月末&#xff0c;微軟在GitHub上面上傳了這樣一個計算機視覺的項目&#x…

2024年華為OD機試真題-停車場車輛統計-C++-OD統一考試(C卷D卷)

題目描述: 特定大小的停車場,數組cars[]表示,其中1表示有車,0表示沒車。車輛大小不一,小車占一個車位(長度1),貨車占兩個車位(長度2),卡車占三個車位(長度3),統計停車場最少可以停多少輛車,返回具體的數目。 輸入描述: 整型字符串數組cars[],其中1表示有車,0…

通過Python爬取公告內容

在網絡時代&#xff0c;信息獲取變得更加便捷。通過網絡爬蟲技術&#xff0c;我們可以從互聯網上快速獲取各種信息。本文將介紹如何使用 Python 爬蟲工具從指定網站上獲取公告內容&#xff0c;并提取其中的關鍵信息。 1. 簡介 在本文中&#xff0c;我們將使用 Python 的 requ…