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::get()-<begin("my_counter");
// ...code to profile...
Profiler::get()-<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 shows 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();
virtual int init();
virtual int update();
virtual int render();
virtual int flush();
virtual int shutdown();
virtual int destroy();
virtual int save(const Unigine::StreamPtr &stream);
virtual int restore(const Unigine::StreamPtr &stream);
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 on 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::DYNAMIC_VERTEX | ObjectMeshDynamic::IMMUTABLE_INDICES);
// release script ownership
mesh->release();
// pass ownership to UnigineEditor
Editor::get()->addNode(mesh->getNode());
// set the mesh settings
mesh->setWorldTransform(Math::translate(Math::Vec3(0.0f, 0.0f, 2.0f)));
mesh->setMaterial("mesh_base", "*");
mesh->setProperty("surface_base", "*");
// 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::get()->setValue("Update time", "ms", Engine::get()->getUpdateTime(), (float)NULL, Math::vec4(0.0f));
float time = Game::get()->getTime();
float isize = 30.0f / size;
// start the counter that shows the time spent for dymanic mesh grid modifying
Profiler::get()->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::get()->end();
// start the counter that shows the time spent for
// dynamic mesh normal vectors, tangent vectors and a mesh bounding box calculation
Profiler::get()->begin("mesh");
mesh->updateBounds();
mesh->updateTangents();
mesh->flushVertex();
// stop the counter
Profiler::get()->end();
// add the counter that shows the number of dynamic mesh vertices
Profiler::get()->setValue("Num vertices", "", mesh->getNumVertex(),NULL,NULL);
return 1;
}
Profiler Class
Members
Profiler * get()
Returns a pointer to the existing Profiler instance.Profiler::get()->isEnabled();
Return value
A pointer to the Profiler instance.void setEnabled(int enabled)
Enables or disables the profiler.Arguments
- int enabled - 1 to enable the profiler, 0 to disable it.
int isEnabled()
Returns a value indicating if the profiler is enabled.Return value
1 if the profiler is enabled; otherwise, 0.void setValue(const char * name, const char * units, int value, int max_value, float * arg5)
Updates settings of the integer counter.// add a counter without a graph
Profiler::get()->setValue("Random value 1", "", rand() % 5, 4, NULL);
// add a counter with a colored graph
Profiler::get()->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 * arg5 - Color of the graph. Pass NULL if no graph is required.
void setValue(const char * name, const char * units, float value, float max_value, float * 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::get()->setValue("Random value 1", "", rvalue1, 1.0f, NULL);
// add a counter with a colored graph
Profiler::get()->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 * arg5 - Color of the graph. Pass NULL if no graph is required.
float getValue(const char * name)
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)
Starts a counter with a given name and shows a colored graph (if the show_profiler 2 console variable is set). The counter shows the user how many millisecods have been spent for the operation that is peformed between the begin() and the end() functions.int size = 128;
ObjectMeshDynamicPtr mesh;
// ...
float time = Game::get()->getTime();
float isize = 30.0f / size;
// start the counter that shows the time spent for dymanic mesh grid modifying
Profiler::get()->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::get()->end();
Arguments
- const char * name - Name of the counter.
- const Math::vec4 & color - Color of the graph.
void begin(const char * name)
Starts a counter with a given name. The counter shows the user how many millisecods have been spent for the operation that is peformed between the begin() and the end() functions.ObjectMeshDynamicPtr mesh;
// ...
// start the counter that shows the time spent for
// dynamic mesh normal vectors, tangent vectors and a mesh bounding box calculation
Profiler::get()->begin("mesh");
mesh->updateBounds();
mesh->updateTangents();
mesh->flushVertex();
// stop the counter
Profiler::get()->end();
Arguments
- const char * name - Name of the counter.
float end()
Stops the last activated counter and returns its value.Return value
Value of the counter in milliseconds.Last update: 2017-10-20
Help improve this article
Was this article helpful?
(or select a word/phrase and press Ctrl+Enter)