Unigine::Profiler Class
Header: | #include <UnigineProfiler.h> |
The Profiler class is used to create counters for the engine Performance Profiler. Allows using counters in your code in the following manner:
Profiler::begin("my_counter");
// ...code to profile...
Profiler::end();
Counters can be nested.
Usage Example#
The following example contains different approaches to creating counters:
- Two counters are added via the setValue() function: one shows the number of dynamic mesh vertices, the other shows the update time. This approach should be used when you need to show, for example, a value of a setting, the number of objects, and so on.
- Another two counters are added by using the begin()/end() construction. They show the time spent for mesh grid modifying and the time spent for mesh normal vectors, tangent vectors and a mesh bounding box calculation. This approach should be used when you need to show time spent for executing a part of the code.
AppWorldLogic.h contains declaration of the required variables.
#include <UnigineLogic.h>
#include <UnigineStreams.h>
#include <UnigineObjects.h>
class AppWorldLogic: public Unigine::WorldLogic
{
public:
AppWorldLogic();
virtual ~AppWorldLogic();
int init() override;
int update() override;
int postUpdate() override;
int updatePhysics() override;
int shutdown() override;
int save(const Unigine::StreamPtr &stream) override;
int restore(const Unigine::StreamPtr &stream) override;
private:
// declare variables
int size = 128;
Unigine::ObjectMeshDynamicPtr mesh;
};
In AppWorldLogic.cpp, a dynamic mesh is created and then modified on the engine update. All counters are created in update() too.
#include "AppWorldLogic.h"
#include <UnigineProfiler.h>
#include <UnigineEditor.h>
#include <UnigineGame.h>
using namespace Unigine;
int AppWorldLogic::init()
{
// create a dynamic mesh
mesh = ObjectMeshDynamic::create(ObjectMeshDynamic::USAGE_DYNAMIC_VERTEX | ObjectMeshDynamic::USAGE_IMMUTABLE_INDICES);
// set the mesh settings
mesh->setWorldTransform(Math::translate(Math::Vec3(0.0f, 0.0f, 2.0f)));
// create dynamic mesh vertices
for (int y = 0; y < size; y++) {
for (int x = 0; x < size; x++)
{
mesh->addVertex(Math::vec3(0.0f));
mesh->addTexCoord(Math::vec4((float)x / size, (float)y / size, 0.0f, 0.0f));
}
}
// create dynamic mesh indices
for (int y = 0; y < size - 1; y++) {
int offset = size * y;
for (int x = 0; x < size - 1; x++) {
mesh->addIndex(offset);
mesh->addIndex(offset + 1);
mesh->addIndex(offset + size);
mesh->addIndex(offset + size);
mesh->addIndex(offset + 1);
mesh->addIndex(offset + size + 1);
offset++;
}
}
return 1;
}
int AppWorldLogic::update()
{
// add a counter that shows engine update phase duration
Profiler::setValue("Update time", "ms", Engine::get()->getUpdateTime(), 50.0f, Math::vec4(0.0f, 0.0f, 0.0f, 1.0f));
float time = Game::getTime();
float isize = 30.0f / size;
// start the counter that shows the time spent for dymanic mesh grid modifying
Profiler::begin("Grid", Math::vec4(1.0f));
for (int y = 0; y < size; y++)
{
for (int i = 0; i < size; i++)
{
float Y = y * isize - 15.0f;
float Z = Math::cos(Y + time);
for (int x = 0; x < size; x++)
{
float X = x * isize - 15.0f;
mesh->setVertex(i++, Math::vec3(X, Y, Z * Math::sin(X + time)));
}
}
}
// stop the counter
Profiler::end();
// start the counter that shows the time spent for
// dynamic mesh normal vectors, tangent vectors and a mesh bounding box calculation
Profiler::begin("mesh");
mesh->updateBounds();
mesh->updateTangents();
mesh->flushVertex();
// stop the counter
Profiler::end();
// add the counter that shows the number of dynamic mesh vertices
Profiler::setValue("Num vertices", "", mesh->getNumVertex(), 32768, NULL);
return 1;
}
See Also#
- Example of profiling the application logic
Profiler Class
Members
void setGui ( const Ptr<Gui>& gui ) #
Sets a new GUI of the engine Performance Profiler.
Arguments
Ptr<Gui> getGui() const#
Returns the current GUI of the engine Performance Profiler.
Return value
Current pointer to the GUI.void setEnabled ( bool enabled ) #
Sets a new value indicating if the profiler is enabled.
Arguments
- bool enabled - Set true to enable the profiler; false - to disable it.
bool isEnabled() const#
Returns the current value indicating if the profiler is enabled.
Return value
true if the profiler is enabled; otherwise false.const char * getMicroprofileUrl() const#
Returns the current microprofile web server url.
Return value
Current microprofile web server url represented in the following way:http://localhost:p/, where p is the local port.
int getNumCounters() const#
Returns the current total number of the profiler counters.
Return value
Current total number of the profiler countersvoid setValue ( const char * name, const char * units, int value, int max_value, float * OUT_arg5 ) #
Updates settings of the integer counter.// add a counter without a graph
Profiler::setValue("Random value 1", "", rand() % 5, 4, NULL);
// add a counter with a colored graph
Profiler::setValue("Random value 2", "", rand() % 10, 9, Math::vec4(1.0f));
Arguments
- const char * name - Name of the counter.
- const char * units - Counter units.
- int value - Value of the counter.
- int max_value - Counter maximum value.
- float * OUT_arg5 - Color of the graph. Pass NULL if no graph is required.This output buffer is to be filled by the Engine as a result of executing the method.
void setValue ( const char * name, const char * units, float value, float max_value, float * OUT_arg5 ) #
Updates settings of the float counter.float rvalue1 = static_cast<float>(rand()) / static_cast<float>(RAND_MAX);
float rvalue2 = static_cast<float>(rand()) / static_cast<float>(RAND_MAX);
// add a counter without a graph
Profiler::setValue("Random value 1", "", rvalue1, 1.0f, NULL);
// add a counter with a colored graph
Profiler::setValue("Random value 2", "", 1 + rvalue2, 10.0f, Math::vec4(1.0f));
Arguments
- const char * name - Name of the counter.
- const char * units - Counter units.
- float value - Value of the counter.
- float max_value - Counter maximum value.
- float * OUT_arg5 - Color of the graph. Pass NULL if no graph is required.This output buffer is to be filled by the Engine as a result of executing the method.
float getValue ( const char * name ) const#
Returns a value of the specified counter.Arguments
- const char * name - The name of the counter.
Return value
Value of the counter in milliseconds.void begin ( const char * name, const Math::vec4 & color ) const#
Starts a counter with a given name and shows a colored graph (if the show_profiler 1 console variable is set). The counter shows user how many millisecods have been spent for the operation that is performed between the begin() and the end() functions.int size = 128;
Unigine::ObjectMeshDynamicPtr mesh;
float time = Game::getTime();
float isize = 30.0f / size;
// start the counter that shows the time spent for dymanic mesh grid modifying
Profiler::begin("Grid", Math::vec4(1.0f));
for (int y = 0; y < size; y++)
{
for (int i = 0; i < size; i++)
{
float Y = y * isize - 15.0f;
float Z = Math::cos(Y + time);
for (int x = 0; x < size; x++)
{
float X = x * isize - 15.0f;
mesh->setVertex(i++, Math::vec3(X, Y, Z * Math::sin(X + time)));
}
}
}
// stop the counter
Profiler::end();
Arguments
- const char * name - Name of the counter.
- const Math::vec4 & color - Color of the graph.
void begin ( const char * name ) const#
Starts a counter with a given name. The counter shows user how many millisecods have been spent for the operation that is performed between the begin() and the end() functions.Unigine::ObjectMeshDynamicPtr mesh;
// start the counter that shows the time spent for
// dynamic mesh normal vectors, tangent vectors and a mesh bounding box calculation
Profiler::begin("mesh");
mesh->updateBounds();
mesh->updateTangents();
mesh->flushVertex();
// stop the counter
Profiler::end();
Arguments
- const char * name - Name of the counter.
float end ( ) const#
Stops the last activated counter and returns its value.Return value
Value of the counter in milliseconds.int beginMicro ( const char * name, bool gpu = 0 ) const#
Starts a counter with a given name in the Microprofile only, without overloading the Performance Profiler layout. The counter shows user how many millisecods have been spent for the operation that is performed between the beginMicro() and the endMicro() functions.Each counter has an ID. Thus, several nested beginMicro() / endMicro() blocks can be created, which can't be done in the Performance Profiler.
Unigine::ObjectMeshDynamicPtr mesh;
// start the counter that shows the time spent for dynamic mesh normal vectors,
// tangent vectors and a mesh bounding box calculation, with a nested counter for tangent vectors only
int c_id = Profiler::beginMicro("mesh");
mesh->updateBounds();
int c_nested_id = Profiler::beginMicro("mesh_tangents");
mesh->updateTangents();
Profiler::endMicro(c_nested_id);
mesh->flushVertex();
// stop the counter
Profiler::endMicro(c_id);
Arguments
- const char * name - Name of the counter.
- bool gpu - true for the GPU counter; false — for the CPU counter. The default value is false.
Return value
ID of the new added counter.void endMicro ( int id ) const#
Stops a previously activated Microprofile counter with the specified ID.Arguments
- int id - Microprofile counter ID.
int findCounter ( const char * name ) const#
Returns the counter number by its name.Arguments
- const char * name - Name of the counter.
Return value
Counter number in range from 0 to the total number of counters.const char * getCounterName ( int num ) const#
Returns the counter name by its number.Arguments
- int num - Counter number in range from 0 to the total number of counters.
Return value
Name of the counter.const char * getCounterText ( int num ) const#
Returns the text of the specified counter.Arguments
- int num - Counter number in range from 0 to the total number of counters.
Return value
Text of the counter.Math::vec4 getCounterColor ( int num ) const#
Returns the color of the specified counter.Arguments
- int num - Counter number in range from 0 to the total number of counters.
Return value
Color of the counter.float getCounterValue ( int num ) const#
Returns the value of the specified counter.Arguments
- int num - Counter number in range from 0 to the total number of counters.
Return value
Value of the counter.long long getCounterFrame ( int num ) const#
Returns the frame of the specified counter.Arguments
- int num - Counter number in range from 0 to the total number of counters.
Return value
Frame of the counter.bool isCounterActive ( int num ) const#
Returns the value indicating if the specified counter is active.Arguments
- int num - Counter number in range from 0 to the total number of counters.
Return value
true if the counter is active; otherwise false.bool isCounterSeparator ( int num ) const#
Returns the value indicating if a separator is placed after the specified counter.Arguments
- int num - Counter number in range from 0 to the total number of counters.
Return value
true if the separator is placed; otherwise false.Last update:
2024-12-13
Help improve this article
Was this article helpful?
(or select a word/phrase and press Ctrl+Enter)