1.4.7533
октябрь — оптимизации Sleep() и редактор переменных
Переработка Sleep()
Ожидание чего-либо — обязательная часть любой автоматизации. EyeAuras постоянно с этим работает: задержки между нажатиями клавиш, поддержание стабильного FPS захвата, пользовательские таймауты в скриптах. Стандартные инструменты операционной системы и базовые методы вроде Thread.Sleep, Task.Delay и некоторых других недостаточно точны, поэтому в какой-то момент пришлось реализовать комбинацию подходов, которая обеспечивала лучшую точность.
Этот механизм позволял делать ожидания с точностью до долей миллисекунды и использовался последние 5–6 месяцев. К сожалению, такая точность имеет свою цену, и для большинства операций она попросту не нужна.
Поэтому в ближайшие несколько месяцев мы будем тестировать 3-ю версию Sleep(), которая должна стать компромиссом между точностью и затратами по производительности. В среднем ожидаемая точность — до 0.5 - 5ms.
Это значит, что если вы задаёте ожидание 1ms, фактическая задержка будет примерно в диапазоне 1 - 1.5ms, чего более чем достаточно для большинства сценариев. Для более длинных таймаутов, например 100ms, фактическое время может быть в диапазоне 100 - 105ms.
Взамен снижения точности вы получите заметно лучшую производительность. Посмотрим, как это покажет себя в реальных сценариях.
В рамках разработки этой функции я также добавил интеграционный слой, который позволит использовать тот механизм Sleep(), который лучше подходит именно под ваш сценарий. Подробнее об этом расскажу позже.
Переработка редактора Variables
- Теперь используется единый редактор для Blackboard и Variables
- Появилась возможность редактировать значения напрямую (пока не все, для начала — только примитивные типы)
- Теперь можно добавлять новые переменные — это должно немного упростить настройку
- Подготовлен механизм, который будет генерировать boilerplate-код для C#-скриптов и автоматически создавать Properties для получения и установки значений. Это будет опубликовано немного позже.

Исправления и улучшения
- В
ExecuteScriptNodeсвойствоIsMaximizedтеперь сохраняется в самом узле - [BehaviorTrees] Узел ExecuteScript теперь запоминает, был ли он развернут (
Maximized) или нет - [Scripting] В
ScriptVariableдобавленListen()— теперь его можно использовать вместоWatchCurrentValue - [Scripting] Исправлена проблема, из-за которой в некоторых случаях папки не находились по относительному пути
- [Scripting] Исправлена проблема, при которой code rewriter в некоторых случаях генерировал некорректный код, не проходящий компиляцию