MCPcopy Create free account
hub / github.com/FlaxEngine/FlaxEngine / UpdateResource

Function UpdateResource

Source/Engine/Streaming/Streaming.cpp:116–203  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

114}
115
116void UpdateResource(StreamableResource* resource, double currentTime)
117{
118 ASSERT(resource && resource->CanBeUpdated());
119
120 // Pick group and handler dedicated for that resource
121 auto group = resource->GetGroup();
122 auto handler = group->GetHandler();
123
124 // Calculate target quality for that asset
125 float targetQuality = 1.0f;
126 if (resource->IsDynamic())
127 {
128 targetQuality = handler->CalculateTargetQuality(resource, currentTime);
129 targetQuality = Math::Saturate(targetQuality);
130 }
131
132 // Update quality smoothing
133 resource->Streaming.QualitySamples.Add(targetQuality);
134 targetQuality = resource->Streaming.QualitySamples.Maximum();
135 targetQuality = Math::Saturate(targetQuality);
136
137 // Calculate target residency level (discrete value)
138 auto maxResidency = resource->GetMaxResidency();
139 auto currentResidency = resource->GetCurrentResidency();
140 auto allocatedResidency = resource->GetAllocatedResidency();
141 auto targetResidency = handler->CalculateResidency(resource, targetQuality);
142 ASSERT(allocatedResidency >= currentResidency && allocatedResidency >= 0);
143 resource->Streaming.LastUpdateTime = currentTime;
144
145 // Check if a target residency level has been changed
146 if (targetResidency != resource->Streaming.TargetResidency)
147 {
148 // Register change
149 resource->Streaming.TargetResidency = targetResidency;
150 resource->Streaming.TargetResidencyChangeTime = currentTime;
151 }
152
153 // Check if need to change resource current residency
154 if (handler->RequiresStreaming(resource, currentResidency, targetResidency))
155 {
156 // Check if need to change allocation for that resource
157 if (allocatedResidency != targetResidency)
158 {
159 // Update resource allocation
160 Task* allocateTask = resource->UpdateAllocation(targetResidency);
161 if (allocateTask)
162 {
163 // When resource wants to perform reallocation on a task then skip further updating until it's done
164 allocateTask->Start();
165 resource->RequestStreamingUpdate();
166 return;
167 }
168 else if (resource->GetAllocatedResidency() < targetResidency)
169 {
170 // Allocation failed (eg. texture format is not supported or run out of memory)
171 resource->ResetStreaming();
172 return;
173 }

Callers 1

JobMethod · 0.85

Calls 15

SaturateFunction · 0.85
IsDynamicMethod · 0.80
MaximumMethod · 0.80
CalculateResidencyMethod · 0.80
RequiresStreamingMethod · 0.80
ResetStreamingMethod · 0.80
CanBeUpdatedMethod · 0.45
AddMethod · 0.45
GetMaxResidencyMethod · 0.45

Tested by

no test coverage detected