feat(runtime): support tag-26 Control resource budgets
Docs Deploy / Build and Deploy MkDocs (push) Successful in 41s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 41s
This commit is contained in:
5 files changed
+688
-42
No files matched your search
@@ -361,7 +361,7 @@ API `distribute_loaded_mission_control_provider_amount` переносит
|
||||
Три API работают только с CPU-проекцией и не подключены к GPU/window path или
|
||||
игровому Control clock. Отдельный
|
||||
`advance_loaded_mission_control_budget` переносит `0x2d340` для фабричных
|
||||
callbacks `9`, `15`, `19` и общей default-пары; category lookup использует
|
||||
callbacks `9`, `15`, `19`, `26` и общей default-пары; category lookup использует
|
||||
текущий descriptor tag из подтверждённого префикса `0..=34`. Ставки сохраняются
|
||||
в `+0x5dc/+0x5e0`. Шаг выполняется транзакционно, а неподдержанный
|
||||
специализированный callback, provider или диапазон числа возвращает ошибку без частичного
|
||||
@@ -417,20 +417,30 @@ visibility transition `0x11920` с исходными AniMesh callbacks. Отд
|
||||
в этом векторе подставлен mock-ом. Отдельный вектор с исходным генератором
|
||||
tag `19` (`0x22980`, `0x229a0`, `0x22a60`) проверяет полную и ограниченную
|
||||
rate, изменение provider и собственного множителя генератора; отрицательные
|
||||
параметры и нулевой знаменатель не проверены. Native-векторы бюджетного шага
|
||||
параметры и нулевой знаменатель не проверены. Новый оригинальный вектор
|
||||
`0x2d340` смешивает tag `19` и tag `26`: supply `0.125` покрывает половину
|
||||
demand `0.25`, итоговые множители равны `0.6875` и `0.5`, а выходы —
|
||||
`0x80000000` и `0x3e800000`. Тот же oracle подтверждает tag-26 selector `0x500`,
|
||||
общий reader `0x21d50` и сохранение поля `+0xa4` при `INTO`. Rust-тест
|
||||
повторяет бюджетную пару и разрешает tag `26` в projection INTO guard, оставляя
|
||||
теги `1`, `17` и `30` явными границами. Native-векторы бюджетного шага
|
||||
подтверждают текущие ставки `+0x5dc/+0x5e0`, включая значения `0.2`/`0.4` у
|
||||
потребителя tag 15, пустой результат `-0.0` и невырожденную пару исходных
|
||||
устройств tag 19/tag 15 при `dt = 0.375`; Rust-тест повторяет поля этой пары
|
||||
на синтетической таблице. Rust переносит class-9 rate/update и шестизначную
|
||||
adjustment `0x25a90`, общую default callback-пару `0x21860/0x21890`, а также
|
||||
category map только для current descriptor tags `0..=34`. Специализированные
|
||||
factory callbacks вне этого набора остаются явными ошибками.
|
||||
adjustment `0x25a90`, tag-26 rate/update и setter selector `0x500`, общую
|
||||
default callback-пару `0x21860/0x21890`, а также category map только для current
|
||||
descriptor tags `0..=34`. Остальные ещё не описанные специализированные
|
||||
callbacks остаются явными ошибками.
|
||||
Лицензированный `min_l_n1.dat` содержит исходные factory/current tags
|
||||
`[19, 19, 9, 15, 12, 12, 13, 13, 26, 25, 21]`. Публичный API оставляет всю
|
||||
таблицу без изменений при не конечном интервале. Для конечного интервала
|
||||
предварительная проверка распознаёт категории, но находит неподдержанный
|
||||
factory tag `26` и отклоняет вызов до вычисления ставок и обновлений; полный
|
||||
бюджетный проход для этой реальной таблицы поэтому не проверен. Успешные бюджетные native-векторы используют синтетические
|
||||
ignored Rust-тест проходит budget по всем 11 строкам без фильтра. При `dt = 0.5`
|
||||
обе output rates равны `0x3c23d70a`, первые два множителя tag `19` равны
|
||||
`0x3f7fd70a`, остальные множители остаются `1.0`, а добавка tag `26` остаётся
|
||||
нулевой. Эта проверка подтверждает только CPU-проекцию реальной таблицы; она
|
||||
не запускает native полный mission tick и не подключает Control clock.
|
||||
Успешные бюджетные native-векторы используют синтетические
|
||||
NDP/Node38-строки и подтверждают локальные переходы и порядок вызовов, а не
|
||||
полный Control tick на миссии. Прямые oracle-вызовы `0x11220` для одиночной
|
||||
строки используют `updateEffects = false`, что исключает ветвь Control FX и
|
||||
|
||||
@@ -792,23 +792,19 @@ provider getter и изменение количества не подменен
|
||||
|
||||
Rust предоставляет явный CPU-вызов
|
||||
`advance_loaded_mission_control_budget(engine, handle, dt)`. Он переносит
|
||||
исходные callbacks factory tags `9`, `15`, `19` и общий default callback, а
|
||||
категории выбирает по текущему descriptor tag. Native map подтверждён только
|
||||
для префикса тегов `0..=34`; неизвестная категория, специализированный
|
||||
callback, provider или численный диапазон возвращает ошибку без публикации
|
||||
частичных изменений. Ставки `+0x5dc/+0x5e0` сохраняются отдельно, а сам вызов
|
||||
ещё не включён в Control clock.
|
||||
исходные callbacks factory tags `9`, `15`, `19`, `26` и общий default callback,
|
||||
а категории выбирает по текущему descriptor tag. Native map подтверждён только
|
||||
для префикса тегов `0..=34`; неизвестная категория, неподдержанный
|
||||
специализированный callback, provider или численный диапазон возвращает ошибку
|
||||
без публикации частичных изменений. Ставки `+0x5dc/+0x5e0` сохраняются отдельно,
|
||||
а сам вызов ещё не включён в Control clock.
|
||||
|
||||
Нативный oracle проверяет пустую таблицу с отрицательным нулём в обеих выходных
|
||||
ставках, невырожденную пару исходных устройств tag 19/tag 15 при `dt = 0.375`
|
||||
и tag 9 с шестью значениями и шестью накопителями изменений. Rust-тесты
|
||||
повторяют их по битам, включая положительное и отрицательное обновления tag 9.
|
||||
В лицензированном `min_l_n1.dat` предварительная проверка распознаёт категории,
|
||||
но находит неподдержанный factory tag `26` и отклоняет бюджет до расчёта ставок
|
||||
или вызова устройств; транзакционный тест подтверждает, что исходная таблица
|
||||
не меняется. Полный бюджетный проход на реальной миссии пока не выполнен. Rust также отклоняет нулевой знаменатель
|
||||
обновления tag 19; тест вызывает эту ошибку после изменения provider
|
||||
потребителем и подтверждает откат всей таблицы.
|
||||
Rust также отклоняет нулевой знаменатель обновления tag 19; тест вызывает эту
|
||||
ошибку после изменения provider потребителем и подтверждает откат всей таблицы.
|
||||
|
||||
#### Генератор tag 19 в том же бюджетном проходе
|
||||
|
||||
@@ -911,10 +907,51 @@ Descriptor category lookup `0x2c3a0` возвращает следующие з
|
||||
|
||||
Именно текущий descriptor выбирает категорию; callback остаётся у исходного
|
||||
factory-класса. В Rust неизвестный текущий тег за концом префикса и
|
||||
специализированный factory callback не подменяются общей формулой. На
|
||||
лицензированном Unit DAT полный проход доходит до factory `26` и возвращает
|
||||
ошибку без частичного изменения таблицы. Ни этот CPU-вызов, ни локальные
|
||||
векторы не означают включения бюджетного шага в Control clock.
|
||||
неподдержанный специализированный factory callback не подменяются общей
|
||||
формулой. Tag `26` поддержан отдельной парой callbacks, описанной ниже. Ни этот
|
||||
CPU-вызов, ни локальные векторы не означают включения бюджетного шага в Control
|
||||
clock.
|
||||
|
||||
#### Фабричный tag 26: изменяемая добавка
|
||||
|
||||
В этой сборке `Control.dll` SHA-256
|
||||
`bcb86318089028548a178b03a21accdce15df0cc85ddd91674cf3c2f55012c6e` фабричный
|
||||
tag `26` обрабатывается в функции-фабрике RVA `0x2d4b0`: её ветка вызывает общий
|
||||
конструктор `0x20800`, обнуляет поле устройства `+0xa4` и устанавливает vtable
|
||||
`0x3ce38`. Rate
|
||||
callback RVA `0x2e540` сначала проходит проверку доступности provider, затем
|
||||
считает `-((descriptor[+0x20] + device[+0xa4]) * dt)`; прибавление до умножения
|
||||
важно для битового результата. Update slot `+0x18` ведёт на RVA `0x21890` и
|
||||
сохраняет выделенную долю как обычный multiplier `+0x4c`, не трогая `+0xa4`.
|
||||
|
||||
Vtable slot `+0x1c` ведёт на общий reader `0x21d50`. Native override RVA
|
||||
`0x2d890` через этот reader заменяет descriptor и коэффициенты, сохраняя
|
||||
изменяемую добавку. Oracle проверяет сам slot и повторный rate после `INTO`.
|
||||
Rust теперь включает factory tag `26` в projection guard для `INTO` по этой
|
||||
проверке; границы для фабричных тегов `1`, `17` и `30` остаются закрытыми.
|
||||
|
||||
Отдельный Control setter RVA `0x2c2b0` поддерживает selector `0x500`: только
|
||||
при текущем descriptor tag `26` он записывает переданные биты в `+0xa4` и
|
||||
возвращает успех. Behavior.dll с SHA-256
|
||||
`ddfbdbde07832358fe6e35e01c8dba9b58e7313789498b6049ed51d4ed9baf99` вызывает
|
||||
его через RVA `0x19880`. Callers `0x29910` и `0x2f400` передают ноль, а
|
||||
`0x29ba0` передаёт поле `+0x64` рядом с кодом `NewfOreCost`; смысл последнего
|
||||
значения не установлен, поэтому Rust пока не запускает этот Behavior путь.
|
||||
|
||||
При `B = 0.2`, добавке `0.3` и `dt = 0.7` исходная rate имеет биты
|
||||
`0xbeb33333`. Смешанная проверка использует оригинальный tag-19 генератор
|
||||
(`B = 0.625`, `C0 = 1`, provider `0.4`) и tag-26 потребитель (`B = 0.2`,
|
||||
добавка `0.3`) при `dt = 0.5`: первый даёт `0.125`, второй запрашивает `0.25`.
|
||||
Native dispatcher выделяет tag `26` половину, сохраняет множители
|
||||
`0x3f300000`/`0x3f000000`, а ставки `+0x5dc/+0x5e0` получают
|
||||
`0x80000000`/`0x3e800000`. Постоянный x86 oracle вызывает исходные callbacks и
|
||||
Rust-тест повторяет этот вектор.
|
||||
|
||||
Ignored Rust-тест также проходит полный неотфильтрованный Control budget по
|
||||
одиннадцати исходным устройствам `min_l_n1.dat` при `dt = 0.5`; выходы равны
|
||||
`0x3c23d70a`/`0x3c23d70a`, первые два множителя tag `19` — `0x3f7fd70a`.
|
||||
Это проверка CPU-проекции реальной таблицы, а не сравнение целой миссии с
|
||||
оригиналом.
|
||||
|
||||
#### Активация и начальные часы
|
||||
|
||||
|
||||
Reference in new issue
Block a user