C++ Profiler For Games
Optick is a super-lightweight C++ profiler for Games.
It provides access for all the necessary tools required for efficient performance analysis and optimization:
instrumentation, switch-contexts, sampling, GPU counters.
Looking for 'Brofiler'? It has been renamed to 'Optick', so you are in the right place.
Windows (x64: msvc) | Linux (x64: clang, gcc) | MacOS (x64: clang, gcc) | Static Code Analysis |
---|---|---|---|
Features | Windows | Linux | MacOS | XBox | PS4 | UE4 |
---|---|---|---|---|---|---|
Instrumentation | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :grey_question: | :heavy_check_mark: |
Switch Contexts | :heavy_check_mark: ETW | :heavy_check_mark: FTrace | :heavy_check_mark: DTrace | :heavy_check_mark: | :grey_question: | :heavy_check_mark: Win |
Sampling | :heavy_check_mark: ETW | :grey_question: | :grey_question: | :heavy_check_mark: Win | ||
GPU | :heavy_check_mark: D3D12, Vulkan | :heavy_check_mark: Vulkan | :heavy_check_mark: Vulkan | :hourglass_flowing_sand: |
:heavy_check_mark: - works out of the box, :hourglass_flowing_sand: - in progress, :grey_question: - coming soon for the certified developers
OPTICK_FRAME("MainThread");
macro to the main loop of your game and #include "optick.h"
header#include "optick.h"
...
while( true )
{
OPTICK_FRAME("MainThread");
engine.Update();
}
OPTICK_EVENT();
macro to instrument a functionvoid SlowFunction()
{
OPTICK_EVENT();
...
}
OPTICK_THREAD("Name");
macro to declare a new thread with Optickvoid WorkerThread(...)
{
OPTICK_THREAD("Worker");
while (isRunning)
{
...
}
}
optick.config.h
to enable/disable some of the features in specific configs or platforms.:warning: If your Game uses dynamic linking and you are planning to use Optick from multiple dlls within the same executable - please make sure that Optick's code is added to the common Dynamic Library and this library is compiled with OPTICK_EXPORT define (Static Library won't work).
You could also use precompiled OptickCore.dll which is packaged with every release:
- Add
include
folder to the extra include dirs of your project- Add
lib/x64/debug
andlib/x64/release
to the extra library dirs of your project- Copy
lib/x64/debug/OptickCore.dll
andlib/x64/release/OptickCore.dll
to the debug and release output folders of your project respectively
All the available API calls are documented here:
https://github.com/bombomby/optick/wiki/Optick-API
Optick provides a special plugin for UE4. Check more detailed documentation here:
https://github.com/bombomby/optick/wiki/UE4-Optick-Plugin
https://github.com/bombomby/optick/wiki/UE5-Optick-Plugin
Run GenerateProjects_gpu.bat to generate project files. To compile the samples you'll need to install VulkanSDK. Alternatively you could use GenerateProjects.bat to generate only minimal solution with ConsoleApp sample.
Open solution build\vs2017\Optick.sln
with generated samples.
WindowsD3D12 | WindowsVulkan | ConsoleApp |
---|---|---|
DirectX12 multithreading sample with Optick integration | SaschaWillems's vulkan multithreading sample with Optick integration | Basic ConsoleApp with Optick integration (Windows, Linux, MacOS) |
Brofiler has been renamed into Optick starting from v1.2.0.
All the future development is going under the new name.
Cheatsheet for upgrading to the new version:
BROFILER_FRAME("MainThread");
=> OPTICK_FRAME("MainThread");
BROFILER_THREAD("WorkerThread");
=> OPTICK_THREAD("WorkerThread");
BROFILER_CATEGORY("Physics", Brofiler::Color::Green);
=> OPTICK_CATEGORY("Physics", Optick::Category::Physics);
BROFILER_EVENT(NAME);
=> OPTICK_EVENT(NAME);
PROFILE;
=> OPTICK_EVENT();
You can find a short instruction here:
https://github.com/bombomby/optick/wiki/How-to-start%3F-(Programmers-Setup)