A very sleepy MSVC problem
Currently, using Tree::sleep() or Tree::tickWhileRunning() provides unexpected sleep durations using MSVC.
(To my knowledge) Sleep times are rounded up to the nearest 1/64th of a second due to how MSVC/Windows handles thread sleeping.
This is a known quirk of MSVC's conditional / thread sleep implementation.
This behaviour is triggered by the usage of std::condition_variable::wait_for in WakeUpSignal::waitFor(...) here.
Whilst the STL guidelines state that these methods should sleep for at least x amount of time, I've found it frustrating when it's 16x longer than expected with a 1ms wait time.
Simple Solution
A note in the documentation about running at rates indivisible by 1/64th of a second, especially for fast refresh rates.
A much more complicated solution
Adjust how the condition variable times out in the WakeUpSignal::waitFor function for MSVC. I can also put in a PR for this but wanted to raise this as an issue first incase it's outside of scope or whether a note in the documentation would be more suitable. I have implemented a similar fix specialised for MSVC where it does a thread sleep for the duration minus 1/64th of a second followed by a busy wait for the remainder.
As always, thank you for the incredible library and I hope at least this helps someone who might be scratching their head thinking "Why isn't BehaviorTree running faster than 64fps on my Windows machine?"
A very sleepy MSVC problem
Currently, using
Tree::sleep()orTree::tickWhileRunning()provides unexpected sleep durations using MSVC.(To my knowledge) Sleep times are rounded up to the nearest 1/64th of a second due to how MSVC/Windows handles thread sleeping.
This is a known quirk of MSVC's conditional / thread sleep implementation.
This behaviour is triggered by the usage of
std::condition_variable::wait_forinWakeUpSignal::waitFor(...)here.Whilst the STL guidelines state that these methods should sleep for at least x amount of time, I've found it frustrating when it's 16x longer than expected with a 1ms wait time.
Simple Solution
A note in the documentation about running at rates indivisible by 1/64th of a second, especially for fast refresh rates.
A much more complicated solution
Adjust how the condition variable times out in the
WakeUpSignal::waitForfunction for MSVC. I can also put in a PR for this but wanted to raise this as an issue first incase it's outside of scope or whether a note in the documentation would be more suitable. I have implemented a similar fix specialised for MSVC where it does a thread sleep for the duration minus 1/64th of a second followed by a busy wait for the remainder.As always, thank you for the incredible library and I hope at least this helps someone who might be scratching their head thinking "Why isn't BehaviorTree running faster than 64fps on my Windows machine?"