feat(runtime): distribute Control provider amounts
Docs Deploy / Build and Deploy MkDocs (push) Successful in 39s

This commit is contained in:
Valentin Popov committed 2026-10-29 18:24:43 +04:00
1 parent be4031cb54
commit d8e86e4f33
5 files changed
+1022 -38

No files matched your search

+13 -4
View File
@@ -995,7 +995,13 @@ clock Control.
добавку либо пропорционально свободному месту, либо по очереди: при максимумах
`[30, 60, 50]`, текущих значениях `[10, 20, 0]` и добавке `22` первый способ
даёт `[14, 28, 10]`. При вычитании последовательный способ начинает с последней
строки. Так одна таблица описывает и текущее значение, и то, как оно меняется.
строки. Пропорциональное вычитание делит запрос по текущим количествам.
У каждой изменившейся строки есть отдельный накопитель изменений количества: он
получает фактически применённую разницу, а не исходный запрос.
Большие суммы округляются в двоичном формате. Поэтому после нескольких
маленьких изменений общий запас иногда оказывается чуть больше первоначальной
ёмкости; оригинал продолжает считать с этой отрицательной разностью, а не
исправляет её отдельным правилом.
У строк есть и связи с родительскими узлами. Нативный `Control.dll` сначала
обновляет запрошенную строку через `0x11220`, затем `0x11130` ищет её детей
@@ -1040,8 +1046,10 @@ clock Control.
Для точного повтора важен порядок округления. При исходных значениях `[2^24, 2]`
и запросе `-1` оригинал сначала складывает общий итог с изменением, затем
вычитает прежний итог. Из-за округления фактическое изменение получается `-2`.
Нативная проверка подтвердила это поведение; общий распределитель
`0x10ba0` в Rust ещё не перенесён, хотя прямая добавка к одной строке уже доступна.
Rust переносит этот порядок, сохраняет native накопитель каждой строки и
запускает обязательный проход стадий с effects. Если ему нужны ещё не
реализованные FX или lifecycle-вызовы, таблица остаётся без изменений. Эти
операции обновляют только CPU-снимок и пока не подключены к игровым часам Control.
Отдельный путь объекта класса `4` умножает интервал на контактный коэффициент и
передаёт изменение строке. В проверенном примере коэффициент `1`, интервал `2`,
@@ -1058,7 +1066,8 @@ Control заново разыгрывает срок обновления, да
Принудительный шаг тоже расходует RNG; неактивный объект синхронизирует часы
без такого расхода. Это локальные native проверки, а не работающий Rust
Control: запросы Rust `0xe00` и `0x1002` читают текущее состояние строк,
которое пока меняет только прямой API, а `0x1005` — загруженную ставку профиля.
которое меняют явные API одной строки и распределения, а `0x1005` — загруженную
ставку профиля.
Точные нативные векторы и открытые границы описаны в [приложении](../appendices/script-vm.md#изменение-provider-состояния-control).
На x87 control word `0x007f` каждое умножение округляет мантиссу до 24 бит,