This CL also updates the bounding box computation, previously the bounds were computed on LOD0 render data, ie after the nanite cut. Now the bounds of either the HiRes SourceModel, or high-res LOD0, are combined with the final LOD0 bounds.
#rb brian.karis, richard.talbotwatkin, jimmy.andrews, david.hill
#rnx
#jira none
#ROBOMERGE-SOURCE: CL 15485739 in //UE5/Release-5.0-EarlyAccess/...
#ROBOMERGE-BOT: STARSHIP (Release-5.0-EarlyAccess -> Main) (v771-15082668)
[CL 15485742 by ryan schmidt in ue5-main branch]
Phase 1 adds the async compilation without introducing any higher-level awareness.
This step provides the biggest performance improvements by allowing skeletal mesh to be compiled in
multiple threads but stalls are expected to occur before the level has finished loading as soon as
properties of skeletal meshes are accessed by the game-thread.
- Make skeletal mesh reduction and renderdata building thread-safe where needed
- Add protection on all USkeletalMesh accessors so the game-thread can wait on data still being built if needed
- Modify both PostLoad and Build to be async when the feature is enabled
- Make FRawSkeletalMeshBulkData::LoadRawMesh thread-safe
- Fix some PropertyChangedEvent name comparison to use strongly typed GET_MEMBER_NAME_CHECKED
- Add an experimental setting options to enable the feature (disabled by default for now)
DEBUGGING
- Can be forcibly enabled/disabled through command-line via -asyncskeletalmeshcompilation=[off, on, paused]
- Can pause skeletal mesh compilation using Editor.AsyncSkeletalMeshCompilation = 2 or -asyncskeletalmeshcompilation=paused
- Can manually resume a specified amount of paused compilation using Editor.AsyncSkeletalMeshCompilationResume [Num]
- Can forcibly wait on all compilation using Editor.AsyncSkeletalMeshCompilationFlushAll
BENCHMARKS
Tested on AMD TR 3970X with 256GB RAM
- 6m50s to 2m58s for loading P_Construct with a local-only DDC that doesn't contains any prebuilt skeletal mesh
- 3m10s to 39s for importing 299 SK with the Interchange framework
TESTS
- Opened all 5769 SK from FortniteGame to exercise all legacy conversion code paths
- Opened all 102 SK from QAGame
- Opened P_Construct, Apollo_Terrain, LumenTest, P_World
- Imported 299 SK with and without Interchange activated
- Ensure no new regression introduced in any of the 70 SK related tests from EngineTest
- Run all FBX import test in EngineTest
- Cook / Run ShooterGame Client
#rb Alexis.Matte
[CL 15452895 by danny couture in ue5-main branch]
Common mistakes:
a) TRACE_CPUPROFILER_EVENT_SCOPE("Foo") or TRACE_CPUPROFILER_EVENT_SCOPE("FClass::Foo")
--> results in a timer named "Foo" or "FClass::Foo" (the quotes will be included in the name)
b) TRACE_CPUPROFILER_EVENT_SCOPE(TEXT("Foo"))
--> results in a timer named L"Foo" (L and quotes will be included in the name)
c) TRACE_CPUPROFILER_EVENT_SCOPE_TEXT(TEXT("Other Foo")) or TRACE_CPUPROFILER_EVENT_SCOPE_TEXT("Foo")
--> Slow! It will use dynamic string matching that adds an unnecessary overhead.
Correct usage:
TRACE_CPUPROFILER_EVENT_SCOPE(Foo)
TRACE_CPUPROFILER_EVENT_SCOPE(FClass::Foo)
TRACE_CPUPROFILER_EVENT_SCOPE_STR("Other Foo") // when timer name has spaces
TRACE_CPUPROFILER_EVENT_SCOPE_TEXT(*Foo.ToString()) // only if a dynamic name is really needed
#rb Catalin.Dragoiu
#fyi Marc.Audy, Krzysztof.Narkowicz, Rune.Stubbe, Michal.Valient
[CL 15134822 by ionut matasaru in ue5-main branch]
Adding a public member to USkeletalMesh class is now prohibed since it can break asynchronous operations that will be added next to this submit.
#rb danny.couture
#jira UEENT-3936
#rnx
[CL 14812920 by Alexis Matte in ue5-main branch]
This is later used to build static mesh derived data in cases where Nanite coarse mesh representation replaces original static mesh data and we can't depend on it. In extreme cases it lowers main thread derived data build time from ~7.5s to ~0.1s.
#rb Richard.TalbotWatkin
[CL 14578414 by Krzysztof Narkowicz in ue5-main branch]
Fixed tangents not being derived resulting in no welding for mip0 of Nanite
Ignore bHasColor from mesh desc and check if any non-white.
Misc clean up
#rb rune.stubbe
[CL 14223322 by Brian Karis in ue5-main branch]
Prepared direct attribute access for deprecation, preferring use of APIs to access static mesh attributes.
Fixed recently merged Enterprise code to comply with new APIs.
Changed all tools to use triangle-centric iteration where possible.
Added new MeshAttributeArray APIs for querying attribute flags, and added a new Mandatory flag.
Various bug fixes.
#rb Alexis.Matte
[CL 13873755 by Richard TalbotWatkin in ue5-main branch]
- Removed hardcoded element type arrays (Vertices, Edges, Triangles etc.). Mesh element types can now be arbitrarily added, with any number of channels.
- Mesh element containers have a much leaner format; instead of sparse arrays, they are now represented by a simple bitarray, determining whether an index is used or not. Consequently, mesh topology is now entirely described with the attribute system, e.g. edge start and end vertices, triangle vertices, etc.
- Support added for attributes of arbitrary dimensions, e.g. float[4] or int[2].
- Support added for attributes which index into another mesh element container.
- Added FMeshElementIndexer: this is an efficient container for maintaining backward references from one element type to another; for example, edges have an attribute specifying which vertices are at each end (an attribute of type FVertexID[2]). With an indexer, it is possible to look up which edges contain a given vertex, even though this is not explicitly stored. Indexers are designed to do minimal allocations and update lazily and in batch when necessary.
- Added support for preserving UV topology in static meshes. UVs are now a first-class element type which may be indexed directly from triangles.
- Added the facility to access the underlying array in an attribute array directly.
- Triangles now directly reference their vertex, edge and UV IDs. Vertex instances are to be deprecated.
- Changed various systems to be triangle-centric rather than polygon-centric, as this is faster. Triangles are presumed to be the elementary face type in a MeshDescription, even if polygons are still supported. The concept of polygons will be somewhat shifted to mean a group of triangles which should be treated collectively for editing purposes.
- Optimised normal/tangent generation and FBX import.
- Deprecated EditableMesh, MeshEditor and StaticMeshEditorExtension plugins - these are to be removed, but they still have certain hooks in place which need removing.
#rb
[CL 13568702 by Richard TalbotWatkin in ue5-main branch]