Skip to content

Commit 8228d42

Browse files
Implement a customizable tick rate to improve perf (closes #255). (#258)
* Implement a customizable tick rate to improve perf (closes #255). * Add unit test. * Add test reports to gitignore. --------- Co-authored-by: miguel <[email protected]>
1 parent d607a20 commit 8228d42

File tree

4 files changed

+44
-7
lines changed

4 files changed

+44
-7
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,5 @@ export_presets.cfg
99
.mono/
1010
data_*/
1111
.godot/
12+
13+
reports/

addons/beehave/nodes/beehave_tree.gd

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ signal tree_enabled
1919
signal tree_disabled
2020

2121

22-
## Wether this behavior tree should be enabled or not.
22+
## Whether this behavior tree should be enabled or not.
2323
@export var enabled: bool = true:
2424
set(value):
2525
enabled = value
@@ -35,6 +35,11 @@ signal tree_disabled
3535
return enabled
3636

3737

38+
## How often the tree should tick, in frames. The default value of 1 means
39+
## tick() runs every frame.
40+
@export var tick_rate: int = 1
41+
42+
3843
## An optional node path this behavior tree should apply to.
3944
@export_node_path var actor_node_path : NodePath:
4045
set(anp):
@@ -95,6 +100,7 @@ signal tree_disabled
95100

96101
var actor : Node
97102
var status : int = -1
103+
var last_tick : int = 0
98104

99105
var _internal_blackboard: Blackboard
100106
var _process_time_metric_name : String
@@ -132,19 +138,28 @@ func _ready() -> void:
132138
BeehaveGlobalDebugger.register_tree(self)
133139
BeehaveDebuggerMessages.register_tree(_get_debugger_data(self))
134140

141+
# Randomize at what frames tick() will happen to avoid stutters
142+
last_tick = randi_range(0, tick_rate - 1)
143+
135144

136-
func _physics_process(delta: float) -> void:
137-
_process_internally(delta)
145+
func _physics_process(_delta: float) -> void:
146+
_process_internally()
138147

139148

140-
func _process(delta: float) -> void:
141-
_process_internally(delta)
149+
func _process(_delta: float) -> void:
150+
_process_internally()
142151

143152

144-
func _process_internally(delta: float) -> void:
153+
func _process_internally() -> void:
145154
if Engine.is_editor_hint():
146155
return
147156

157+
if last_tick < tick_rate - 1:
158+
last_tick += 1
159+
return
160+
161+
last_tick = 0
162+
148163
# Start timing for metric
149164
var start_time = Time.get_ticks_usec()
150165

@@ -250,7 +265,7 @@ func _exit_tree() -> void:
250265

251266
# Called by the engine to profile this tree
252267
func _get_process_time_metric_value() -> int:
253-
return _process_time_metric_value
268+
return int(_process_time_metric_value)
254269

255270

256271
func _get_debugger_data(node: Node) -> Dictionary:

runtest.sh

100644100755
File mode changed.

test/beehave_tree_test.gd

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,26 @@ func test_normal_tick() -> void:
2121
scene.beehave_tree._physics_process(1.0)
2222
assert_that(scene.beehave_tree.status).is_equal(BeehaveNode.SUCCESS)
2323

24+
func test_low_tick_rate() -> void:
25+
var scene = create_scene()
26+
scene_runner(scene)
27+
scene.beehave_tree.tick_rate = 3
28+
scene.beehave_tree._physics_process(1.0)
29+
assert_that(scene.beehave_tree.status).is_equal(-1)
30+
scene.beehave_tree._physics_process(1.0)
31+
assert_that(scene.beehave_tree.status).is_equal(-1)
32+
scene.beehave_tree._physics_process(1.0)
33+
assert_that(scene.beehave_tree.status).is_equal(BeehaveNode.SUCCESS)
34+
35+
func test_low_tick_rate_last_tick() -> void:
36+
var scene = create_scene()
37+
scene_runner(scene)
38+
scene.beehave_tree.tick_rate = 3
39+
scene.beehave_tree.last_tick = 1
40+
scene.beehave_tree._physics_process(1.0)
41+
assert_that(scene.beehave_tree.status).is_equal(-1)
42+
scene.beehave_tree._physics_process(1.0)
43+
assert_that(scene.beehave_tree.status).is_equal(BeehaveNode.SUCCESS)
2444

2545
func test_nothing_running_before_first_tick() -> void:
2646
var scene = create_scene()

0 commit comments

Comments
 (0)