UPCGSettings::GetSettingsCrc() uses a cached CRC in editor builds (CachedCrc member, guarded by WITH_EDITORONLY_DATA) but recomputes from scratch via FPCGSettingsObjectCrc::PCGCrc(this) on every call in non-editor builds. The comment states: “In non-editor builds we don’t track changes to the UPCGSettings object so we always compute it.”
This is correct for single calls, but IPCGElement::PostExecutePrimaryLoopElement (PCGElement.cpp ~line 722) calls GetDependenciesCrc - which calls GetSettingsCrc inside a loop over PrimaryDataCollections. For elements with large output sets (e.g. FPCGSplineSampler Element producing 2000+ points), the same settings CRC is recomputed 2000+ times. Each call serializes the entire UPCGSettings object at ~0.25ms per call in our setup.
The settings object is immutable at runtime it’s a cooked UDataAsset. The CRC result is identical on every call within the loop. The per-point input data CRC (which changes per iteration) is computed separately via SubCollection.ComputeCrcs().
Note that this issue is not present in editor builds as the result is already cached. We have simply exposed this path in non editor builds also and the frame spikes (around 500ms on our min spec) have disappeared. This seems like a viable fix
[Attachment Removed]