engine.profiler Functions
The Profiler class is used to create counters for the engine Performance Profiler. Allows using counters in your code in the following manner:
engine.profiler.begin("my_counter");
// ...code to profile...
engine.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 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.
In the code below, a dynamic mesh is created and then modified on the engine update. All counters are created on update() too.
#include <core/unigine.h>
// declare variables
int size = 128;
ObjectMeshDynamic mesh;
int init() {
// create a dynamic mesh and remove script ownership
mesh = class_remove(new ObjectMeshDynamic(OBJECT_DYNAMIC_VERTEX | OBJECT_IMMUTABLE_INDICES));
// pass ownership to UnigineEditor
engine.editor.addNode(mesh);
// set the mesh settings
mesh.setWorldTransform(translate(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(vec3_zero);
mesh.addTexCoord(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 update() {
// add a counter that shows the number of dynamic mesh vertices
engine.profiler.setValue("Num Vertices", "", mesh.getNumVertex());
// add a counter that shows engine update phase duration
engine.profiler.setValue("Update time", "ms", engine.getUpdateTime(),1.0f,vec4(1.0f));
float time = engine.game.getTime();
float isize = 30.0f / size;
// start the counter that shows the time spent for dymanic mesh grid modifying
engine.profiler.begin("grid",vec4(1.0f));
forloop(int y = 0, i = 0; size) {
float Y = y * isize - 15.0f;
float Z = cos(Y + time);
forloop(int x = 0; size) {
float X = x * isize - 15.0f;
mesh.setVertex(i++,vec3(X,Y,Z * sin(X + time)));
}
}
// stop the counter
engine.profiler.end();
// start the counter that shows the time spent for
// dynamic mesh normal vectors, tangent vectors and a mesh bounding box calculation
engine.profiler.begin("mesh");
mesh.updateBounds();
mesh.updateTangents();
mesh.flushVertex();
// stop the counter
engine.profiler.end();
return 1;
}
Profiler Class
Members
void engine.profiler.setEnabled(int enabled)
Enables or disables the profiler.Arguments
- int enabled - 1 to enable the profiler, 0 to disable it.
int engine.profiler.isEnabled()
Returns a value indicating if the profiler is enabled.Return value
1 if the profiler is enabled; otherwise, 0.void engine.profiler.setValue(string name, string units, Variable value, Variable max_value, float[] arg5)
Updates settings of the integer of float counter (depending on the type of passed arguments).// add a counter without a graph
engine.profiler.setValue("Random value 1", "", rand(), 1.0f, NULL);
// add a counter with a colored graph
engine.profiler.setValue("Random value 2", "", 1 + rand(), 10.0f, vec4(1.0f));
Arguments
- string name - Name of the counter.
- string units - Counter units.
- Variable value - Value of the counter: int or float value.
- Variable max_value - Counter maximum value: int or float value.
- float[] arg5 - Color of the graph. Pass NULL if no graph is required.
float engine.profiler.getValue(string name)
Returns a value of the specified counter.Arguments
- string name - The name of the counter.
Return value
Value of the counter in milliseconds.void engine.profiler.begin(string name, 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 engine.profiler.begin() and the engine.profiler.end() functions.int size = 128;
ObjectMeshDynamic mesh;
// ...
float time = engine.game.getTime();
// start the counter that shows the time spent for dymanic mesh grid calculation
engine.profiler.begin("grid",vec4(1.0f));
// modify a mesh grid
forloop(int y = 0, i = 0; size) {
float Y = y * isize - 15.0f;
float Z = cos(Y + time);
forloop(int x = 0; size) {
float X = x * isize - 15.0f;
mesh.setVertex(i++,vec3(X,Y,Z * sin(X + time)));
}
}
// stop the counter
engine.profiler.end();
Arguments
- string name - Name of the counter.
- vec4 color - Color of the graph.
void engine.profiler.begin(string 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 engine.profiler.begin() and the engine.profiler.end() functions.ObjectMeshDynamic mesh;
// ...
// start the counter that shows the time spent for
// dynamic mesh normal vectors, tangent vectors and a mesh bounding box calculation
engine.profiler.begin("mesh");
mesh.updateBounds();
mesh.updateTangents();
mesh.flushVertex();
// stop the counter
engine.profiler.end();
Arguments
- string name - Name of the counter.
float engine.profiler.end()
Stops the last activated counter and returns its value.Return value
Value of the counter in milliseconds.Last update: 2017-12-21
Help improve this article
Was this article helpful?
(or select a word/phrase and press Ctrl+Enter)