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.
Build Status
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
1) Copy 'src' folder from the repository or latest release to your game project
2) Add 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();
}
3) Use OPTICK_EVENT();
macro to instrument a function
void SlowFunction()
{
OPTICK_EVENT();
...
}
4) Add OPTICK_THREAD("Name");
macro to declare a new thread with Optick
void WorkerThread(...)
{
OPTICK_THREAD("Worker");
while (isRunning)
{
...
}
}
5) Edit optick.config.h
to enable/disable some of the features in specific configs or platforms.
(e.g. disabling Optick in final builds)
: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)