Ported from godot4: Add NavigationServer Performance Monitor

Adds Performance Monitor for NavigationServer3D.
- smix8
9802914f97
This commit is contained in:
Relintai 2023-06-09 10:17:43 +02:00
parent 2b4d3e69de
commit b940854ca9
10 changed files with 312 additions and 30 deletions

View File

@ -140,6 +140,13 @@
Returns all created navigation map [RID]s on the NavigationServer. This returns both 2D and 3D created navigation maps as there is technically no distinction between them. Returns all created navigation map [RID]s on the NavigationServer. This returns both 2D and 3D created navigation maps as there is technically no distinction between them.
</description> </description>
</method> </method>
<method name="get_process_info" qualifiers="const">
<return type="int" />
<param index="0" name="process_info" type="int" enum="NavigationServer3D.ProcessInfo" />
<description>
Returns information about the current state of the NavigationServer. See [enum ProcessInfo] for a list of available states.
</description>
</method>
<method name="link_create" qualifiers="const"> <method name="link_create" qualifiers="const">
<return type="RID" /> <return type="RID" />
<description> <description>
@ -577,5 +584,32 @@
</signal> </signal>
</signals> </signals>
<constants> <constants>
<constant name="INFO_ACTIVE_MAPS" value="0" enum="ProcessInfo">
Constant to get the number of active navigation maps.
</constant>
<constant name="INFO_REGION_COUNT" value="1" enum="ProcessInfo">
Constant to get the number of active navigation regions.
</constant>
<constant name="INFO_AGENT_COUNT" value="2" enum="ProcessInfo">
Constant to get the number of active navigation agents processing avoidance.
</constant>
<constant name="INFO_LINK_COUNT" value="3" enum="ProcessInfo">
Constant to get the number of active navigation links.
</constant>
<constant name="INFO_POLYGON_COUNT" value="4" enum="ProcessInfo">
Constant to get the number of navigation mesh polygons.
</constant>
<constant name="INFO_EDGE_COUNT" value="5" enum="ProcessInfo">
Constant to get the number of navigation mesh polygon edges.
</constant>
<constant name="INFO_EDGE_MERGE_COUNT" value="6" enum="ProcessInfo">
Constant to get the number of navigation mesh polygon edges that were merged due to edge key overlap.
</constant>
<constant name="INFO_EDGE_CONNECTION_COUNT" value="7" enum="ProcessInfo">
Constant to get the number of navigation mesh polygon edges that are considered connected by edge proximity.
</constant>
<constant name="INFO_EDGE_FREE_COUNT" value="8" enum="ProcessInfo">
Constant to get the number of navigation mesh polygon edges that could not be merged but may be still connected by edge proximity or with links.
</constant>
</constants> </constants>
</class> </class>

View File

@ -32,91 +32,121 @@
<constant name="TIME_PHYSICS_PROCESS" value="2" enum="Monitor"> <constant name="TIME_PHYSICS_PROCESS" value="2" enum="Monitor">
Time it took to complete one physics frame, in seconds. Time it took to complete one physics frame, in seconds.
</constant> </constant>
<constant name="MEMORY_STATIC" value="3" enum="Monitor"> <constant name="TIME_NAVIGATION_PROCESS" value="3" enum="Monitor">
Time it took to complete one navigation step, in seconds. This includes navigation map updates as well as agent avoidance calculations. [i]Lower is better.[/i]
</constant>
<constant name="MEMORY_STATIC" value="4" enum="Monitor">
Static memory currently used, in bytes. Not available in release builds. Static memory currently used, in bytes. Not available in release builds.
</constant> </constant>
<constant name="MEMORY_DYNAMIC" value="4" enum="Monitor"> <constant name="MEMORY_DYNAMIC" value="5" enum="Monitor">
Dynamic memory currently used, in bytes. Not available in release builds. Dynamic memory currently used, in bytes. Not available in release builds.
</constant> </constant>
<constant name="MEMORY_STATIC_MAX" value="5" enum="Monitor"> <constant name="MEMORY_STATIC_MAX" value="6" enum="Monitor">
Available static memory. Not available in release builds. Available static memory. Not available in release builds.
</constant> </constant>
<constant name="MEMORY_DYNAMIC_MAX" value="6" enum="Monitor"> <constant name="MEMORY_DYNAMIC_MAX" value="7" enum="Monitor">
Available dynamic memory. Not available in release builds. Available dynamic memory. Not available in release builds.
</constant> </constant>
<constant name="MEMORY_MESSAGE_BUFFER_MAX" value="7" enum="Monitor"> <constant name="MEMORY_MESSAGE_BUFFER_MAX" value="8" enum="Monitor">
Largest amount of memory the message queue buffer has used, in bytes. The message queue is used for deferred functions calls and notifications. Largest amount of memory the message queue buffer has used, in bytes. The message queue is used for deferred functions calls and notifications.
</constant> </constant>
<constant name="OBJECT_COUNT" value="8" enum="Monitor"> <constant name="OBJECT_COUNT" value="9" enum="Monitor">
Number of objects currently instanced (including nodes). Number of objects currently instanced (including nodes).
</constant> </constant>
<constant name="OBJECT_RESOURCE_COUNT" value="9" enum="Monitor"> <constant name="OBJECT_RESOURCE_COUNT" value="10" enum="Monitor">
Number of resources currently used. Number of resources currently used.
</constant> </constant>
<constant name="OBJECT_NODE_COUNT" value="10" enum="Monitor"> <constant name="OBJECT_NODE_COUNT" value="11" enum="Monitor">
Number of nodes currently instanced in the scene tree. This also includes the root node. Number of nodes currently instanced in the scene tree. This also includes the root node.
</constant> </constant>
<constant name="OBJECT_ORPHAN_NODE_COUNT" value="11" enum="Monitor"> <constant name="OBJECT_ORPHAN_NODE_COUNT" value="12" enum="Monitor">
Number of orphan nodes, i.e. nodes which are not parented to a node of the scene tree. Number of orphan nodes, i.e. nodes which are not parented to a node of the scene tree.
</constant> </constant>
<constant name="RENDER_OBJECTS_IN_FRAME" value="12" enum="Monitor"> <constant name="RENDER_OBJECTS_IN_FRAME" value="13" enum="Monitor">
3D objects drawn per frame. 3D objects drawn per frame.
</constant> </constant>
<constant name="RENDER_VERTICES_IN_FRAME" value="13" enum="Monitor"> <constant name="RENDER_VERTICES_IN_FRAME" value="14" enum="Monitor">
Vertices drawn per frame. 3D only. Vertices drawn per frame. 3D only.
</constant> </constant>
<constant name="RENDER_MATERIAL_CHANGES_IN_FRAME" value="14" enum="Monitor"> <constant name="RENDER_MATERIAL_CHANGES_IN_FRAME" value="15" enum="Monitor">
Material changes per frame. 3D only. Material changes per frame. 3D only.
</constant> </constant>
<constant name="RENDER_SHADER_CHANGES_IN_FRAME" value="15" enum="Monitor"> <constant name="RENDER_SHADER_CHANGES_IN_FRAME" value="16" enum="Monitor">
Shader changes per frame. 3D only. Shader changes per frame. 3D only.
</constant> </constant>
<constant name="RENDER_SURFACE_CHANGES_IN_FRAME" value="16" enum="Monitor"> <constant name="RENDER_SURFACE_CHANGES_IN_FRAME" value="17" enum="Monitor">
Render surface changes per frame. 3D only. Render surface changes per frame. 3D only.
</constant> </constant>
<constant name="RENDER_DRAW_CALLS_IN_FRAME" value="17" enum="Monitor"> <constant name="RENDER_DRAW_CALLS_IN_FRAME" value="18" enum="Monitor">
Draw calls per frame. 3D only. Draw calls per frame. 3D only.
</constant> </constant>
<constant name="RENDER_2D_ITEMS_IN_FRAME" value="18" enum="Monitor"> <constant name="RENDER_2D_ITEMS_IN_FRAME" value="19" enum="Monitor">
Items or joined items drawn per frame. Items or joined items drawn per frame.
</constant> </constant>
<constant name="RENDER_2D_DRAW_CALLS_IN_FRAME" value="19" enum="Monitor"> <constant name="RENDER_2D_DRAW_CALLS_IN_FRAME" value="20" enum="Monitor">
Draw calls per frame. Draw calls per frame.
</constant> </constant>
<constant name="RENDER_VIDEO_MEM_USED" value="20" enum="Monitor"> <constant name="RENDER_VIDEO_MEM_USED" value="21" enum="Monitor">
The amount of video memory used, i.e. texture and vertex memory combined. The amount of video memory used, i.e. texture and vertex memory combined.
</constant> </constant>
<constant name="RENDER_TEXTURE_MEM_USED" value="21" enum="Monitor"> <constant name="RENDER_TEXTURE_MEM_USED" value="22" enum="Monitor">
The amount of texture memory used. The amount of texture memory used.
</constant> </constant>
<constant name="RENDER_VERTEX_MEM_USED" value="22" enum="Monitor"> <constant name="RENDER_VERTEX_MEM_USED" value="23" enum="Monitor">
The amount of vertex memory used. The amount of vertex memory used.
</constant> </constant>
<constant name="RENDER_USAGE_VIDEO_MEM_TOTAL" value="23" enum="Monitor"> <constant name="RENDER_USAGE_VIDEO_MEM_TOTAL" value="24" enum="Monitor">
Unimplemented in the GLES2 and GLES3 rendering backends, always returns 0. Unimplemented in the GLES2 and GLES3 rendering backends, always returns 0.
</constant> </constant>
<constant name="PHYSICS_2D_ACTIVE_OBJECTS" value="24" enum="Monitor"> <constant name="PHYSICS_2D_ACTIVE_OBJECTS" value="25" enum="Monitor">
Number of active [RigidBody2D] nodes in the game. Number of active [RigidBody2D] nodes in the game.
</constant> </constant>
<constant name="PHYSICS_2D_COLLISION_PAIRS" value="25" enum="Monitor"> <constant name="PHYSICS_2D_COLLISION_PAIRS" value="26" enum="Monitor">
Number of collision pairs in the 2D physics engine. Number of collision pairs in the 2D physics engine.
</constant> </constant>
<constant name="PHYSICS_2D_ISLAND_COUNT" value="26" enum="Monitor"> <constant name="PHYSICS_2D_ISLAND_COUNT" value="27" enum="Monitor">
Number of islands in the 2D physics engine. Number of islands in the 2D physics engine.
</constant> </constant>
<constant name="PHYSICS_3D_ACTIVE_OBJECTS" value="27" enum="Monitor"> <constant name="PHYSICS_3D_ACTIVE_OBJECTS" value="28" enum="Monitor">
Number of active [RigidBody] and [VehicleBody] nodes in the game. Number of active [RigidBody] and [VehicleBody] nodes in the game.
</constant> </constant>
<constant name="PHYSICS_3D_COLLISION_PAIRS" value="28" enum="Monitor"> <constant name="PHYSICS_3D_COLLISION_PAIRS" value="29" enum="Monitor">
Number of collision pairs in the 3D physics engine. Number of collision pairs in the 3D physics engine.
</constant> </constant>
<constant name="PHYSICS_3D_ISLAND_COUNT" value="29" enum="Monitor"> <constant name="PHYSICS_3D_ISLAND_COUNT" value="30" enum="Monitor">
Number of islands in the 3D physics engine. Number of islands in the 3D physics engine.
</constant> </constant>
<constant name="AUDIO_OUTPUT_LATENCY" value="30" enum="Monitor"> <constant name="AUDIO_OUTPUT_LATENCY" value="31" enum="Monitor">
Output latency of the [AudioServer]. Output latency of the [AudioServer].
</constant> </constant>
<constant name="MONITOR_MAX" value="31" enum="Monitor"> <constant name="NAVIGATION_ACTIVE_MAPS" value="32" enum="Monitor">
Number of active navigation maps in the [NavigationServer3D]. This also includes the two empty default navigation maps created by World2D and World3D.
</constant>
<constant name="NAVIGATION_REGION_COUNT" value="33" enum="Monitor">
Number of active navigation regions in the [NavigationServer3D].
</constant>
<constant name="NAVIGATION_AGENT_COUNT" value="34" enum="Monitor">
Number of active navigation agents processing avoidance in the [NavigationServer3D].
</constant>
<constant name="NAVIGATION_LINK_COUNT" value="35" enum="Monitor">
Number of active navigation links in the [NavigationServer3D].
</constant>
<constant name="NAVIGATION_POLYGON_COUNT" value="36" enum="Monitor">
Number of navigation mesh polygons in the [NavigationServer3D].
</constant>
<constant name="NAVIGATION_EDGE_COUNT" value="37" enum="Monitor">
Number of navigation mesh polygon edges in the [NavigationServer3D].
</constant>
<constant name="NAVIGATION_EDGE_MERGE_COUNT" value="38" enum="Monitor">
Number of navigation mesh polygon edges that were merged due to edge key overlap in the [NavigationServer3D].
</constant>
<constant name="NAVIGATION_EDGE_CONNECTION_COUNT" value="39" enum="Monitor">
Number of polygon edges that are considered connected by edge proximity [NavigationServer3D].
</constant>
<constant name="NAVIGATION_EDGE_FREE_COUNT" value="40" enum="Monitor">
Number of navigation mesh polygon edges that could not be merged in the [NavigationServer3D]. The edges still may be connected by edge proximity or with links.
</constant>
<constant name="MONITOR_MAX" value="41" enum="Monitor">
Represents the size of the [enum Monitor] enum. Represents the size of the [enum Monitor] enum.
</constant> </constant>
</constants> </constants>

View File

@ -35,6 +35,7 @@
#include "scene/main/node.h" #include "scene/main/node.h"
#include "scene/main/scene_tree.h" #include "scene/main/scene_tree.h"
#include "servers/audio_server.h" #include "servers/audio_server.h"
#include "servers/navigation_server.h"
#include "servers/physics_2d_server.h" #include "servers/physics_2d_server.h"
#include "servers/physics_server.h" #include "servers/physics_server.h"
#include "servers/rendering_server.h" #include "servers/rendering_server.h"
@ -47,6 +48,7 @@ void Performance::_bind_methods() {
BIND_ENUM_CONSTANT(TIME_FPS); BIND_ENUM_CONSTANT(TIME_FPS);
BIND_ENUM_CONSTANT(TIME_PROCESS); BIND_ENUM_CONSTANT(TIME_PROCESS);
BIND_ENUM_CONSTANT(TIME_PHYSICS_PROCESS); BIND_ENUM_CONSTANT(TIME_PHYSICS_PROCESS);
BIND_ENUM_CONSTANT(TIME_NAVIGATION_PROCESS);
BIND_ENUM_CONSTANT(MEMORY_STATIC); BIND_ENUM_CONSTANT(MEMORY_STATIC);
BIND_ENUM_CONSTANT(MEMORY_DYNAMIC); BIND_ENUM_CONSTANT(MEMORY_DYNAMIC);
BIND_ENUM_CONSTANT(MEMORY_STATIC_MAX); BIND_ENUM_CONSTANT(MEMORY_STATIC_MAX);
@ -75,6 +77,15 @@ void Performance::_bind_methods() {
BIND_ENUM_CONSTANT(PHYSICS_3D_COLLISION_PAIRS); BIND_ENUM_CONSTANT(PHYSICS_3D_COLLISION_PAIRS);
BIND_ENUM_CONSTANT(PHYSICS_3D_ISLAND_COUNT); BIND_ENUM_CONSTANT(PHYSICS_3D_ISLAND_COUNT);
BIND_ENUM_CONSTANT(AUDIO_OUTPUT_LATENCY); BIND_ENUM_CONSTANT(AUDIO_OUTPUT_LATENCY);
BIND_ENUM_CONSTANT(NAVIGATION_ACTIVE_MAPS);
BIND_ENUM_CONSTANT(NAVIGATION_REGION_COUNT);
BIND_ENUM_CONSTANT(NAVIGATION_AGENT_COUNT);
BIND_ENUM_CONSTANT(NAVIGATION_LINK_COUNT);
BIND_ENUM_CONSTANT(NAVIGATION_POLYGON_COUNT);
BIND_ENUM_CONSTANT(NAVIGATION_EDGE_COUNT);
BIND_ENUM_CONSTANT(NAVIGATION_EDGE_MERGE_COUNT);
BIND_ENUM_CONSTANT(NAVIGATION_EDGE_CONNECTION_COUNT);
BIND_ENUM_CONSTANT(NAVIGATION_EDGE_FREE_COUNT);
BIND_ENUM_CONSTANT(MONITOR_MAX); BIND_ENUM_CONSTANT(MONITOR_MAX);
} }
@ -95,6 +106,7 @@ String Performance::get_monitor_name(Monitor p_monitor) const {
"time/fps", "time/fps",
"time/process", "time/process",
"time/physics_process", "time/physics_process",
"time/navigation_process",
"memory/static", "memory/static",
"memory/dynamic", "memory/dynamic",
"memory/static_max", "memory/static_max",
@ -123,6 +135,15 @@ String Performance::get_monitor_name(Monitor p_monitor) const {
"physics_3d/collision_pairs", "physics_3d/collision_pairs",
"physics_3d/islands", "physics_3d/islands",
"audio/output_latency", "audio/output_latency",
"navigation/active_maps",
"navigation/regions",
"navigation/agents",
"navigation/links",
"navigation/polygons",
"navigation/edges",
"navigation/edges_merged",
"navigation/edges_connected",
"navigation/edges_free",
}; };
@ -137,6 +158,8 @@ float Performance::get_monitor(Monitor p_monitor) const {
return _process_time; return _process_time;
case TIME_PHYSICS_PROCESS: case TIME_PHYSICS_PROCESS:
return _physics_process_time; return _physics_process_time;
case TIME_NAVIGATION_PROCESS:
return _navigation_process_time;
case MEMORY_STATIC: case MEMORY_STATIC:
return Memory::get_mem_usage(); return Memory::get_mem_usage();
case MEMORY_DYNAMIC: case MEMORY_DYNAMIC:
@ -193,6 +216,24 @@ float Performance::get_monitor(Monitor p_monitor) const {
return PhysicsServer::get_singleton()->get_process_info(PhysicsServer::INFO_ISLAND_COUNT); return PhysicsServer::get_singleton()->get_process_info(PhysicsServer::INFO_ISLAND_COUNT);
case AUDIO_OUTPUT_LATENCY: case AUDIO_OUTPUT_LATENCY:
return AudioServer::get_singleton()->get_output_latency(); return AudioServer::get_singleton()->get_output_latency();
case NAVIGATION_ACTIVE_MAPS:
return NavigationServer::get_singleton()->get_process_info(NavigationServer::INFO_ACTIVE_MAPS);
case NAVIGATION_REGION_COUNT:
return NavigationServer::get_singleton()->get_process_info(NavigationServer::INFO_REGION_COUNT);
case NAVIGATION_AGENT_COUNT:
return NavigationServer::get_singleton()->get_process_info(NavigationServer::INFO_AGENT_COUNT);
case NAVIGATION_LINK_COUNT:
return NavigationServer::get_singleton()->get_process_info(NavigationServer::INFO_LINK_COUNT);
case NAVIGATION_POLYGON_COUNT:
return NavigationServer::get_singleton()->get_process_info(NavigationServer::INFO_POLYGON_COUNT);
case NAVIGATION_EDGE_COUNT:
return NavigationServer::get_singleton()->get_process_info(NavigationServer::INFO_EDGE_COUNT);
case NAVIGATION_EDGE_MERGE_COUNT:
return NavigationServer::get_singleton()->get_process_info(NavigationServer::INFO_EDGE_MERGE_COUNT);
case NAVIGATION_EDGE_CONNECTION_COUNT:
return NavigationServer::get_singleton()->get_process_info(NavigationServer::INFO_EDGE_CONNECTION_COUNT);
case NAVIGATION_EDGE_FREE_COUNT:
return NavigationServer::get_singleton()->get_process_info(NavigationServer::INFO_EDGE_FREE_COUNT);
default: { default: {
} }
@ -209,6 +250,7 @@ Performance::MonitorType Performance::get_monitor_type(Monitor p_monitor) const
MONITOR_TYPE_QUANTITY, MONITOR_TYPE_QUANTITY,
MONITOR_TYPE_TIME, MONITOR_TYPE_TIME,
MONITOR_TYPE_TIME, MONITOR_TYPE_TIME,
MONITOR_TYPE_TIME,
MONITOR_TYPE_MEMORY, MONITOR_TYPE_MEMORY,
MONITOR_TYPE_MEMORY, MONITOR_TYPE_MEMORY,
MONITOR_TYPE_MEMORY, MONITOR_TYPE_MEMORY,
@ -237,6 +279,12 @@ Performance::MonitorType Performance::get_monitor_type(Monitor p_monitor) const
MONITOR_TYPE_QUANTITY, MONITOR_TYPE_QUANTITY,
MONITOR_TYPE_QUANTITY, MONITOR_TYPE_QUANTITY,
MONITOR_TYPE_TIME, MONITOR_TYPE_TIME,
MONITOR_TYPE_QUANTITY,
MONITOR_TYPE_QUANTITY,
MONITOR_TYPE_QUANTITY,
MONITOR_TYPE_QUANTITY,
MONITOR_TYPE_QUANTITY,
MONITOR_TYPE_QUANTITY,
}; };
@ -251,8 +299,13 @@ void Performance::set_physics_process_time(float p_pt) {
_physics_process_time = p_pt; _physics_process_time = p_pt;
} }
void Performance::set_navigation_process_time(float p_pt) {
_navigation_process_time = p_pt;
}
Performance::Performance() { Performance::Performance() {
_process_time = 0; _process_time = 0;
_physics_process_time = 0; _physics_process_time = 0;
_navigation_process_time = 0;
singleton = this; singleton = this;
} }

View File

@ -45,6 +45,7 @@ class Performance : public Object {
float _process_time; float _process_time;
float _physics_process_time; float _physics_process_time;
float _navigation_process_time;
public: public:
enum Monitor { enum Monitor {
@ -52,6 +53,7 @@ public:
TIME_FPS, TIME_FPS,
TIME_PROCESS, TIME_PROCESS,
TIME_PHYSICS_PROCESS, TIME_PHYSICS_PROCESS,
TIME_NAVIGATION_PROCESS,
MEMORY_STATIC, MEMORY_STATIC,
MEMORY_DYNAMIC, MEMORY_DYNAMIC,
MEMORY_STATIC_MAX, MEMORY_STATIC_MAX,
@ -79,8 +81,16 @@ public:
PHYSICS_3D_ACTIVE_OBJECTS, PHYSICS_3D_ACTIVE_OBJECTS,
PHYSICS_3D_COLLISION_PAIRS, PHYSICS_3D_COLLISION_PAIRS,
PHYSICS_3D_ISLAND_COUNT, PHYSICS_3D_ISLAND_COUNT,
//physics
AUDIO_OUTPUT_LATENCY, AUDIO_OUTPUT_LATENCY,
NAVIGATION_ACTIVE_MAPS,
NAVIGATION_REGION_COUNT,
NAVIGATION_AGENT_COUNT,
NAVIGATION_LINK_COUNT,
NAVIGATION_POLYGON_COUNT,
NAVIGATION_EDGE_COUNT,
NAVIGATION_EDGE_MERGE_COUNT,
NAVIGATION_EDGE_CONNECTION_COUNT,
NAVIGATION_EDGE_FREE_COUNT,
MONITOR_MAX MONITOR_MAX
}; };
@ -97,6 +107,7 @@ public:
void set_process_time(float p_pt); void set_process_time(float p_pt);
void set_physics_process_time(float p_pt); void set_physics_process_time(float p_pt);
void set_navigation_process_time(float p_pt);
static Performance *get_singleton() { return singleton; } static Performance *get_singleton() { return singleton; }

View File

@ -547,6 +547,16 @@ void NavMap::remove_agent_as_controlled(RvoAgent *agent) {
} }
void NavMap::sync() { void NavMap::sync() {
// Performance Monitor
int _new_pm_region_count = regions.size();
int _new_pm_agent_count = agents.size();
int _new_pm_link_count = links.size();
int _new_pm_polygon_count = pm_polygon_count;
int _new_pm_edge_count = pm_edge_count;
int _new_pm_edge_merge_count = pm_edge_merge_count;
int _new_pm_edge_connection_count = pm_edge_connection_count;
int _new_pm_edge_free_count = pm_edge_free_count;
// Check if we need to update the links. // Check if we need to update the links.
if (regenerate_polygons) { if (regenerate_polygons) {
for (uint32_t r = 0; r < regions.size(); r++) { for (uint32_t r = 0; r < regions.size(); r++) {
@ -568,6 +578,12 @@ void NavMap::sync() {
} }
if (regenerate_links) { if (regenerate_links) {
_new_pm_polygon_count = 0;
_new_pm_edge_count = 0;
_new_pm_edge_merge_count = 0;
_new_pm_edge_connection_count = 0;
_new_pm_edge_free_count = 0;
// Remove regions connections. // Remove regions connections.
for (uint32_t r = 0; r < regions.size(); r++) { for (uint32_t r = 0; r < regions.size(); r++) {
regions[r]->get_connections().clear(); regions[r]->get_connections().clear();
@ -592,6 +608,8 @@ void NavMap::sync() {
count += regions[r]->get_polygons().size(); count += regions[r]->get_polygons().size();
} }
_new_pm_polygon_count = polygons.size();
// Group all edges per key. // Group all edges per key.
RBMap<gd::EdgeKey, Vector<gd::Edge::Connection>> connections; RBMap<gd::EdgeKey, Vector<gd::Edge::Connection>> connections;
@ -606,6 +624,7 @@ void NavMap::sync() {
if (!connection) { if (!connection) {
connections[ek] = Vector<gd::Edge::Connection>(); connections[ek] = Vector<gd::Edge::Connection>();
_new_pm_edge_count += 1;
} }
if (connections[ek].size() <= 1) { if (connections[ek].size() <= 1) {
@ -632,6 +651,7 @@ void NavMap::sync() {
c1.polygon->edges[c1.edge].connections.push_back(c2); c1.polygon->edges[c1.edge].connections.push_back(c2);
c2.polygon->edges[c2.edge].connections.push_back(c1); c2.polygon->edges[c2.edge].connections.push_back(c1);
// Note: The pathway_start/end are full for those connection and do not need to be modified. // Note: The pathway_start/end are full for those connection and do not need to be modified.
_new_pm_edge_merge_count += 1;
} else { } else {
CRASH_COND_MSG(E->get().size() != 1, vformat("Number of connection != 1. Found: %d", E->get().size())); CRASH_COND_MSG(E->get().size() != 1, vformat("Number of connection != 1. Found: %d", E->get().size()));
free_edges.push_back(E->get()[0]); free_edges.push_back(E->get()[0]);
@ -645,6 +665,8 @@ void NavMap::sync() {
// to be connected, create new polygons to remove that small gap is // to be connected, create new polygons to remove that small gap is
// not really useful and would result in wasteful computation during // not really useful and would result in wasteful computation during
// connection, integration and path finding. // connection, integration and path finding.
_new_pm_edge_free_count = free_edges.size();
for (int i = 0; i < free_edges.size(); i++) { for (int i = 0; i < free_edges.size(); i++) {
const gd::Edge::Connection &free_edge = free_edges[i]; const gd::Edge::Connection &free_edge = free_edges[i];
Vector3 edge_p1 = free_edge.polygon->points[free_edge.edge].pos; Vector3 edge_p1 = free_edge.polygon->points[free_edge.edge].pos;
@ -699,6 +721,7 @@ void NavMap::sync() {
// Add the connection to the region_connection map. // Add the connection to the region_connection map.
((NavRegion *)free_edge.polygon->owner)->get_connections().push_back(new_connection); ((NavRegion *)free_edge.polygon->owner)->get_connections().push_back(new_connection);
_new_pm_edge_connection_count += 1;
} }
} }
@ -835,6 +858,16 @@ void NavMap::sync() {
regenerate_polygons = false; regenerate_polygons = false;
regenerate_links = false; regenerate_links = false;
agents_dirty = false; agents_dirty = false;
// Performance Monitor
pm_region_count = _new_pm_region_count;
pm_agent_count = _new_pm_agent_count;
pm_link_count = _new_pm_link_count;
pm_polygon_count = _new_pm_polygon_count;
pm_edge_count = _new_pm_edge_count;
pm_edge_merge_count = _new_pm_edge_merge_count;
pm_edge_connection_count = _new_pm_edge_connection_count;
pm_edge_free_count = _new_pm_edge_free_count;
} }
void NavMap::compute_single_step(uint32_t index, RvoAgent **agent) { void NavMap::compute_single_step(uint32_t index, RvoAgent **agent) {
@ -915,6 +948,16 @@ NavMap::NavMap() {
deltatime = 0.0; deltatime = 0.0;
map_update_id = 0; map_update_id = 0;
link_connection_radius = 1.0; link_connection_radius = 1.0;
// Performance Monitor
pm_region_count = 0;
pm_agent_count = 0;
pm_link_count = 0;
pm_polygon_count = 0;
pm_edge_count = 0;
pm_edge_merge_count = 0;
pm_edge_connection_count = 0;
pm_edge_free_count = 0;
} }
NavMap::~NavMap() { NavMap::~NavMap() {

View File

@ -91,6 +91,16 @@ class NavMap : public NavRid {
/// Change the id each time the map is updated. /// Change the id each time the map is updated.
uint32_t map_update_id; uint32_t map_update_id;
// Performance Monitor
int pm_region_count;
int pm_agent_count;
int pm_link_count;
int pm_polygon_count;
int pm_edge_count;
int pm_edge_merge_count;
int pm_edge_connection_count;
int pm_edge_free_count;
#ifndef NO_THREADS #ifndef NO_THREADS
/// Pooled threads for computing steps /// Pooled threads for computing steps
ThreadWorkPool step_work_pool; ThreadWorkPool step_work_pool;
@ -164,6 +174,16 @@ public:
void step(real_t p_deltatime); void step(real_t p_deltatime);
void dispatch_callbacks(); void dispatch_callbacks();
// Performance Monitor
int get_pm_region_count() const { return pm_region_count; }
int get_pm_agent_count() const { return pm_agent_count; }
int get_pm_link_count() const { return pm_link_count; }
int get_pm_polygon_count() const { return pm_polygon_count; }
int get_pm_edge_count() const { return pm_edge_count; }
int get_pm_edge_merge_count() const { return pm_edge_merge_count; }
int get_pm_edge_connection_count() const { return pm_edge_connection_count; }
int get_pm_edge_free_count() const { return pm_edge_free_count; }
private: private:
void compute_single_step(uint32_t index, RvoAgent **agent); void compute_single_step(uint32_t index, RvoAgent **agent);
void clip_path(const LocalVector<gd::NavigationPoly> &p_navigation_polys, Vector<Vector3> &path, const gd::NavigationPoly *from_poly, const Vector3 &p_to_point, const gd::NavigationPoly *p_to_poly) const; void clip_path(const LocalVector<gd::NavigationPoly> &p_navigation_polys, Vector<Vector3> &path, const gd::NavigationPoly *from_poly, const Vector3 &p_to_point, const gd::NavigationPoly *p_to_poly) const;

View File

@ -818,6 +818,15 @@ void PandemoniumNavigationServer::process(real_t p_delta_time) {
return; return;
} }
int _new_pm_region_count = 0;
int _new_pm_agent_count = 0;
int _new_pm_link_count = 0;
int _new_pm_polygon_count = 0;
int _new_pm_edge_count = 0;
int _new_pm_edge_merge_count = 0;
int _new_pm_edge_connection_count = 0;
int _new_pm_edge_free_count = 0;
// In c++ we can't be sure that this is performed in the main thread // In c++ we can't be sure that this is performed in the main thread
// even with mutable functions. // even with mutable functions.
MutexLock lock(operations_mutex); MutexLock lock(operations_mutex);
@ -826,6 +835,15 @@ void PandemoniumNavigationServer::process(real_t p_delta_time) {
active_maps[i]->step(p_delta_time); active_maps[i]->step(p_delta_time);
active_maps[i]->dispatch_callbacks(); active_maps[i]->dispatch_callbacks();
_new_pm_region_count += active_maps[i]->get_pm_region_count();
_new_pm_agent_count += active_maps[i]->get_pm_agent_count();
_new_pm_link_count += active_maps[i]->get_pm_link_count();
_new_pm_polygon_count += active_maps[i]->get_pm_polygon_count();
_new_pm_edge_count += active_maps[i]->get_pm_edge_count();
_new_pm_edge_merge_count += active_maps[i]->get_pm_edge_merge_count();
_new_pm_edge_connection_count += active_maps[i]->get_pm_edge_connection_count();
_new_pm_edge_free_count += active_maps[i]->get_pm_edge_free_count();
// Emit a signal if a map changed. // Emit a signal if a map changed.
const uint32_t new_map_update_id = active_maps[i]->get_map_update_id(); const uint32_t new_map_update_id = active_maps[i]->get_map_update_id();
if (new_map_update_id != active_maps_update_id[i]) { if (new_map_update_id != active_maps_update_id[i]) {
@ -833,6 +851,15 @@ void PandemoniumNavigationServer::process(real_t p_delta_time) {
active_maps_update_id[i] = new_map_update_id; active_maps_update_id[i] = new_map_update_id;
} }
} }
pm_region_count = _new_pm_region_count;
pm_agent_count = _new_pm_agent_count;
pm_link_count = _new_pm_link_count;
pm_polygon_count = _new_pm_polygon_count;
pm_edge_count = _new_pm_edge_count;
pm_edge_merge_count = _new_pm_edge_merge_count;
pm_edge_connection_count = _new_pm_edge_connection_count;
pm_edge_free_count = _new_pm_edge_free_count;
} }
NavigationUtilities::PathQueryResult PandemoniumNavigationServer::_query_path(const NavigationUtilities::PathQueryParameters &p_parameters) const { NavigationUtilities::PathQueryResult PandemoniumNavigationServer::_query_path(const NavigationUtilities::PathQueryParameters &p_parameters) const {
@ -872,6 +899,40 @@ NavigationUtilities::PathQueryResult PandemoniumNavigationServer::_query_path(co
return r_query_result; return r_query_result;
} }
int PandemoniumNavigationServer::get_process_info(ProcessInfo p_info) const {
switch (p_info) {
case INFO_ACTIVE_MAPS: {
return active_maps.size();
} break;
case INFO_REGION_COUNT: {
return pm_region_count;
} break;
case INFO_AGENT_COUNT: {
return pm_agent_count;
} break;
case INFO_LINK_COUNT: {
return pm_link_count;
} break;
case INFO_POLYGON_COUNT: {
return pm_polygon_count;
} break;
case INFO_EDGE_COUNT: {
return pm_edge_count;
} break;
case INFO_EDGE_MERGE_COUNT: {
return pm_edge_merge_count;
} break;
case INFO_EDGE_CONNECTION_COUNT: {
return pm_edge_connection_count;
} break;
case INFO_EDGE_FREE_COUNT: {
return pm_edge_free_count;
} break;
}
return 0;
}
#undef COMMAND_1 #undef COMMAND_1
#undef COMMAND_2 #undef COMMAND_2
#undef COMMAND_4 #undef COMMAND_4

View File

@ -79,6 +79,16 @@ class PandemoniumNavigationServer : public NavigationServer {
LocalVector<NavMap *> active_maps; LocalVector<NavMap *> active_maps;
LocalVector<uint32_t> active_maps_update_id; LocalVector<uint32_t> active_maps_update_id;
// Performance Monitor
int pm_region_count = 0;
int pm_agent_count = 0;
int pm_link_count = 0;
int pm_polygon_count = 0;
int pm_edge_count = 0;
int pm_edge_merge_count = 0;
int pm_edge_connection_count = 0;
int pm_edge_free_count = 0;
public: public:
PandemoniumNavigationServer(); PandemoniumNavigationServer();
virtual ~PandemoniumNavigationServer(); virtual ~PandemoniumNavigationServer();
@ -177,6 +187,8 @@ public:
void flush_queries(); void flush_queries();
virtual void process(real_t p_delta_time); virtual void process(real_t p_delta_time);
virtual int get_process_info(ProcessInfo p_info) const;
virtual NavigationUtilities::PathQueryResult _query_path(const NavigationUtilities::PathQueryParameters &p_parameters) const; virtual NavigationUtilities::PathQueryResult _query_path(const NavigationUtilities::PathQueryParameters &p_parameters) const;
}; };

View File

@ -88,6 +88,8 @@ public:
virtual void process(real_t delta_time){}; virtual void process(real_t delta_time){};
virtual int get_process_info(ProcessInfo p_info) const { return 0; };
virtual NavigationUtilities::PathQueryResult _query_path(const NavigationUtilities::PathQueryParameters &p_parameters) const; virtual NavigationUtilities::PathQueryResult _query_path(const NavigationUtilities::PathQueryParameters &p_parameters) const;
DummyNavigationServer(); DummyNavigationServer();

View File

@ -260,6 +260,20 @@ public:
virtual void init(); virtual void init();
enum ProcessInfo {
INFO_ACTIVE_MAPS,
INFO_REGION_COUNT,
INFO_AGENT_COUNT,
INFO_LINK_COUNT,
INFO_POLYGON_COUNT,
INFO_EDGE_COUNT,
INFO_EDGE_MERGE_COUNT,
INFO_EDGE_CONNECTION_COUNT,
INFO_EDGE_FREE_COUNT,
};
virtual int get_process_info(ProcessInfo p_info) const = 0;
NavigationServer(); NavigationServer();
virtual ~NavigationServer(); virtual ~NavigationServer();
@ -351,6 +365,8 @@ protected:
#endif // DEBUG_ENABLED #endif // DEBUG_ENABLED
}; };
VARIANT_ENUM_CAST(NavigationServer::ProcessInfo);
typedef NavigationServer *(*CreateNavigationServerCallback)(); typedef NavigationServer *(*CreateNavigationServerCallback)();
/// Manager used for the server singleton registration /// Manager used for the server singleton registration