From f1e1bf11b6105aedfb6c898055a60f23e75557a5 Mon Sep 17 00:00:00 2001 From: James Turner Date: Sun, 24 Jun 2018 21:55:20 +0100 Subject: [PATCH] Cache x/y nodes in Canvas::Map::GeoPair This removes a bad CPU hit when Canvas map is used continuously, since this is two named property lookups per map coord per frame --- simgear/canvas/elements/map/geo_node_pair.hxx | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/simgear/canvas/elements/map/geo_node_pair.hxx b/simgear/canvas/elements/map/geo_node_pair.hxx index deb4c373..4733238b 100644 --- a/simgear/canvas/elements/map/geo_node_pair.hxx +++ b/simgear/canvas/elements/map/geo_node_pair.hxx @@ -67,7 +67,8 @@ namespace canvas { _node_lat = node; _status &= ~LAT_MISSING; - + _xNode.reset(); + if( node == _node_lon ) { _node_lon = 0; @@ -79,7 +80,8 @@ namespace canvas { _node_lon = node; _status &= ~LON_MISSING; - + _yNode.reset(); + if( node == _node_lat ) { _node_lat = 0; @@ -100,16 +102,25 @@ namespace canvas void setTargetName(const std::string& name) { _target_name = name; + _xNode.reset(); + _yNode.reset(); } void setScreenPos(float x, float y) { assert( isComplete() ); - SGPropertyNode *parent = _node_lat->getParent(); - parent->getChild(_target_name, _node_lat->getIndex(), true) - ->setDoubleValue(x); - parent->getChild(_target_name, _node_lon->getIndex(), true) - ->setDoubleValue(y); + if (!_xNode) { + SGPropertyNode *parent = _node_lat->getParent(); + _xNode = parent->getChild(_target_name, _node_lat->getIndex(), true); + } + + if (!_yNode) { + SGPropertyNode *parent = _node_lat->getParent(); + _yNode = parent->getChild(_target_name, _node_lon->getIndex(), true); + } + + _xNode->setDoubleValue(x); + _yNode->setDoubleValue(y); } void print() @@ -125,6 +136,8 @@ namespace canvas SGPropertyNode *_node_lat, *_node_lon; std::string _target_name; + SGPropertyNode_ptr _xNode, + _yNode; };