17 template<
typename ResourceType>
39 template<
typename ResourceType>
63 template<
typename ResourceType>
69 : Data_Producer(&Data1)
70 , Data_Consumer(&Data2)
82 if (Data_Producer == &Data1)
84 Data_Producer = &Data2;
85 Data_Consumer = &Data1;
89 Data_Producer = &Data1;
90 Data_Consumer = &Data2;
98 ResourceType* Data_Producer;
99 ResourceType* Data_Consumer;
105 template<
typename ResourceType>
121 virtual const ResourceType*
GetProducerBuffer()
const override {
return &Data[GetWriteIndex()]; }
122 virtual const ResourceType*
GetConsumerBuffer()
const override {
return &Data[GetReadIndex()]; }
133 checkSlow(GetReadIndex() != GetWriteIndex());
137 int32 GetWriteIndex()
const {
return WriteIndex.Load(); }
138 int32 GetReadIndex()
const {
return ReadIndex.Load(); }
140 ResourceType Data[3];
151 template<
typename ResourceType>
201 : ProducerThreadBuffer(&Buffers[0])
202 , ConsumerThreadBuffer(&Buffers[1])
203 , Interchange(&Buffers[2])
217 return ProducerThreadBuffer->Value.Get();
235 return ProducerThreadBuffer->Value.Get();
248 ConsumerThreadBuffer = Interchange.Exchange(ConsumerThreadBuffer);
250 if (!ConsumerThreadBuffer->bValid)
255 ConsumerThreadBuffer->bValid =
false;
256 return ConsumerThreadBuffer->Value.Get();
265 return ConsumerThreadBuffer->Value.Get();
275 ProducerThreadBuffer->bValid =
true;
276 ProducerThreadBuffer = Interchange.Exchange(ProducerThreadBuffer);
277 ProducerThreadBuffer->bValid =
false;
281 struct ResourceTypeWrapper
283 ResourceTypeWrapper()
284 : Value(new ResourceType())
287 ResourceTypeWrapper(
const ResourceTypeWrapper&) =
delete;
288 ResourceTypeWrapper(ResourceTypeWrapper&&
Other)
293 void operator=(
const ResourceTypeWrapper&
Other) =
delete;
299 ResourceTypeWrapper Buffers[3] = {ResourceTypeWrapper(), ResourceTypeWrapper(), ResourceTypeWrapper()};
300 ResourceTypeWrapper* ProducerThreadBuffer;
301 mutable ResourceTypeWrapper* ConsumerThreadBuffer;
307 template<
typename ResourceType>
340 checkf(
false,
TEXT(
"FMultiBufferFactory Unexpected buffer mode"));
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define check(expr)
Definition AssertionMacros.h:314
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition MultiBufferResource.h:65
void FlipProducer()
Definition MultiBufferResource.h:80
virtual ~FDoubleBuffer()
Definition MultiBufferResource.h:72
virtual ResourceType * GetConsumerBufferMutable() override
Definition MultiBufferResource.h:76
virtual ResourceType * AccessProducerBuffer() override
Definition MultiBufferResource.h:75
virtual const ResourceType * GetProducerBuffer() const override
Definition MultiBufferResource.h:77
FDoubleBuffer()
Definition MultiBufferResource.h:68
virtual EMultiBufferMode GetBufferMode() override
Definition MultiBufferResource.h:74
virtual const ResourceType * GetConsumerBuffer() const override
Definition MultiBufferResource.h:78
Definition MultiBufferResource.h:153
virtual EMultiBufferMode GetBufferMode() override
Definition MultiBufferResource.h:206
virtual ResourceType * GetConsumerBufferMutable() override
Definition MultiBufferResource.h:220
const ResourceType * PeekConsumerBuffer() const
Definition MultiBufferResource.h:263
virtual const ResourceType * GetConsumerBuffer() const override
Definition MultiBufferResource.h:246
virtual ResourceType * AccessProducerBuffer() override
Definition MultiBufferResource.h:215
virtual const ResourceType * GetProducerBuffer() const override
Definition MultiBufferResource.h:233
FGuardedTripleBuffer()
Definition MultiBufferResource.h:200
virtual void FlipProducer()
Definition MultiBufferResource.h:273
Definition MultiBufferResource.h:309
static TUniquePtr< IBufferResource< ResourceType > > CreateBuffer(const EMultiBufferMode BufferMode)
Definition MultiBufferResource.h:311
Definition MultiBufferResource.h:41
FSingleBuffer()
Definition MultiBufferResource.h:44
virtual ~FSingleBuffer()
Definition MultiBufferResource.h:45
virtual ResourceType * GetConsumerBufferMutable() override
Definition MultiBufferResource.h:49
void FlipProducer() override
Definition MultiBufferResource.h:53
virtual const ResourceType * GetConsumerBuffer() const override
Definition MultiBufferResource.h:51
virtual const ResourceType * GetProducerBuffer() const override
Definition MultiBufferResource.h:50
virtual ResourceType * AccessProducerBuffer() override
Definition MultiBufferResource.h:48
virtual EMultiBufferMode GetBufferMode() override
Definition MultiBufferResource.h:47
Definition MultiBufferResource.h:107
virtual ~FTripleBuffer()
Definition MultiBufferResource.h:115
virtual const ResourceType * GetProducerBuffer() const override
Definition MultiBufferResource.h:121
virtual ResourceType * AccessProducerBuffer() override
Definition MultiBufferResource.h:118
virtual EMultiBufferMode GetBufferMode() override
Definition MultiBufferResource.h:117
virtual ResourceType * GetConsumerBufferMutable() override
Definition MultiBufferResource.h:119
virtual const ResourceType * GetConsumerBuffer() const override
Definition MultiBufferResource.h:122
virtual void FlipProducer() override
Definition MultiBufferResource.h:124
FTripleBuffer()
Definition MultiBufferResource.h:110
Definition MultiBufferResource.h:19
virtual const ResourceType * GetConsumerBuffer() const =0
virtual EMultiBufferMode GetBufferMode()=0
virtual ResourceType * AccessProducerBuffer()=0
virtual ~IBufferResource()
Definition MultiBufferResource.h:22
virtual const ResourceType * GetProducerBuffer() const =0
virtual ResourceType * GetConsumerBufferMutable()=0
virtual void FlipProducer()=0
Definition UniquePtr.h:107
Definition SkeletalMeshComponent.h:307
EMultiBufferMode
Definition MultiBufferResource.h:9
@ false
Definition radaudio_common.h:23