优化Waveform渲染性能
This commit is contained in:
66
Source/Arona/PeakFile/PeakFile.cpp
Normal file
66
Source/Arona/PeakFile/PeakFile.cpp
Normal file
@@ -0,0 +1,66 @@
|
||||
#include "PeakFile.h"
|
||||
|
||||
#include "PluginHost/Sampler.h"
|
||||
|
||||
#define MID_TO_LOW (16 * 16)
|
||||
|
||||
TArray<TArray<FSamplePeak>> GenPeakData(const TArray<TArray64<float>>& Data, int32 BlockSize)
|
||||
{
|
||||
TArray<TArray<FSamplePeak>> Out;
|
||||
Out.SetNum(Data.Num());
|
||||
|
||||
for (int64 Channel = 0; Channel < Data.Num(); ++Channel)
|
||||
{
|
||||
const uint64 SourceNum = Data[Channel].Num();
|
||||
uint64 BlockNum = SourceNum / BlockSize;
|
||||
BlockNum += SourceNum % BlockSize ? 1 : 0;
|
||||
|
||||
Out[Channel].SetNum(BlockNum);
|
||||
uint64 Index = 0;
|
||||
for (uint64 j = 0; j < BlockNum; j++)
|
||||
{
|
||||
float Max = FLT_MIN_EXP;
|
||||
float Min = FLT_MAX;
|
||||
|
||||
for (uint64 S = 0; S < BlockSize; ++S)
|
||||
{
|
||||
if (Index >= SourceNum) break;
|
||||
const float& Sample = Data[Channel][Index];
|
||||
if (Max < Sample) Max = Sample;
|
||||
if (Min > Sample) Min = Sample;
|
||||
++Index;
|
||||
}
|
||||
Out[Channel][j].Max = Max;
|
||||
Out[Channel][j].Min = Min;
|
||||
}
|
||||
}
|
||||
return Out;
|
||||
}
|
||||
|
||||
void FWaveformRenderData::Generate(const TArray<TArray64<float>>& Data)
|
||||
{
|
||||
Buffer = GenPeakData(Data, BlockSize);
|
||||
}
|
||||
|
||||
FWaveform::FWaveform(int32 LevelNum, int32 MaxBlockSize)
|
||||
{
|
||||
RenderData.SetNum(LevelNum);
|
||||
int32 BeginBlock = MaxBlockSize;
|
||||
for (int i = 0; i < LevelNum; ++i)
|
||||
{
|
||||
RenderData[i] = new FWaveformRenderData(BeginBlock);
|
||||
BeginBlock /= 4;
|
||||
}
|
||||
}
|
||||
|
||||
FWaveform::~FWaveform()
|
||||
{
|
||||
for (int i = 0; i < RenderData.Num(); ++i)
|
||||
delete RenderData[i];
|
||||
}
|
||||
|
||||
void FWaveform::UpdatePeak(const TArray<TArray64<float>>& SampleBuffer)
|
||||
{
|
||||
for (int i = 0; i < RenderData.Num(); ++i)
|
||||
RenderData[i]->Generate(SampleBuffer);
|
||||
}
|
||||
Reference in New Issue
Block a user