/** Called to send a transform 1 for this component to the rendering thread         *         * **Caution**, this is called concurrently on multiple threads (but never the same component concurrently)         */ virtual void SendRenderTransform_Concurrent();

void UActorComponent::DoDeferredRenderUpdates_Concurrent()

{

checkf(!HasAnyFlags(RF_Unreachable), TEXT("%s"), *GetFullName());

checkf(! IsTemplate(), TEXT("%s"), *[GetFullName][]());

checkf(! IsPendingKill (), TEXT("%s"), *[GetFullName][]());

if(! IsRegistered ())

{

UE_LOG(LogActorComponent, [Log], TEXT("UpdateComponent: (%s) Not registered, Aborting."), *[GetPathName][]());

return;

}

if(bRenderStateDirty)

{

SCOPECYCLECOUNTER(STAT_PostTickComponentRecreate);

[RecreateRenderState_Concurrent][]();

checkf(!bRenderStateDirty, TEXT("Failed to route CreateRenderState_Concurrent (%s)"), *[GetFullName][]());

}

else

{

SCOPECYCLECOUNTER(STAT_PostTickComponentLW);

if(bRenderTransformDirty)

{

// Update the component's transform if the actor has been moved since it was last updated.

[SendRenderTransform_Concurrent][]();

}

if(bRenderDynamicDataDirty)

{

[SendRenderDynamicData_Concurrent][]();

}

}

}

From https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/Components/UActorComponent/DoDeferredRenderUpdates_Concurre-/index.html

void [UActorComponent::MarkRenderDynamicDataDirty][]()

{

// If registered and has a render state to make as dirty

if([IsRegistered][]() && [bRenderStateCreated](API\Runtime\Engine\Components\UActorComponent\bRenderStateCreated))

{

// Flag as dirty

bRenderDynamicDataDirty = true;

[MarkForNeededEndOfFrameUpdate][]();

}

}

From https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/Components/UActorComponent/MarkRenderDynamicDataDirty/index.html