Add various profiler events for more insights

This commit is contained in:
Wojtek Figat
2025-08-11 18:15:47 +02:00
parent 9f14bb7279
commit 99707b6586
5 changed files with 39 additions and 17 deletions

View File

@@ -7,6 +7,7 @@
#include "Engine/Core/Log.h" #include "Engine/Core/Log.h"
#include "Engine/Content/Upgraders/AudioClipUpgrader.h" #include "Engine/Content/Upgraders/AudioClipUpgrader.h"
#include "Engine/Content/Factories/BinaryAssetFactory.h" #include "Engine/Content/Factories/BinaryAssetFactory.h"
#include "Engine/Profiler/ProfilerCPU.h"
#include "Engine/Scripting/ManagedCLR/MUtils.h" #include "Engine/Scripting/ManagedCLR/MUtils.h"
#include "Engine/Streaming/StreamingGroup.h" #include "Engine/Streaming/StreamingGroup.h"
#include "Engine/Serialization/MemoryReadStream.h" #include "Engine/Serialization/MemoryReadStream.h"
@@ -19,10 +20,15 @@ REGISTER_BINARY_ASSET_WITH_UPGRADER(AudioClip, "FlaxEngine.AudioClip", AudioClip
bool AudioClip::StreamingTask::Run() bool AudioClip::StreamingTask::Run()
{ {
PROFILE_CPU_NAMED("AudioStreaming");
PROFILE_MEM(Audio); PROFILE_MEM(Audio);
AssetReference<AudioClip> ref = _asset.Get(); AssetReference<AudioClip> ref = _asset.Get();
if (ref == nullptr || AudioBackend::Instance == nullptr) if (ref == nullptr || AudioBackend::Instance == nullptr)
return true; return true;
#if TRACY_ENABLE
const StringView name(ref->GetPath());
ZoneName(*name, name.Length());
#endif
ScopeLock lock(ref->Locker); ScopeLock lock(ref->Locker);
const auto& queue = ref->StreamingQueue; const auto& queue = ref->StreamingQueue;
if (queue.Count() == 0) if (queue.Count() == 0)
@@ -421,6 +427,8 @@ bool AudioClip::WriteBuffer(int32 chunkIndex)
// Ensure audio backend exists // Ensure audio backend exists
if (AudioBackend::Instance == nullptr) if (AudioBackend::Instance == nullptr)
return true; return true;
PROFILE_CPU();
PROFILE_MEM(Audio);
const auto chunk = GetChunk(chunkIndex); const auto chunk = GetChunk(chunkIndex);
if (chunk == nullptr || chunk->IsMissing()) if (chunk == nullptr || chunk->IsMissing())
@@ -432,6 +440,7 @@ bool AudioClip::WriteBuffer(int32 chunkIndex)
Array<byte> tmp1, tmp2; Array<byte> tmp1, tmp2;
AudioDataInfo info = AudioHeader.Info; AudioDataInfo info = AudioHeader.Info;
const uint32 bytesPerSample = info.BitDepth / 8; const uint32 bytesPerSample = info.BitDepth / 8;
ZoneValue(chunk->Size() / 1024); // Audio data size (in kB)
// Get raw data or decompress it // Get raw data or decompress it
switch (Format()) switch (Format())
@@ -439,6 +448,7 @@ bool AudioClip::WriteBuffer(int32 chunkIndex)
case AudioFormat::Vorbis: case AudioFormat::Vorbis:
{ {
#if COMPILE_WITH_OGG_VORBIS #if COMPILE_WITH_OGG_VORBIS
PROFILE_CPU_NAMED("OggVorbisDecode");
OggVorbisDecoder decoder; OggVorbisDecoder decoder;
MemoryReadStream stream(chunk->Get(), chunk->Size()); MemoryReadStream stream(chunk->Get(), chunk->Size());
AudioDataInfo tmpInfo; AudioDataInfo tmpInfo;

View File

@@ -535,7 +535,8 @@ void MCore::GC::Collect(int32 generation)
void MCore::GC::Collect(int32 generation, MGCCollectionMode collectionMode, bool blocking, bool compacting) void MCore::GC::Collect(int32 generation, MGCCollectionMode collectionMode, bool blocking, bool compacting)
{ {
PROFILE_CPU(); PROFILE_CPU_NAMED("GC Collect");
ZoneColor(0xe3c349);
static void* GCCollectPtr = GetStaticMethodPointer(TEXT("GCCollect")); static void* GCCollectPtr = GetStaticMethodPointer(TEXT("GCCollect"));
CallStaticMethod<void, int, int, bool, bool>(GCCollectPtr, generation, (int)collectionMode, blocking, compacting); CallStaticMethod<void, int, int, bool, bool>(GCCollectPtr, generation, (int)collectionMode, blocking, compacting);
} }
@@ -554,7 +555,8 @@ void MCore::GC::MemoryInfo(int64& totalCommitted, int64& heapSize)
void MCore::GC::WaitForPendingFinalizers() void MCore::GC::WaitForPendingFinalizers()
{ {
PROFILE_CPU(); PROFILE_CPU_NAMED("GC WaitForPendingFinalizers");
ZoneColor(TracyWaitZoneColor);
static void* GCWaitForPendingFinalizersPtr = GetStaticMethodPointer(TEXT("GCWaitForPendingFinalizers")); static void* GCWaitForPendingFinalizersPtr = GetStaticMethodPointer(TEXT("GCWaitForPendingFinalizers"));
CallStaticMethod<void>(GCWaitForPendingFinalizersPtr); CallStaticMethod<void>(GCWaitForPendingFinalizersPtr);
} }

View File

@@ -6,6 +6,7 @@
#include "Engine/Core/Core.h" #include "Engine/Core/Core.h"
#include "Engine/Core/Math/Math.h" #include "Engine/Core/Math/Math.h"
#include "Engine/Core/Memory/Allocation.h" #include "Engine/Core/Memory/Allocation.h"
#include "Engine/Profiler/ProfilerCPU.h"
#if USE_EDITOR #if USE_EDITOR
#include "Engine/Serialization/Serialization.h" #include "Engine/Serialization/Serialization.h"
#include "Engine/Scripting/Enums.h" #include "Engine/Scripting/Enums.h"
@@ -181,6 +182,7 @@ void Convert32To24Bits(const int32* input, uint8* output, uint32 numSamples)
void AudioTool::ConvertToMono(const byte* input, byte* output, uint32 bitDepth, uint32 numSamples, uint32 numChannels) void AudioTool::ConvertToMono(const byte* input, byte* output, uint32 bitDepth, uint32 numSamples, uint32 numChannels)
{ {
PROFILE_CPU();
switch (bitDepth) switch (bitDepth)
{ {
case 8: case 8:
@@ -203,6 +205,7 @@ void AudioTool::ConvertToMono(const byte* input, byte* output, uint32 bitDepth,
void AudioTool::ConvertBitDepth(const byte* input, uint32 inBitDepth, byte* output, uint32 outBitDepth, uint32 numSamples) void AudioTool::ConvertBitDepth(const byte* input, uint32 inBitDepth, byte* output, uint32 outBitDepth, uint32 numSamples)
{ {
PROFILE_CPU();
int32* srcBuffer = nullptr; int32* srcBuffer = nullptr;
const bool needTempBuffer = inBitDepth != 32; const bool needTempBuffer = inBitDepth != 32;
@@ -262,6 +265,7 @@ void AudioTool::ConvertBitDepth(const byte* input, uint32 inBitDepth, byte* outp
void AudioTool::ConvertToFloat(const byte* input, uint32 inBitDepth, float* output, uint32 numSamples) void AudioTool::ConvertToFloat(const byte* input, uint32 inBitDepth, float* output, uint32 numSamples)
{ {
PROFILE_CPU();
if (inBitDepth == 8) if (inBitDepth == 8)
{ {
for (uint32 i = 0; i < numSamples; i++) for (uint32 i = 0; i < numSamples; i++)
@@ -306,6 +310,7 @@ void AudioTool::ConvertToFloat(const byte* input, uint32 inBitDepth, float* outp
void AudioTool::ConvertFromFloat(const float* input, int32* output, uint32 numSamples) void AudioTool::ConvertFromFloat(const float* input, int32* output, uint32 numSamples)
{ {
PROFILE_CPU();
for (uint32 i = 0; i < numSamples; i++) for (uint32 i = 0; i < numSamples; i++)
{ {
float sample = *(float*)input; float sample = *(float*)input;

View File

@@ -5,6 +5,7 @@
#include "OggVorbisDecoder.h" #include "OggVorbisDecoder.h"
#include "Engine/Core/Log.h" #include "Engine/Core/Log.h"
#include "Engine/Core/Math/Math.h" #include "Engine/Core/Math/Math.h"
#include "Engine/Profiler/ProfilerCPU.h"
#include "Engine/Serialization/MemoryReadStream.h" #include "Engine/Serialization/MemoryReadStream.h"
#include <vorbis/codec.h> #include <vorbis/codec.h>
@@ -42,10 +43,25 @@ long oggTell(void* data)
return static_cast<long>(decoderData->Stream->GetPosition() - decoderData->Offset); return static_cast<long>(decoderData->Stream->GetPosition() - decoderData->Offset);
} }
OggVorbisDecoder::OggVorbisDecoder()
{
Stream = nullptr;
Offset = 0;
ChannelCount = 0;
OggVorbisFile.datasource = nullptr;
}
OggVorbisDecoder::~OggVorbisDecoder()
{
if (OggVorbisFile.datasource != nullptr)
ov_clear(&OggVorbisFile);
}
bool OggVorbisDecoder::Open(ReadStream* stream, AudioDataInfo& info, uint32 offset) bool OggVorbisDecoder::Open(ReadStream* stream, AudioDataInfo& info, uint32 offset)
{ {
if (stream == nullptr) if (stream == nullptr)
return false; return false;
PROFILE_CPU();
stream->SetPosition(offset); stream->SetPosition(offset);
Stream = stream; Stream = stream;
@@ -71,11 +87,13 @@ bool OggVorbisDecoder::Open(ReadStream* stream, AudioDataInfo& info, uint32 offs
void OggVorbisDecoder::Seek(uint32 offset) void OggVorbisDecoder::Seek(uint32 offset)
{ {
PROFILE_CPU();
ov_pcm_seek(&OggVorbisFile, offset / ChannelCount); ov_pcm_seek(&OggVorbisFile, offset / ChannelCount);
} }
void OggVorbisDecoder::Read(byte* samples, uint32 numSamples) void OggVorbisDecoder::Read(byte* samples, uint32 numSamples)
{ {
PROFILE_CPU();
uint32 numReadSamples = 0; uint32 numReadSamples = 0;
while (numReadSamples < numSamples) while (numReadSamples < numSamples)
{ {

View File

@@ -15,36 +15,23 @@
class OggVorbisDecoder : public AudioDecoder class OggVorbisDecoder : public AudioDecoder
{ {
public: public:
ReadStream* Stream; ReadStream* Stream;
uint32 Offset; uint32 Offset;
uint32 ChannelCount; uint32 ChannelCount;
OggVorbis_File OggVorbisFile; OggVorbis_File OggVorbisFile;
public: public:
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="OggVorbisDecoder"/> class. /// Initializes a new instance of the <see cref="OggVorbisDecoder"/> class.
/// </summary> /// </summary>
OggVorbisDecoder() OggVorbisDecoder();
{
Stream = nullptr;
Offset = 0;
ChannelCount = 0;
OggVorbisFile.datasource = nullptr;
}
/// <summary> /// <summary>
/// Finalizes an instance of the <see cref="OggVorbisDecoder"/> class. /// Finalizes an instance of the <see cref="OggVorbisDecoder"/> class.
/// </summary> /// </summary>
~OggVorbisDecoder() ~OggVorbisDecoder();
{
if (OggVorbisFile.datasource != nullptr)
ov_clear(&OggVorbisFile);
}
public: public:
// [AudioDecoder] // [AudioDecoder]
bool Open(ReadStream* stream, AudioDataInfo& info, uint32 offset = 0) override; bool Open(ReadStream* stream, AudioDataInfo& info, uint32 offset = 0) override;
void Seek(uint32 offset) override; void Seek(uint32 offset) override;