当前位置:首页 >> 综艺
综艺

幻境引擎资产管理总结

发布时间:2024-01-25 12:21 来源:综艺

tension"; the actual string to use is stored as a separate field on an FPackagePath */enum class EPackageExtension : uint8{// Header Segments/*** A PackageResourceManager will search for any of the other header extensions* when receiving a PackagePath with Unspecified*/Unspecified=0,/** A binary-format header that does not contain a UWorld or ULevel */Asset,/** A binary-format header that contains a UWorld or ULevel */Map,/*** Used when the owner of an EPackageExtension has a specific extension that does not match* one of the enumerated possibilies, e.g. a custom extension on a temp file*/Custom,// Other Segments};

过去,我们告诉了在初始化uasset的更进一步却说是是初始化与该Object相关的一系列Object,那么,涡轮又是如何管理机构所有并不需要中用的uasset的呢?解答是AssetManager。

三、AssetManager

当点击接入键时,涡轮则会基本功能接入这两项关卡的命题,在不想到手动管理机构的但会下,这两项Level教育资源的初始化都是涡轮基本功能帮你已放成的,这可以减低共同流程员的工作负担,但初始化更进一步仿佛变成了黑盒子,这不是大多数共同流程员愿意面对的大事,我们有时并不需要手动管理机构教育资源的初始化和释放出来、提高效率线程、换回取教育资源初始化开度等,涡轮也缺少了互换回的接口,那就是AssetManager类。

AssetManager是一个单例类,在C++中所让位快捷键可数后来并不需要在涡轮设立中所开行覆盖:

AssetManager缺少了一些教育资源初始化和丢弃,其中所配要的有:

/** Gets the FAssetData for a primary asset with the specified type/name, will only work for once that he been scanned for already. Returns true if it found a valid data */virtual bool GetPrimaryAssetData(const FPrimaryAssetIdCo PrimaryAssetId, FAssetDataCo AssetData) const;/** Gets list of all FAssetData for a primary asset type, returns true if any were found */virtual bool GetPrimaryAssetDataList(FPrimaryAssetType PrimaryAssetType, TArrayCo AssetDataList) const;/** Gets the in-memory UObject for a primary asset id, returning nullptr if it's not in memory. Will return blueprint class for blueprint assets. This works even if the asset wasn't loaded explicitly */virtual UObject* GetPrimaryAssetObject(const FPrimaryAssetIdCo PrimaryAssetId) const;virtual TSharedPtr LoadPrimaryAssets(const TArrayCo AssetsToLoad, const TArrayCo LoadBundles = TArray(), FStreamableDelegate DelegateToCall = FStreamableDelegate(), TAsyncLoadPriority Priority = FStreamableManager::DefaultAsyncLoadPriority);/** Single asset wrapper */virtual TSharedPtr LoadPrimaryAsset(const FPrimaryAssetIdCo AssetToLoad, const TArrayCo LoadBundles = TArray(), FStreamableDelegate DelegateToCall = FStreamableDelegate(), TAsyncLoadPriority Priority = FStreamableManager::DefaultAsyncLoadPriority);virtual int32 UnloadPrimaryAssets(const TArrayCo AssetsToUnload);/** Single asset wrapper */virtual int32 UnloadPrimaryAsset(const FPrimaryAssetIdCo AssetToUnload);

公开到样板中所的新方法:

这那时候多次显现了三个关键的各种类型:PrimaryAsset、PrimaryAssetType和PrimaryAssetId。

PrimaryAsset:配股票,接下来则会简述。PrimaryAssetType:配股票各种类型,对配股票开行定义的标签。FPrimaryAssetId:配股票ID,可用对配股票想到唯一上标,保护PrimaryAssetType和PrimaryAssetName资讯,在样板中所的换回取方法: struct FPrimaryAssetId{/** An FName describing the logical type of this object, usually the name of a base UClass. For example, any Blueprint derived from APawn will he a Primary Asset Type of "Pawn"."PrimaryAssetType:PrimaryAssetName" should form a unique name across your project. */FPrimaryAssetType PrimaryAssetType;/** An FName describing this asset. This is usually the short name of the object, but could be a full asset path for things like maps, or objects with GetPrimaryId() overridden."PrimaryAssetType:PrimaryAssetName" should form a unique name across your project. */FName PrimaryAssetName;}/** * A primary asset type, represented as an FName internally and implicitly convertible back and forth * This exists so the blueprint API can understand it's not a normal FName */struct FPrimaryAssetType{/** Convert from FName */FPrimaryAssetType() {}FPrimaryAssetType(FName InName) : Name(InName) {}FPrimaryAssetType(EName InName) : Name(FName(InName)) {}FPrimaryAssetType(const WIDECHAR* InName) : Name(FName(InName)) {}FPrimaryAssetType(const ANSICHAR* InName) : Name(FName(InName)) {}/** Convert to FName */operator FNameCo() { return Name; }operator const FNameCo() const { return Name; }/** Returns internal Name explicitly, not normally needed */FName GetName() const{return Name;}private:friend struct Z_Construct_UScriptStruct_FPrimaryAssetType_Statics;/** The FName representing this type */FName Name;};

AssetManager缺少了很多初始化丢弃配教育资源的新方法和AssetBundle相关的函数,那么什么是配股票呢?

Primary and Secondary Assets某个买回来出来的新游戏开始接入,如果不手动自行决定一个“Default Map”,流程是不告诉开始开入哪个故事情节的,也来得不清初楚该初始化哪些教育资源,而一旦自行决定了某个Level作为配故事情节,流程就则会初始化该故事情节以及一切所述到的教育资源。

在这那时候,Primary Asset是要自行决定的Level,Secondary Assets是Level所举例来说的其它被所述到的股票,之外Mesh、Texture、Audio等等。

真实世界涡轮中所的股票管理机构系统将所有股票举例来说两种各种类型:Primary Asset和Secondary Assets。Primary Asset可以由AssetManager通过它们的配要PrimaryAssetId从外部操作,它是通过调用GetPrimaryAssetId获得的。Secondary Assets不是由股票管理机构器从外部检视的,而是由涡轮基本功能初始化,以自发被配要股票所述或用作。(愿意解法释清初了)

Primary and Secondary Assets的辨别虽然大概定义探讨法了,但是就其到某个股票的时候,要如何想到辨别呢?却说是有一个特别单纯的方法,就是将鼠标移置到互换回股票下,股票详述资讯就则会有所推断:

Primary Asset的资讯:

Secondary Assets的资讯:

他们的区别就是,Primary Asset是则会标上PrimaryAssetType和PrimaryAssetName资讯的。

让位C++类的样板背离为Primary Asset为了将来自特定UObject类的股票自行决定为Primary Assets,覆盖GetPrimaryAssetId以返回一个有效率的FPrimaryAssetId结构上体,如:

virtual FPrimaryAssetId GetPrimaryAssetId() const override;FPrimaryAssetId AMyActor::GetPrimaryAssetId() const{UPackage* Package = GetOutermost();if (!Package->HasAnyPackageFlags(PKG_PlayInEditor)){return FPrimaryAssetId(UAssetManager::PrimaryAssetLabelType, Package->GetFName());}return FPrimaryAssetId();}

改以PrimaryAsset有什么用呢,当然是通过AssetManager对其初始化想到管理机构了。

现阶段为止,UWorld是涡轮默认唯一的配股票,互换回的C++也对其GetPrimaryAssetId新方法想到了重写到:

几天后却说了如何将样板股票背离为配股票,那么其他各种类型如Mesh或者Texture不该如何背离为配股票呢,解答是用作Data Asset。

四、Data Asset

创始人Data Asset的方法很单纯,如下三幅:

不过并不需要天内同样一个让位UDataAsset的函数调用,当然如果想用作配股票,就得让位UPrimaryDataAsset,在类中所填土充互换回并不需要的股票所述,并且这个函数调用并不需要重写到GetPrimaryAssetId()新方法,自行决定快捷键的PrimaryAssetType(可以概要map的借助方法)。

并不需要相反的是上述的创始人Data Asset的方法实际上是创始人了一个指定函数调用的实例:

当创始人了互换回的Data Asset后来,就可以调用AssetManager中所的新方法换回取并初始化教育资源了,可以同样互联或者异步开行初始化:

等一下,其实感相反了什么?无疑。相反了一项更加关键的设立:告诉涡轮自行决定PrimaryAsset的位置。

因为先前谈到过,如果不告诉涡轮你并不需要初始化PrimaryAsset,比如Default Map,涡轮是不则会去初始化它的,除非你在某个位置对它开行了所述。那么,要在哪那时候设立呢?看下三幅:

并不需要填土的资讯:

Primary Asset Type:Data Asset函数调用中所自行决定的PrimaryAssetTypeAsset Base Class:自行决定的Data Asset函数调用Has Blueprint Class:指这个各种类型是否有样板股票(Data Asset不是样板),一般是C++货物运输新方法的才有Directories:Data Asset所在的档案夹Rules:前面讲买回来模版的时候则会却说

其他的默认看Tip原则上能探讨法就不却说了。

想到好设立后来就可以用AssetManager初始化、丢弃教育资源了。

相反大事项:虽然AssetManager缺少了丢弃Primary Asset的新方法,但是只有在必要该Primary Asset不想所述,才则会被垃圾场多余在合适的时间段开行多余。

五、Data Table,Curve Table,Data Registry

却说是这三兄弟和Data Asset的关系不大,它们配要作用是加载数据集,然后在接入时初始化,如果要讲不太可能要单独写到一篇关于其他配题的细节了,所以这那时候不多简述。

到现阶段为止,想讲的为基础讲放了,接下来才是本文重点项目。

六、异步初始化

上头却说过,涡轮开始初始化某个Level,是通过一层层所述初始化互换回的股票和Class的,如果某个Level联系着PlayerCharacter(原则上上是确实的),然后PlayerCharacter身上又所述了更加多的其他类和教育资源,那就假定涡轮加倍相当稍长的时间段去初始化这些股票,而且很这样一来大一小联系的股票在或许用不到,初始化速度慢,耗用大量线程,很确实这不是我们想要的,那要怎么解法决这种线程相关和所述相关的弊端呢?除了上头所却说的Assetmanager想到股票管理机构,还并不需要涉及到另一个好像:异步初始化教育资源。

为什么却说异步初始化教育资源可以解法决上述弊端,举个例子:PlayerCharacter身上由于不可消除的或许所述了现阶段不并不需要的类,这个类或者样板身上载运大量的Texture等空置线程教育资源的股票,如果不用作大块所述或者异步初始化这些教育资源,就假定只要依赖于PlayerCharacter,这些空置的空间就不则会被释放出来(因为垃圾场多余只有在不想所述的时候才则会多余空间),而如果用作大块所述,在并不需要的时候通过异步初始化的方法初始化股票,这样就能能避免所有被所述的股票在一开始全部一股早先初始化开线程。那么在样板中所哪些但会则会视作依赖于所述呢?我论述了以下几种但会:

以下方法认作被所述:

1.创始人某各种类型数值,不管是否为空,这个类以及它所述的类和股票则会被所述,这是最从外部的所述方法

2.CastTo(强转数据流)强转成互换回类也则会对该类开行所述,听起来看似难解法所述,但是来得难的还在前面。

3.Get All Actors/Widgets

此数据流性能差,一般能存成链表就用链表了,但依然没法躲开所述的关系。你却说用函数传参行不行,痛心,也不行。

4.函数数值,数值类也则会被视作依赖于所述

但最恶心的是示例这种:

5.已经被遗弃的,不想连接在样板中所的数据流数值,因为误删了一些数值,然后又不想连线,所以编译能通过,却依赖于对已被遗弃的数值的所述,所以一定不用看来只要把样板数据流连着就算放大没事了。

例如:BP_Actor依赖于的所述:

BP_Character的所述来自这那时候:

那么,要如何避开类与类中间的所述呢,特地继续看。

解法所述解法所述是一个繁复的更进一步,并不需要有好的计划的系统作为为基础,同时在写到样板的时候要检视好数值与各种数据流的用作,我们也不并不需要过分去解法所述而毁损了计划结构上或者繁复化借助单纯命题,这样就得不偿失了,这那时候有一个合适的“度”并不需要根据计划去衡量。

缺少几种方法解法所述:1.大块所述合理

但是并不需要对比一下示例这几种但会:Actor函数调用数值:

Texture2D数值:

样板类数值:

从提示中所可以得出结论:以C++为类为数值的各种类型,则会被视作大块所述,而如果数值是样板类,则依然则会被从外部初始化所述,这也是为什么Reference Viewer中所样板类数值则会被视作大块所述的或许:

大事实上,一般但会都是将大股票(Texture,Mesh)之类的设立为Soft Object,将样板类数值设立为Soft Object意味不大。大块所述的并不一定是加载的互换回方向上类全名名字,在并不需要的时候异步初始化,但探讨一件大事:当我们将大块所述单纯初始化出来后强转成互换回各种类型或者将它保存为某个数值,大块所述的作用还依赖于么?确实没啥意味,换回想到是Texture,就无伤大雅了,如果你愿意类与类中间脱离所述的关系,不妨试一下示例两种方法。

2.多让位和接口如果却说Soft Object配要是用来检视股票的所述的关系,那么让位方法就是检视类与类中间解法所述的方法了。比如说我们则会看到这样一种设计:一个函数调用样板依赖于它所并不需要的大一小,只是所所述的股票全部为空,而它的可数也不想什么过多货物运输新方法和扩展,并不相同之处在于可数所述的股票依赖于互换回的教育资源(大块所述或者大块所述),这么想到有什么坏处呢?却说是坏处就是消除了CastTo数据流造成可数和可数中间的所述,只原有父类中间的所述的关系就好,这是一种我看来相对好的解法所述的方法。

3.委托委托家伙是解法所述的神器,当我们愿意连父类中间的所述的关系都不依赖于时,那么委托是一个绝佳同样,只要想到时间段指示就好,至于委托怎么用作我就不多却说了,很单纯。

却说是以上几种方法不该是能满足很多但会了,如有其他方法注目批评家却说明。

七、买回来所述

涡轮通过所述的方法从配股票开始初始化所需教育资源,在插件中所如此,买回来计划也是如此,自行决定配股票并且根据所述的关系查找所有中用的教育资源,但是并不需要相反的是,当我们用作了上述的大块所述方法,涡轮就则会看来你不想对该股票开行用作,也就不则会将它买回来开新游戏包体中所,或者如果所需教育资源在任意偏远地区都不依赖于所述,但是却并不需要将该教育资源买回来开计划中所,就并不需要在涡轮的设立中所手动填土充互换回股票的方向上,告诉涡轮,这个档案夹下的股票也并不需要买回来到新游戏那时候面。当然你也可以同样哪些股票不用被买回来开新游戏:

不过我想却说的重点项目是如何对包头想到模版检视。为什么要模版包体?或许很单纯,为了方便不足之处来得新保护,共同流程员不愿意因为不足之处想到了一点点改动,就并不需要对整个新游戏包体都想到来得新,玩家也不想因为共同流程员改了几个bug就重新下载一遍新游戏,那么解法决方法就是对包体开行模版,然后共同开发DLC也是同样到理,而且模版不应过多,过多就假定压缩来得小,包体来得大,而过少就假定来得新则会很麻烦,想到好其中所的权衡很关键。

PAK模版新游戏买回来后来数据集则会被籓PAK档案当中所,像这样:

想要对配股票开行模版,并不需要中用PrimaryAssetlabel,创始人Data Asset并让位PrimaryAssetlabel。

打开后来就是这样:

数值却说明:Priority:这两项,数值越大,对股票的管理机构权来得高,换回句话却说,如果一个股票同时满足两个PrimaryAssetlabel前提,这个股票则会送与Priority数值大的。

Chunk ID:这两项模版的ID,与PAK档案全名名字互换回,-1默认是pakchunk0中所。

Ccook Rule:示例简述。

其他的相对单纯,就是同样互换回方向上下的股票或者自行决定股票由此PrimaryAssetlabel开行管理机构。

设立好后来很这样一来并不相同Chunk之外所引入了相同的教育资源,那么我们要如何判断股票属于哪个块,以及每一个块的大小不一呢,前面简述。先却说一下Cook。

Cook什么是Cook(烘焙)?

Cook单纯而言就是对“没用”股票的设想更进一步,比如在日常共同开发更进一步中所,我们并不需要调试,以及有些功能只有在插件下才最简单,股票中所也则会载运与正式发布版无关的功能或者相关细节,Cook的更进一步就是对这一类我们不并不需要的好像想到剔除,然后只原有新游戏相关的一小,这个更进一步就是的Cook。

探讨法了Cook的概念再行对上头想到数值简述的时候有关Cook的一小这那时候想到一下却说明:

Unknown:相当于基本功能Cook,如果有对此教育资源的所述就Cook,如果不想就不CookNever Cook:决不Cook,如果依赖于对它的所述则会报错Development Cook:在Development买回来前提下有所述就则会CookDevelopment Always Cook:在Development买回来前提下活着则会CookAlways Cook:在Development或者Ship买回来前提下活着则会Cook

论述:只要有对股票的所述,就不该想到Cook操作。

Cook前后股票对比:

三幅片涡轮中所的股票大小不一

Cook后来的大小不一

从对比应为,Cook前后股票大小不一的变化,一般则会减小,因为去掉了插件相关的一小。

八、可视化工具

上头谈到了一些工具,这那时候想到一下论述:

Reference Viewer某个股票的所述的关系,可以推断Soft Reference和Soft Reference,以及互换回的配股票,可用解法所述:

Audit Asset股票模版工具,可用核对某个或者模版股票的“相对正确”的大小不一,并不代表最终买回来后的大小不一,如果想要核对自己模版的大小不一,想到天内将细节开行Cook:

Cook已放成Refresh则会多Windows默认:

多创始人几个然后买回来,要相反股票的划分方法,能避免相同的被放到两个Chunk中所:

Size Map可用核对股票空置大小不一,通过它提高效率某个大股票:

线程号令Memreport则会保存这两项线程用作但会,也可开行调试。

九、论述

到现阶段为止,不该算得讲清初楚了涡轮如何买回来找到并不需要的股票、股票中间的所述方法、如何手动管理机构配股票的初始化和丢弃、以及对线程的提高效率与调试,先前还有很多,之外UE5又出了Game Feature等新的共同开发的系统,以及就其数值可以看官网应用流程,有时间段再行却说明。

所述Asset Management

Asset Management | Unreal Engine 4.27 Documentation

[全名录影]Asset Manager 说明了 | Asset Manager Explained(官网字幕)_哔哩哔哩_bilibili

[全名录影]Asset Manager 说明了 | Asset Manager Explained(官网字幕)_哔哩哔哩_bilibili

[中所文录影]第33期 | UE4股票管理机构为基础1 | Epic 大钊_哔哩哔哩_bilibili

「关键字」

买回来计划

买回来计划 | 真实世界涡轮应用流程

Cooking and Chunking

Cooking and Chunking | Unreal Engine 4.27 Documentation

这是侑虎科技第1461篇文章,感恩所写雪极光供稿。注目发送交友,未经所写授权时亦刊出。如果您有任何精妙的见解法或者辨认出也注目联系我们,一起探讨。(QQ群人:465082844)

所写配页:

终于感恩雪极光的交友,如果您有任何精妙的见解法或者辨认出也注目联系我们,一起探讨。(QQ群人:465082844)

慢性胃肠炎吃什么药效果最好
阿莫西林胶囊治感冒吗
双醋瑞因和氨糖吃哪个好
多维元素片哪个牌子的好
蒙脱石散止泻效果好吗
相关阅读

等等党赢麻了!2K 180Hz高刷LCD被卷到了700多,省了好几千

我们都并不知道也很重要,盛色算是了△E 我们来看一组图片,...

江西一30万元彩票中奖者双重身份遭质疑,官方通报!

近日,浮梁县一居民中得“意境成都”即开型体育30万元,有大多不少人对中奖者身份透露质疑。为澄清事实,现将有关情况通报如下:2023年10月1日,在抱石公园社交活动现场零售商的一张“意境成都”即...

主管部门:我国智能制造装备产业规模近 3 万亿元

IT之家 9 月初 10 日消息,昨,工业部门和系统工程建设部举行“原先时代工业部门和系统工程建设蓬勃发展”系列主题原先闻发布会第六场,主题是“加快工业部门部门电子商务电子商务平板化蓬勃发展”。...

注意了!长期使用曲面显示器早就出现副作用

我近十年采用紧致发光二极管早就最多5年了,原本买紧致发光二极管也是看见商家宣传看电影紧致发光二极管可能会更加有流露出感。但是近十年采用紧致发光二极管激发的类药物早就显现出在我的身上。我看较宽的发...

国庆机票价格大跳水?平台对此

已爆满,根本能够候补等票,其中该线二等生产成本为669元,一等生产成本为1070元,零售业运价为2337元。而先当年几乎全价票但客座率依然不低的京津快运公常平,也迎来营收,京津中央线中国民航和...

友情链接