Added functionality to strip at ratios higher 1 out of every 2. testing shows good savings at stripping 2/3 frames on switch and in editor of around 8mb with no noticeable visual degradation.
2 Cvars added "a.Compression.UseVaribleFrameStripping" & "a.Compression.VaribleFrameStrippingRatio" which enable and change the amount of variable stripping.
In addition added 3 variables to anim sequences bOverrideVariableFrameStripping, UseVariableFrameStripping& FrameStrippingRatio; which allow you to override any stripping options on a per asset basis. mainly for the purpose of the case that a particular animation is behaving badly under higher stripping you don’t have to lower the whole platforms stripping to accommodate.
#preflight 642305be803cb466e858b86e
#rb alex.nischwitz
[CL 25343990 by nick baltis in ue5-main branch]
Showing the asset discovery dialog and preventing the plugin creation until the asset discovery is complete.
#rb Rex.Hill
#preflight 645008286538e45f75c38ccb
[CL 25292941 by will brown in ue5-main branch]
NOTE: This could significantly lengthen advanced copy destination paths, potentially blowing past the path character limit normally enforced by UE. In it's current state, the copy will just proceed normally -- seemingly working. This is probably something to investigate more, but doesn't appear to be a high-pri issue atm. A JIRA has been logged to capture this though: UE-182280
[FYI] brooke.hubert
#rb brooke.hubert, francis.hurteau
[CL 24916196 by mike beach in ue5-main branch]
Fix a mistake made in CL24423110 where the class path name added to the filter was from a UClass instead of being from the supported class that the filter is supposed to use
#jira UE-178311
#rb lauren.barnes
#preflight 64107c81af3fc35292164cb9
[CL 24634892 by thales sabino in ue5-main branch]
The "AssetTools.AdvancedCopyConsolidationMethod" CVar can control how frequently the consolidate runs, and there are three options available:
* Lazy - Run a consolidate once at the end for all assets and dependencies combined. The fastest method.
* PerAsset - Run a consolidate once for each asset combined with its dependencies. This is very slow, but is the default method for safety.
* PerAssetDependency - Run a consolidate once for each asset dependency. This is incredibly slow, and is only included for regression testing.
When copying ~1,600 assets the different methods produce the following results:
* Lazy: 222 seconds (~4 mins)
* PerAsset: 1818 seconds (~30 mins)
* PerAssetDependency: 5000 seconds (~83 mins)
#preflight 64011e5b1d304a547165e646
[CL 24511426 by jamie dale in ue5-main branch]
This will use the Factory supported class as a filter for assets in the Save Asset As dialog. Before this change anyone using this function would get a dialog that displayed all assets in the project.
This also makes it consistent with how Save Level As works, which only shows Levels in its dialog
#jira UE-178311
#rb lauren.barnes
#preflight 63fcbf93dd78dd50f68424b8
[CL 24423110 by thales sabino in ue5-main branch]
There is a host of functionality in the engine requiring looking up an AssetTypeAction object that best maps to a given class. The metric of 'best' is the AssetTypeAction whose SupportedClass is the closest to the given class in a hierarchy.
The existing implementation searches through all AssetTypeActions (at time of writing, > 200) and queries each for their SupportedClass and then chooses the one whose SupportedClass is closest to the given class.
The improvement here exploits that UClass is the type information of UObjects, and UObjects don't support multiple-inheritance (ie. only one SuperClass). Therefore we can walk the class hierarchy from the given Class up to find
the best AssetTypeAction. This changes the linear search (with # of AssetTypeActions) to a nominal sub-linear search (with depth of inheritance).
To be able to do that, a new map was added that associates a registered AssetTypeAction's SupportedClass with the AssetTypeAction's index in it's array. This lets us do a constant time lookup at the cost of a bit of memory.
There is further room for improvement with the usage of UFactory's public member functions such as `GetDisplayName`, `GetMenuCategories` and similar which still necessitates this query. Opportunity exists in the NewAssetContextMenu and in the API of IAssetTools::GetNewAssetFactories
to generate a more performance oriented data structure. There is also some opportunity to improve the construction of a FSoftClassPath from a UClass which can be fairly expensive. These all feed into the performance issue but ultimately this is the smallest change that provides the largest improvements at the lowest risk.
Testing:
Using debugger stepped through startup/shutdown of the editor.
Artificially added duplicate registrations to check codepaths for adding AssetTypeActions that with same supported class
Added unregisters to check codepaths for unregister. Need to be careful with editor as AssetTool module is removed very early on outside of the usual lifetime of modules in EngineLoop::Exit so most AssetTypeActions do not actually get deregistered.
#jira UE-175345
#rb ronald.koppers
#preflight 63ed3f277e76998e9a66a676
[CL 24253312 by logan buchy in ue5-main branch]
[CrashFix] Removed invalid check()
- when I made assets diffable against null I must've missed this. Easy fix.
#jira none
#preflight trivial
#rb dan.oconnor
#lockout julien.marchand
[CL 24186475 by jordan hoffmann in ue5-main branch]
Moving an asset can replace the original asset with a redirector, so the source control system will consider the asset in the old location to be modified and the asset in the new location to be added.
#preflight 63e400085c0ce8f11b030df3
[CL 24090216 by stuart hill in ue5-main branch]
In addition, I refactored AssetViewUtils::SyncPathsFromSourceControl somewhat.
- Added alternative (preferred) way to get affected files/packages using the FSyncPreview operation as opposed to querying the AssetRegistry.
- Added support for hot reloading the world if one of its external packages (actor/object) got synced so those changes are reflected in the viewport.
- Added support for passing in either content paths or absolute paths to sync.
- Deprecated the 'bIsSyncLatestOperation' parameter from SyncPackagesFromSourceControl.
Note that SyncPackagesFromSourceControl now has a single internal caller (FAssetSourceControlContextMenuState::ExecuteSCCSync).
Note that SyncPathsFromSourceControl now has a single internal caller (FSourceControlWindows::SyncLatest).
[REVIEW]
#preflight 63e3a014244dc45a201c918d
[CL 24074948 by wouter burgers in ue5-main branch]
The following functions are new:
- ObjectPathToPathWithinPackage, eg) "/Game/MyAsset.MyAsset:SubObject.AnotherObject" -> "MyAsset:SubObject.AnotherObject"
- ObjectPathToOuterPath, eg) "/Game/MyAsset.MyAsset:SubObject.AnotherObject" -> "/Game/MyAsset.MyAsset:SubObject"
- ObjectPathToSubObjectPath, eg) "/Game/MyAsset.MyAsset:SubObject.AnotherObject" -> "SubObject.AnotherObject"
The behavior of ObjectPathToObjectName has also been fixed to always return the leaf-most object name within the path (eg, "/Game/MyAsset.MyAsset:SubObject.AnotherObject" -> "AnotherObject"). Any code that relied on the old behavior should use ObjectPathToSubObjectPath instead.
#preflight 63e2677e1020773a3f32f55b
#rb Matt.Peters
[CL 24057677 by jamie dale in ue5-main branch]