Add NavigationServer Performance Monitor
Adds Performance Monitor for NavigationServer3D.
This commit is contained in:
parent
bb08997b87
commit
9802914f97
11 changed files with 315 additions and 22 deletions
|
|
@ -829,6 +829,15 @@ void GodotNavigationServer::process(real_t p_delta_time) {
|
|||
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
|
||||
// even with mutable functions.
|
||||
MutexLock lock(operations_mutex);
|
||||
|
|
@ -837,6 +846,15 @@ void GodotNavigationServer::process(real_t p_delta_time) {
|
|||
active_maps[i]->step(p_delta_time);
|
||||
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.
|
||||
const uint32_t new_map_update_id = active_maps[i]->get_map_update_id();
|
||||
if (new_map_update_id != active_maps_update_id[i]) {
|
||||
|
|
@ -844,6 +862,15 @@ void GodotNavigationServer::process(real_t p_delta_time) {
|
|||
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;
|
||||
}
|
||||
|
||||
PathQueryResult GodotNavigationServer::_query_path(const PathQueryParameters &p_parameters) const {
|
||||
|
|
@ -886,6 +913,40 @@ PathQueryResult GodotNavigationServer::_query_path(const PathQueryParameters &p_
|
|||
return r_query_result;
|
||||
}
|
||||
|
||||
int GodotNavigationServer::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_2
|
||||
#undef COMMAND_4
|
||||
|
|
|
|||
|
|
@ -81,6 +81,16 @@ class GodotNavigationServer : public NavigationServer3D {
|
|||
LocalVector<NavMap *> active_maps;
|
||||
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:
|
||||
GodotNavigationServer();
|
||||
virtual ~GodotNavigationServer();
|
||||
|
|
@ -182,6 +192,8 @@ public:
|
|||
virtual void process(real_t p_delta_time) override;
|
||||
|
||||
virtual NavigationUtilities::PathQueryResult _query_path(const NavigationUtilities::PathQueryParameters &p_parameters) const override;
|
||||
|
||||
int get_process_info(ProcessInfo p_info) const override;
|
||||
};
|
||||
|
||||
#undef COMMAND_1
|
||||
|
|
|
|||
|
|
@ -611,6 +611,16 @@ void NavMap::remove_agent_as_controlled(RvoAgent *agent) {
|
|||
}
|
||||
|
||||
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.
|
||||
if (regenerate_polygons) {
|
||||
for (uint32_t r = 0; r < regions.size(); r++) {
|
||||
|
|
@ -632,6 +642,12 @@ void NavMap::sync() {
|
|||
}
|
||||
|
||||
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.
|
||||
for (uint32_t r = 0; r < regions.size(); r++) {
|
||||
regions[r]->get_connections().clear();
|
||||
|
|
@ -654,6 +670,8 @@ void NavMap::sync() {
|
|||
count += regions[r]->get_polygons().size();
|
||||
}
|
||||
|
||||
_new_pm_polygon_count = polygons.size();
|
||||
|
||||
// Group all edges per key.
|
||||
HashMap<gd::EdgeKey, Vector<gd::Edge::Connection>, gd::EdgeKey> connections;
|
||||
for (uint32_t poly_id = 0; poly_id < polygons.size(); poly_id++) {
|
||||
|
|
@ -666,6 +684,7 @@ void NavMap::sync() {
|
|||
HashMap<gd::EdgeKey, Vector<gd::Edge::Connection>, gd::EdgeKey>::Iterator connection = connections.find(ek);
|
||||
if (!connection) {
|
||||
connections[ek] = Vector<gd::Edge::Connection>();
|
||||
_new_pm_edge_count += 1;
|
||||
}
|
||||
if (connections[ek].size() <= 1) {
|
||||
// Add the polygon/edge tuple to this key.
|
||||
|
|
@ -691,6 +710,7 @@ void NavMap::sync() {
|
|||
c1.polygon->edges[c1.edge].connections.push_back(c2);
|
||||
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.
|
||||
_new_pm_edge_merge_count += 1;
|
||||
} else {
|
||||
CRASH_COND_MSG(E.value.size() != 1, vformat("Number of connection != 1. Found: %d", E.value.size()));
|
||||
free_edges.push_back(E.value[0]);
|
||||
|
|
@ -704,6 +724,8 @@ void NavMap::sync() {
|
|||
// to be connected, create new polygons to remove that small gap is
|
||||
// not really useful and would result in wasteful computation during
|
||||
// connection, integration and path finding.
|
||||
_new_pm_edge_free_count = free_edges.size();
|
||||
|
||||
for (int i = 0; i < free_edges.size(); i++) {
|
||||
const gd::Edge::Connection &free_edge = free_edges[i];
|
||||
Vector3 edge_p1 = free_edge.polygon->points[free_edge.edge].pos;
|
||||
|
|
@ -757,6 +779,7 @@ void NavMap::sync() {
|
|||
|
||||
// Add the connection to the region_connection map.
|
||||
((NavRegion *)free_edge.polygon->owner)->get_connections().push_back(new_connection);
|
||||
_new_pm_edge_connection_count += 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -892,6 +915,16 @@ void NavMap::sync() {
|
|||
regenerate_polygons = false;
|
||||
regenerate_links = 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) {
|
||||
|
|
|
|||
|
|
@ -89,6 +89,16 @@ class NavMap : public NavRid {
|
|||
/// Change the id each time the map is updated.
|
||||
uint32_t map_update_id = 0;
|
||||
|
||||
// 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:
|
||||
NavMap();
|
||||
~NavMap();
|
||||
|
|
@ -152,6 +162,16 @@ public:
|
|||
void step(real_t p_deltatime);
|
||||
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:
|
||||
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, Vector<int32_t> *r_path_types, TypedArray<RID> *r_path_rids, Vector<int64_t> *r_path_owners) const;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue