亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Unity項目中如何實現資源管理

發布時間:2022-01-05 14:32:39 來源:億速云 閱讀:206 作者:小新 欄目:大數據

小編給大家分享一下Unity項目中如何實現資源管理,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一個3D游戲項目中的資源主要由貼圖、模型、動作、聲音等組成。模型設計師設計模型,場景由模型組成,角色不僅是一個精致的模型還帶了各類的動作,包括走路、跑步、待機、攻擊等等。各類基礎資源構成了游戲的大部分元素。

在我做的劍俠世界手游項目里面有上萬的材質,主城更是有7000+的模型。每個角色可以有不同的外裝、發型、武器、掛件、坐騎等等。承載這么多資源對內存以及性能都有非常高的要求。一個優秀的資源管理方案可以承載更多內容,滿足更多的需求。

貼圖資源配置

對于這資源管理,Unity提供非常豐厚的支持。以貼圖為例子,Unity支持直接把原始貼圖直接放進工程,不需要做任何額外處理。Unity根據貼圖配置會自動生成最后的貼圖數據。不同平臺(IOS、Android、PC)支持的貼圖格式不一樣,通過配置文件的形式,最后方便的生成不同格式的貼圖。這是一個非常好的做法,同時可以直觀的在開發環境看到不同格式的貼圖表現。

Unity項目中如何實現資源管理

可以看到上圖,貼圖的配置屬性非常多。不同的貼圖會有不同的配置,有些屬性的配置對內存和性能會有較大的影響。下圖可以看到現在這是一張 512 X 512的RGB貼圖,內存大小為1M。如果限定使用50M的貼圖內存的話,那只能加載50張貼圖,這明顯是不夠用的。

Unity項目中如何實現資源管理

三維計算機圖形渲染中一個常用的技術被稱為Mipmap。為了加快渲染速度和減少圖形鋸齒,貼圖被處理成由一系列被預先計算和優化過的圖片組成的文件。對于UI使用的2D貼圖,我們需要關閉Mipmap避免精度損失。同時在測試中我們也發現開啟Mipmap并沒有帶來多少性能提升,在手游的場景中,我們的視距非常近,并沒有過多這方面的需求。同時關閉Mipmap我們能節約33%內存,這是一個比較不錯的提升。關閉Mipmap后,我們看到貼圖變成了0.8M,這里應該是768KB。

Unity項目中如何實現資源管理

一個不小的提升,不過還是要注意,這是測試之后做的決定,不同情況下的決策是不一樣的。

接下來討論貼圖壓縮,ETC是所有Android都接受的格式,這個格式的壓縮質量較差。但在大部分情況下,很難在手機那么小的屏幕上看到差異,渲染本身就是一件視覺欺騙,如果覺得滿意那就沒問題。ETC 2對圖片質量有較大的提升,但是需要 OPGL ES 3.0 以上才支持,這個要根據支持的機型做決定。這里不對壓縮格式做過多的討論,詳情見Unity官方文檔。

設置壓縮格式為ETC后貼圖的大小為128KB,減小了6倍,這是一個非常大的提升。

Unity項目中如何實現資源管理

再來說說Max Size這個屬性,真的需要512X512這么大的一張貼圖么,256X256是不是足夠了。做出這樣的決定,然后在真機上看看效果,貼圖大小限制成256后,最后的貼圖大小為32KB。總計減少了32倍,現在我們可以加載1600張貼圖了,相信這個數字能滿足大部分項目的需求了。

Unity項目中如何實現資源管理

最后來說說Read/Write Enable這個屬性,如果打開這個屬性,會使運行時貼圖大小翻倍,內存中會額外存儲一份貼圖數據。在大部分情況下這是不必要的,所以默認關閉這個屬性,在需要的時候開啟。

在這種最優的配置下我們使貼圖大小縮小了64倍,從開始的25張到最后的1600張,令人驚奇的優化。資源格式配置在整體資源管理中屬于最基礎的模塊,但同時也是最重要的模塊,他決定了你能顯示多少資源。

資源配置工具

正常情況下貼圖資源使由美術提交,不同種類的貼圖有不一樣的配置文件,Ios的配置格式和Android也會有區別。很難要求美術對資源配置這塊有深入的理解,同時每次都要配置一些屬性也顯的非常麻煩。這時候就需要程序來幫忙做一些工作了。

首先根據前面的認識,我們抽離出部分屬性設置。

public class TextureImportData : ImportData 
{
    public TextureAlphaMode AlphaMode = TextureAlphaMode.FormTexture;
    public TextureImporterType TexType = TextureImporterType.Default;
    public TextureImporterShape ShapeType = TextureImporterShape.Texture2D;
    public TextureImporterFormat AndroidFormat = TextureImporterFormat.ETC2_RGB4;
    public TextureImporterFormat IosFormat = TextureImporterFormat.PVRTC_RGB4;
    public bool ReadWriteEnable = false;
    public bool MipmapEnable = false;
    public int MaxSize = -1;
}

然后可以給一個貼圖應用這個配置

public static void FormatTexture(string path, TextureImportData data)
{
    TextureImporter tImporter = AssetImporter.GetAtPath(path) as TextureImporter;
    if (tImporter == null) return;

    if (tImporter.textureType != data.TexType)
    {
        tImporter.textureType = data.TexType;
    }
    tImporter.isReadable = data.ReadWriteEnable;
    tImporter.mipmapEnabled = data.MipmapEnable;

    if (data.MaxSize > 0)
    {
        tImporter.maxTextureSize = data.MaxSize;
    }

    TextureImporterPlatformSettings settingAndroid = tImporter.GetPlatformTextureSettings(EditorConst.PlatformAndroid);
    settingAndroid.overridden = true;
    settingAndroid.format = data.GetFormatByAlphaMode(data.AndroidFormat, tImporter);
    settingAndroid.maxTextureSize = tImporter.maxTextureSize;
    tImporter.SetPlatformTextureSettings(settingAndroid);

    TextureImporterPlatformSettings settingIos = tImporter.GetPlatformTextureSettings(EditorConst.PlatformIos);
    settingIos.overridden = true;
    settingIos.format = data.GetFormatByAlphaMode(data.IosFormat, tImporter);
    settingIos.maxTextureSize = tImporter.maxTextureSize;
    tImporter.SetPlatformTextureSettings(settingIos);

    tImporter.SaveAndReimport();
}

最后和美術做了一個約定或者說規范,可以按目錄和一個正則來批量設置貼圖格式。

一般來說十幾條規則就能覆蓋所有情況,如果有疏漏,增加一個規則即可。這里還要需要考慮一個細節問題就是如果一個文件被多個規則覆蓋怎么辦。設想一開始添加的是一些通用規則,后面添加的則是一些特殊規則。而且按照一條條規則去設置屬性,后面的規則也會覆蓋前面的規則。所以這里只用引入一個規則配置的順序屬性即可,順序可以修改,以順序靠后的規則為準。然后為了方便查看,還可以記錄當前規則下貼圖的數量以及大小,這樣有一個更加直觀的認識。

public class ImportData {
    public string RootPath = "ArtWorks";
    public string FileNameMatch = "*.*";
    public int  Index = -1;
    public int  TotalCount = 0;
    public int  TotalMemuse = 0;
    public bool PreBuild = true;
}

設計完了數據,最后就是實現一個窗口界面方便來配置這些屬性,同時可以把需要的信息都顯示窗口上。窗口是直接用Unity的API實現了,還是非常方便的。

Unity項目中如何實現資源管理

最后我把資源配置工具交給技術美術(Tech Artist)來使用,美術這邊有需求有調整,直接配置即可,不需要繼續來參與。

項目中的資源管理

然后考慮是否有資源漏配,資源配置是否合理,目前我們資源處于一個什么樣的情況?需要一個方案來獲取更多信息。上面的工具已經看到能統計貼圖的資源大小,實現一個函數可以導出資源使用情況的統計,以及按大小排序的資源列表。然后把每次統計結果保存下來,對比每天的統計結果可以觀察到項目中的一個資源增長情況。

Unity項目中如何實現資源管理

我特意選了一張有問題的貼圖列表,可以觀察到如果配置有問題,很容易在列表中暴露出來。

還有一些想法沒有實踐,比如不僅顯示貼圖大小,還顯示貼圖的壓縮格式。知道這張貼圖的大小是2M,但是不知道是壓縮前2M還是壓縮之后的。同時項目中不可避免的還是存在重復貼圖,可以考慮程序實現一個功能做重復貼圖對比等等。

不過要考慮投入成本與收益,關注Top10與每日的資源變化已經對項目有一定程度上的把控。可以把精力放到更關鍵的產品開發上,這里實際做了產品質量的保障。

以上是“Unity項目中如何實現資源管理”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

道孚县| 东至县| 攀枝花市| 宝鸡市| 桦南县| 民丰县| 肃南| 石门县| 鄂托克前旗| 郓城县| 孟津县| 建宁县| 鄂伦春自治旗| 江永县| 济宁市| 灵宝市| 木兰县| 固原市| 屏山县| 唐海县| 弥渡县| 都昌县| 娱乐| 霍山县| 广西| 集贤县| 桐柏县| 惠来县| SHOW| 盖州市| 阳信县| 楚雄市| 夏河县| 叶城县| 平塘县| 饶平县| 固镇县| 锡林浩特市| 砀山县| 高雄市| 邵阳市|