优化Waveform渲染性能
This commit is contained in:
51
Source/Arona/UI/Widget/Pattern/SSamplePatternInstance.cpp
Normal file
51
Source/Arona/UI/Widget/Pattern/SSamplePatternInstance.cpp
Normal file
@@ -0,0 +1,51 @@
|
||||
#include "SSamplePatternInstance.h"
|
||||
|
||||
#include "Pattern/SamplePatternInstance.h"
|
||||
#include "UI/Widget/Thumbnail.h"
|
||||
#include "UI/Widget/WaveformViewer.h"
|
||||
|
||||
FSamplePatternInstanceWaveformHandle::FSamplePatternInstanceWaveformHandle(SSamplePatternInstance* InPatternInstance):
|
||||
PatternInstanceWidget(InPatternInstance)
|
||||
{
|
||||
}
|
||||
|
||||
TArrayView<const FSamplePeak> FSamplePatternInstanceWaveformHandle::GetWaveform(int32 SizeX)
|
||||
{
|
||||
FSamplePatternInstance* Instance = (FSamplePatternInstance*)PatternInstanceWidget->GetPatternInstance();
|
||||
TRange<AudioFrame> FrameViewRange = PatternInstanceWidget->GetFrameViewRange();
|
||||
const FSampler* Sampler = Instance->GetInstanceOwner()->GetSampler();
|
||||
const TRange<AudioFrame>& TimeRange = Instance->TimeRange;
|
||||
|
||||
if (!RenderData)
|
||||
{
|
||||
RenderData = new FWaveform(7, 256 * 128);
|
||||
RenderData->UpdatePeak(Sampler->GetSampleBuffer());
|
||||
const float MemSize = RenderData->GetMemSize();
|
||||
UE_LOG(LogTemp, Warning, TEXT("Waveform MemSize: %f MB"), MemSize / 1024 / 1024);
|
||||
}
|
||||
const AudioFrame InstancePos = Instance->GetMidiPos();
|
||||
FrameViewRange = TRange<AudioFrame>(FrameViewRange.GetLowerBoundValue() - InstancePos, FrameViewRange.GetUpperBoundValue() - InstancePos);
|
||||
const AudioFrame BeginFrame = FMath::Max(TimeRange.GetLowerBoundValue(), FrameViewRange.GetLowerBoundValue());
|
||||
const AudioFrame EndFrame = FMath::Min(TimeRange.GetUpperBoundValue(), FrameViewRange.GetUpperBoundValue());
|
||||
return RenderData->GetPeakFromRange(0, SizeX, BeginFrame, EndFrame);
|
||||
}
|
||||
|
||||
SSamplePatternInstance::SSamplePatternInstance()
|
||||
{
|
||||
WaveformHandle = MakeShared<FSamplePatternInstanceWaveformHandle>(this);
|
||||
}
|
||||
|
||||
TSharedRef<SWidget> SSamplePatternInstance::GetViewWidget()
|
||||
{
|
||||
return SAssignNew(WaveformViewer, SWaveformViewer)
|
||||
.WaveformHandle(WaveformHandle);
|
||||
}
|
||||
|
||||
void SSamplePatternInstance::RequestUpdate()
|
||||
{
|
||||
}
|
||||
|
||||
FReply SSamplePatternInstance::OpenPatternMenu()
|
||||
{
|
||||
return FReply::Handled();
|
||||
}
|
||||
Reference in New Issue
Block a user