test(runtime): verify randomized Control resource cadence
Docs Deploy / Build and Deploy MkDocs (push) Successful in 36s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 36s
This commit is contained in:
4 files changed
+103
-9
No files matched your search
@@ -369,8 +369,13 @@ Control выставлен flag `0x102`, слово флагов ANI `+0x14` и
|
||||
видимость, это отдельная непроверенная граница, а не FX callbacks. Бюджетная
|
||||
часть активного `0xbcf0` исполнена на синтетическом хосте класса `10`:
|
||||
при периоде `500` и нулевом RNG проверены пропуск до deadline и на равенстве
|
||||
`437.5`, затем ресурсный `dt = 0.5` при времени `500`. Движение и очереди
|
||||
исключены условиями вектора; активация `+0xe0` задана явно. Отдельный вектор
|
||||
`437.5`, затем ресурсный `dt = 0.5` при времени `500`. На том же ограниченном
|
||||
хосте без устройств seed `0x12345678` подтверждает новые RNG draw при временах
|
||||
`500`, `501`, `502`, `503` и ресурсные clocks `0`, `0`, `502`, `502`: deadline
|
||||
пересчитывается при каждом принятом активном вызове. Проверены также точное
|
||||
равенство с ненулевым RNG, расход RNG при принудительном `+0xd4` и сохранение
|
||||
RNG/счётчика в неактивной ветви. Движение и очереди исключены условиями этих
|
||||
векторов; активация `+0xe0` задана явно. Отдельный вектор
|
||||
класса `4` исполняет событие `4` через `0x31ae0` → `0x314f0`, проверяя
|
||||
активность, начальные часы `time - 100`, округление DWORD в `f32` и одну
|
||||
начальную команду. Геометрические callbacks подставлены явно, таблицы
|
||||
|
||||
@@ -771,9 +771,44 @@ DLL. Экспорт `InitializeSettings` (RVA `0x32260`) регистрируе
|
||||
до `0x42206666`, долю до `0x3ecd4fdf`; mock-генератор получает `dt = 0.5`
|
||||
ровно один раз. После вызова dirty равен `1`, а агрегат `+0x588` ещё не
|
||||
пересчитан: бюджетное изменение происходит после предшествующего `0x12a40`.
|
||||
Событие активации проверено отдельно выше. Ненулевые состояния RNG,
|
||||
принудительный цикл по `+0xd4`, движение и непустые очереди остаются отдельными
|
||||
границами.
|
||||
Событие активации проверено отдельно выше.
|
||||
|
||||
Условие срока не использует сохранённый deadline. Машинные инструкции
|
||||
`0xc74a..0xc7c1` на каждом дошедшем до этой точки вызове изменяют RNG
|
||||
`Control.dll+0x43228` и заново вычисляют порог. Два 16-битных слова состояния
|
||||
обновляются по правилу `low' = u16(low << 1) XOR high`,
|
||||
`high' = (high >> 1) XOR low'`. При периоде `P` четверть периода равна
|
||||
`q = P * 0.25`, коэффициент случайного вклада — `q / 65536`, а порог имеет вид
|
||||
`(high' * (q / 65536) - q * 0.5) + P + last_resource_time`.
|
||||
Порядок этих x87 операций существенен; отдельное сохранение коэффициента в
|
||||
`f32` видно по RVA `0xc78e`. Это RNG данного модуля, его нельзя подменять
|
||||
LCG планировщика Behavior.
|
||||
|
||||
При `P = 500`, исходных `+0xe4 = +0xec = 0` и seed `0x12345678` проверены
|
||||
следующие последовательные вызовы. Таблица устройств здесь пуста: вектор
|
||||
изолирует cadence после отдельной проверки настоящего бюджетного изменения.
|
||||
|
||||
| Время | RNG после проверки срока | Последний ресурсный clock `+0xec` |
|
||||
| --- | --- | --- |
|
||||
| `0.5` | `0x12345678`, без изменения | `0` |
|
||||
| `500` | `0xb7debec4` | `0` |
|
||||
| `501` | `0x91b9ca56` | `0` |
|
||||
| `502` | `0x4dc90515` | `502` |
|
||||
| `503` | `0x610747e3` | `502` |
|
||||
|
||||
Оба первых принятых вызова пропускают ресурсный шаг, но всё равно расходуют
|
||||
RNG. На третьем порог меняется и шаг выполняется раньше прежних порогов.
|
||||
Поэтому предварительно выбрать один случайный deadline до следующего
|
||||
ресурсного шага означало бы другую модель времени.
|
||||
|
||||
Отдельный seed `0xffff0000` после одного перехода даёт `0x8000ffff` и порог
|
||||
ровно `500`: равенство снова пропускается. Вызов `501` получает
|
||||
`0x3ffe7ffe` и обновляет ресурсный clock. Затем `+0xd4 = 2` принуждает вызов
|
||||
`502` выполнить ещё один цикл, несмотря на новый порог; RNG становится
|
||||
`0xdffdc002`, а счётчик уменьшается до `1`. Если после этого снять `+0xe0`,
|
||||
вызов `503` синхронизирует `+0xec`, но сохраняет RNG и принудительный счётчик.
|
||||
Движение, непустые очереди и исполнение всего этого пути в миссии остаются
|
||||
отдельными границами.
|
||||
|
||||
#### Доставка игровых часов в Control
|
||||
|
||||
|
||||
Reference in new issue
Block a user