test(runtime): verify active Control resource clock
Docs Deploy / Build and Deploy MkDocs (push) Successful in 35s

This commit is contained in:
Valentin Popov committed 2026-10-29 15:41:08 +04:00
1 parent 35b9d86637
commit e20b902986
3 files changed
+117 -13

No files matched your search

+40 -8
View File
@@ -640,8 +640,9 @@ oracle вызывает оригинальные `FUN_10010ba0` (RVA `0x10ba0`),
затем `FMUL` с binary32-константой `0.001` (`0x3a83126f`), после чего результат
сохраняется в `f32`. Код вызывает `FUN_10012a40`, затем `FUN_1002d340` и
присваивает `+0xec = +0xe4`. В соседней ветви update packet queue обрабатывается
через `FUN_10012ce0`. Активную clock-ветвь oracle не запускал. Источник её
входного времени и порядок доставки установлены статически, как описано ниже;
через `FUN_10012ce0`. Бюджетная часть активной ветви проверена на ограниченном
хосте класса `10`, как описано ниже. Источник входного времени и порядок его
доставки до обработчика установлены статически;
Rust продолжает читать начальные provider snapshots и не моделирует эти изменения.
#### Бюджет и обновление устройства tag 15
@@ -657,7 +658,7 @@ RVA `0x22ae0`, его rate RVA `0x22b20` и update RVA `0x22bb0`.
Вектор задаёт provider с максимумом `100`, количеством `40` и долей `0.4`,
интервал `0.5` секунды, коэффициенты tag 15 равные `1` и нулевое поле
descriptor `+0x20`. Исходная rate-функция возвращает `-0.2`.
descriptor `+0x20`. Исходная rate-функция возвращает `-0.2`.
Генератор с descriptor tag `14` подставлен явно: mock возвращает положительный
вклад `0.1` или `0.5` и записывает аргументы своего update. Функции tag 15,
provider getter и изменение количества не подменены.
@@ -672,9 +673,39 @@ provider getter и изменение количества не подменен
Хотя генератор стоит первым в массиве, его update уже видит изменённое
количество: категория tag 15 обслуживается раньше. Проверены также интервал
и коэффициент, переданные mock-генератору. Его собственная генерация, другие
категории, активный clock-путь и выполнение миссии этим не проверены.
категории и выполнение миссии этим не проверены.
Rust пока не переносит этот изменяемый бюджетный цикл.
#### Активный ресурсный clock
Тот же native budget-вектор проходит через `Control.dll` RVA `0xbcf0` при
явно заданных классе `10` и признаке активности `+0xe0 = 1`. Хост подставляет
два getter-а: наличие игрового хоста и отсутствие объекта движения. Класс `10`
пропускает цикл команд и движения; очереди пакетов и detached-объектов пусты.
Поле dirty перед первым ресурсным циклом равно нулю, поэтому `0x12a40`
возвращается без пересчёта геометрии. Это исполнение бюджетной части активной
ветви, а не полная загрузка или физика объекта.
Период по RVA `0x42480` явно равен `500`, состояние RNG по RVA `0x43228` —
нулю. Эти данные принадлежат изолированному процессу oracle и восстанавливаются
после вектора. Нулевое состояние остаётся нулевым и даёт deadline
`500 - 500 / 8 = 437.5` миллисекунды при исходном `+0xec = 0`.
| Абсолютное время | Результат |
|---|---|
| `0.5` | меньше миллисекунды: `+0xe4` ещё равен `0` |
| `436` | время принято, ресурсный deadline ещё не пройден |
| `437.5` | равенство deadline: ресурсный цикл пропущен |
| `500` | `dt = (500 - 0) * 0.001 = 0.5`, бюджет исполнен, `+0xec = 500` |
Последний межкадровый интервал `+0xe8` равен `62.5`, но ресурсный интервал
берётся от отдельного `+0xec`. Исходные `0x2d340` и tag 15 изменяют amount
до `0x42206666`, долю до `0x3ecd4fdf`; mock-генератор получает `dt = 0.5`
ровно один раз. После вызова dirty равен `1`, а агрегат `+0x588` ещё не
пересчитан: бюджетное изменение происходит после предшествующего `0x12a40`.
Активация через загрузочные события, ненулевые состояния RNG, принудительный
цикл по `+0xd4`, движение и непустые очереди остаются отдельными границами.
#### Доставка игровых часов в Control
Статическая цепочка относится к GOG-модулям `World3D.dll` (SHA-256
@@ -720,8 +751,8 @@ vtable RVA `0x3b8cc` направляет этот слот в RVA `0xcbb0`; у
vtable RVA `0x3d298` направляет его в RVA `0xbcf0`.
Эта цепочка доказана инструкциями и таблицами исходных модулей. Она не является
проверкой исполнения активной ветви `0xbcf0`, её callbacks или изменения
provider-состояния в реальной миссии.
проверкой полного исполнения активной ветви `0xbcf0` или изменения
provider-состояния в реальной миссии. Ограниченный активный вектор описан выше.
#### Родители, стадии и видимость provider-узлов
@@ -773,8 +804,9 @@ NDP, Node38 и объект хоста синтетические; слот life
`AniMesh.dll!FUN_100093c0` и `FUN_1000a2a0` (пересчёт производной геометрии и
видимости) не покрыты. Эти результаты подтверждают локальные переходы и порядок
callbacks, но не полный Control update реальной миссии. Источник часов и порядок
их доставки установлены статически выше; исполнение активной clock-ветви и её
влияние на состояние реальной миссии остаются непроверенными.
их доставки установлены статически выше; бюджетная часть активной clock-ветви
проверена на синтетическом хосте класса `10`, её исполнение в реальной миссии
остаётся непроверенным.
### Начальная MSH-часть строки provider