#rb Sebastian.Nordgren
#jira UE-169622
#rnx
#preflight 636d118e361bbd3c0ae5e116
- Recently we have had several incidents where there has been confusion if a VA payload pull that failed was initiated by a uncooked editor bulkdata or a cooked one. Adding the option to postfix the log message with this info for selected projects will make debugging this sort of thing easier in the future.
- Enabled by changing '[EditorBulkData]LogCookedStatus=' to true in the Editor ini file.
-- As this is only useful for projects that allow cooked content in the editor, if not then it is just noise so the post fix is disabled by default.
- Note that the check in FEditorBulkData::PullData should also be removed but that has been added as its own work item in JIRA.
[CL 23101614 by paul chipchase in ue5-main branch]
#jira UE-162160 #jira UE-142887 #rb ben.zeigler #rb benjamin.fox
FFieldPathProperty applies redirects on ImportText_Internal, automatically redirecting FFieldPath saved in string format for blueprint graph pins.
FGameplayAttribute applies redirects after deserializing unredirected value and fixes up derived properties, for UObject based assets with FGameplayAttribute properties.
UAttributeSet subclass renaming and adding ClassRedirect works now. Previously, FGameplayAttribute pins would show correct value in blueprint graphs but use incorrect value at runtime.
FGameplayAttribute renaming and adding PropertyRedirect works now. Previously, FGameplayAttribute fields in blueprint assets would break (null out), in addition to blueprint graphs using undirected value at runtime.
#preflight 636e638e8f4cb2e4dcf00c05
[CL 23098214 by zhikang shao in ue5-main branch]
#rb Per.Larsson
#jira UE-169760
#rnx
#preflight 636ce62bed07daaa9abef391
- This bug was introduced with the fix for UE-169114.
- A virtualized payload can always be accessed via the virtualization system so we have no reason to serialize it during a transaction.
-- To prevent this we simply don't try to load the payload into memory if it is virtualized.
- While investigating this I noticed an additional minor issue that the << overload added for FSharedBuffer was treating a 0 length valid FSharedBuffer and a null FSharedBuffer as the same thing which is not exactly the case.
-- A 0 length buffer will return false for FSharedBuffer::IsNull and will allocate an owner structure internally. A null buffer will not allocate an owner and will return true for FSharedBuffer::IsNull
-- This is a minor distinction which was unlikely to be causing problems but should be fixed for technical accuracy.
-- We now write INDEX_NONE for the buffer length if the buffer is null and when reading we simply reset the buffer if we see that the length is INDEX_NONE rather than trying to create a valid buffer.
[CL 23079600 by paul chipchase in ue5-main branch]
Add additional early outs from ProcessLinkerLoadPackageImports when a package has already been processed in a deeper circular dependency recursion stack.
Relax SyncLoadContextId constaints since when a package has been added to PackagesExcludedFromStateDependencyChecks due to a circular package dependency it may have been pulled into a higher sync load context id than the currently executing one.
#rb carlmagnus.nordin
#rnx
#preflight 636cb93963037c102604a566
[CL 23074568 by pj kack in ue5-main branch]
Make sure to always leave the waiting for io state if there are no more io requests to wait for.
#rb carlmagnus.nordin
#rnx
#preflight 636bdde4dc30a4ce960a9956
[CL 23071830 by pj kack in ue5-main branch]
Takeaways. Try to use "friend" on functions/operators that are frequently overloaded EXCEPT if they are in a templated type that is frequently instantiated. So do not put friends in TMap, TSet, TObjectPtr etc, this will slow down compile times. There is a break-even somewhere and hard to tell where it is but taking a class that is templatized on character type probably don't matter either way and then it is nicer to use a friend since that simplies error messages when compiler can't resolve functions/operators.
If it is possible to use member functions instead of friend that is the best option in terms of compile time performance. With c++20 you only have to write operator==(Foo, Bar) and the compiler will automatically provide operator==(Bar, Foo), operator!=(Foo, Bar) and operator!=(Bar, Foo).
Changes in this changelist involes
* Making operator<< friends in non-template types and not friends in template types
* Making operator==/!= members where possible and if not possible moved out if type is a frequently instantiated templated type.
#preflight 636970f5376a9cd6a80da54a
#rb steve.robb
[CL 23038965 by henrik karlsson in ue5-main branch]
Improve handling of ProcessPendingCDOs by relying on the SyncLoadContext instead of a combination of PendingIoRequestsCounter and ReferencerRequestId.
Only create CDOs for packages in the current sync load context when there is one.
Add and release barriers for all export bundle nodes, not only the first one.
#rb carlmagnus.nordin
#preflight 636a5903f56cab38c71d778b
[CL 23031398 by pj kack in ue5-main branch]
Disallow TObjectPtr use on complete non-UObject derived types.
#rb devin.doucette
#preflight 63633a910c2e7c8f91d2e4e9
[CL 22966926 by Zousar Shaker in ue5-main branch]
#rb Per.Larsson
#jira UE-169114, FORT-533633
#preflight 6363a60b876630122aea6b16
- I needed to remove the 5.0 optimization where we tried to avoid loading the payload into memory so that it could be serialized to the undo stack. This logic would not work if the package were saved later and we were therefor unable to access the payload on disk.
- The landscape bug was not caused by this (as saving landscape actors wipes the undo stack) but caused by the inability to unload the payload properly. If an undo restore was run from a state where the payload was in memory to a state where the payload was not in memory, then that payload would not unload properly.So the bulkdata would end up with members for one payload, but the data of a different payload.
- We now always load the payload into memory if it is not there already and decompress into shared buffer format. In theory we could support two paths here one for FSharedBuffer when the payload is in memory and one for FCompressedBuffer when it is loaded from disk but it doesn't seem worth the effort. If it comes up as a problem in a profile then we'd be better off trying to add a way to create a non-compressed FCompressedBuffer from a FIoHash/FSharedBuffer pair rather than rehashing the FSharedBuffer.
- This also helps make the code clearer as we can remove the bPayloadInArchive value that we used to save.
- Once the undo stack transaction is completed we will try to unload the payload if we can. This is done if we are saving or loading and will only unload the payload if we know we can safely load from disk. Which means that the payload has not been edited from the version on disk and that the owning package has not been re-saved. This is to conform to the editor bulkdata policy that we should evict the payload from memory when ever possible to keep over all memory use down. It will however mean that repeated editing of an asset will cause repeated disk loads. This logic could be changed if it is profiled as an issue.
[CL 22959256 by paul chipchase in ue5-main branch]
Tested compiling fortnite, unrealeditor, lyra, qagame with non-unity/pch
#preflight 63635997876630122adeab9f
#rb none
[CL 22958990 by henrik karlsson in ue5-main branch]