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 для получения и установки значений. Это будет опубликовано немного позже.

Blackboard Variables

Исправления и улучшения

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