Известные ограничения

Документация версии v0.1.0-beta.3Исходник на GitHub

Перевод исходной страницы на английском языке для OmsiLaunch 0.1.0-beta3. Нормативной является английская страница: при расхождениях приоритет имеют английская страница и код.

На этой странице по коду перечислено всё, что в OmsiLaunch 0.1.0-beta3 имеет статус UNAVAILABLE, PARTIAL или является принятым риском, чтобы пользователи и интеграторы не опирались на поведение, которого продукт не обеспечивает. В каждой строке указаны ограничение, его стабильность, причина его существования и место, где оно описано подробно. Нормативной является английская документация; локализованные копии в docs/localized/ не поддерживаются на том же уровне и могут отставать (см. последний раздел).

Совместимость#

ОграничениеСтабильностьПодробности
Поддерживается только Omsi23004_692EBFBF (692EBFBF...6243); хеш Steam LAA 7DAB063D...D759 внесён в список разрешённых; его отпечаток и план проверены на контролируемой копии, но для игрового процесса требуется подлинная установка Steam (образ — исполняемый файл Steam с защитой DRM)PARTIAL для Steam LAAсовместимость
Только Windows 10+ x64; нет поддержки Windows 7/8, XP и ARM64UNAVAILABLEсовместимость
Плагину нужна среда выполнения .NET 6 x86 в дополнение к среде выполнения x64, которую использует контроллерсовместимость

Запуск мира и параметры запуска#

ОграничениеСтабильностьПодробности
LAST_MAP_STATE (/last, WorldMode.LastMapState) не реализован; резервная подстановка .osn по метке времени никогда не выполняетсяUNAVAILABLE (BI-006)Диагностическое сообщение плана OL_E_CAPABILITY_UNAVAILABLE
Явные или системные дата, время и год (/date, /time, /year, new.date/new.time/new.year профиля, DateSpec/TimeSpec/YearSpec) передаются в спецификации, но делают план неисполнимым; плагин отклоняет режимы, отличные от UnsetUNAVAILABLE (STATICALLY_PARTIAL)профили сеанса, launchspec
Пресет погоды, ICAO и текущая реальная погода при запуске (/weather*, new.weather)UNAVAILABLE (STATICALLY_PARTIAL, BI-003)как выше
Модель транспортного средства игрока, окраска (repaint), HOF, бортовой номер, регистрационный номер при запуске (семейство /vehicle, PlayerVehicleSpec) разрешаются по каталогу контента, но не применяются; запрос этих значений делает план неисполнимым; детерминированное headless-назначение PlayerVehicle — будущее расширениеUNAVAILABLE (BI-007)player.assign-headless в разделе возможности
Точка входа по идентичности (/entrypoint:<identity>) не сопоставляется со списком, который показывает OMSI; используйте /entrypoint-indexPARTIAL (BI-001)возможность плана world.entrypoint-identity = RUNTIME_PARTIAL
Overlay документов клавиатуры и контроллеров (InputSpec, Environment.Keyboard, Environment.Controllers) разбираются, но никогда не применяются сеансомUNAVAILABLE (BI-005)Возможности input.*
LaunchBehaviorSpec.RestoreConfiguration и InstallationSpec.ExpectedExecutableSha256 объявлены, но никогда не читаютсяUNAVAILABLElaunchspec
ShutdownTimeoutSeconds (/shutdown-timeout, shutdown-timeout профиля) принимается и передаётся, но не используется супервизоромACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECTжизненный цикл сеанса
/quiet и /serveACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECTCLI
Флаги диагностики (/log, /logall, /omsi-logall, /verbose, /trace, /trace-process, /trace-plugin, /trace-native) заполняют DiagnosticsSpec; видимый эффект ограничен трассировкой хоста в .omsilaunch\diagnosticsPARTIALCLI
/runtime-batch, /runtime-write-batch, /d3d-batch — тестовые обвязки для проверкиINTERNALCLI

Завершение сеанса и управление процессом#

ОграничениеСтабильностьПодробности
Остановка сеанса — это принудительное завершение: session.stop, пункт «End session» в трее (завершить сеанс), Ctrl+C и CloseAsync приводят к TerminateProcess. Процедура завершения OMSI не выполняется, OMSI не перезаписывает options.cfg и свои логи при выходе, а любое несохранённое состояние OMSI теряется. Это сделано намеренно: так OMSI не может перезаписать восстановленные файлы.так задуманожизненный цикл сеанса
Кооперативное завершение через WM_CLOSE с тайм-аутом и откатом к принудительному завершению не реализованоUNAVAILABLE (решение по продукту, S-11; в раунде закрытия проверки в runtime OMSI проигнорировал WM_CLOSE, отправленный его главному окну)статус проверки в runtime
При закрытии консоли или выходе из системы у владельца есть бюджет 4 s на остановку и восстановление; всё оставшееся восстанавливается по журналу при следующем запускезакрытие консоли проверено в runtime; выход из системы не проверялсятранзакции и восстановление после сбоя

Транзакция, восстановление после сбоя и lease#

ОграничениеСтабильностьПодробности
Аренда установки (lease) — это семафор Local\: один владелец на установку в пределах сеанса входа в систему; между пользователями не соблюдается; не освобождается, пока другой процесс удерживает дескриптор; любой процесс того же пользователя может удерживать имяпринятый риск (S-18)транзакции и восстановление после сбоя
Восстановление после сбоя отклоняется (OL_E_INSTALLATION_BUSY), пока работает процесс OMSI, записанный в журнал, а для журнала без PID — любой Omsi.exe из этого корневого каталогатак задуманокак выше
Изначально отсутствовавший путь overlay, содержимое которого изменилось во время сеанса, блокирует восстановление (OL_E_RECOVERY_ABSENT_OWNERSHIP_MISMATCH) до ручной проверкитак задуманокак выше
Журналы, созданные до появления отпечатков владения, может закрыть только сеанс с идентичными запланированными байтами (OL_E_RECOVERY_ABSENT_OWNERSHIP_UNVERIFIED)PARTIALкак выше
Восстанавливаются только пути, которыми владеет сеанс. Собственные записи OMSI во время сеанса (options.cfg [last_map], когда ни один параметр не накладывает overlay на options.cfg, Texture\standard.ipr, кэши, laststn.osn, профиль водителя, логи) сохраняются, как после прямого запуска OMSIтак задуманотранзакции и восстановление после сбоя
Удаление устаревшего closecheck перед сеансом является окончательным (фиксируется, но не восстанавливается), когда SuppressStaleClosecheckWarning равно trueтак задуманокак выше

Runtime-управление#

ОграничениеСтабильностьПодробности
weather.set отклоняется (OL_E_RUNTIME_SETTING_NOT_PERSISTENT): OMSI перезаписывает оба профилированных кандидата ветра на следующем такте погодыUNAVAILABLEвозможности
Запись календаря (SetActualDateTime)UNAVAILABLE (BI-002)calendar.set-actual-date-time
Запись строковых переменных, именованные триггеры, звуковые триггеры (владение управляемыми строками Delphi)UNAVAILABLE (BI-004)scripts.string.read только для чтения
Нет перемещения ТС, нет пространственной перепривязки между тайлами, нет безопасного для ODE права на изменение трансформации; поля позиции доступны только для чтенияUNAVAILABLE (BI-008)road-vehicle.read
camera.lock / camera.unlock требуют PlayerVehicle; у headless-запуска NEW_MAP его нет (его предоставляет сохранённая ситуация)так задумано (BI-007)RV-004
Runtime-изменения (time.set, camera.set, camera.lock, vehicle.variable.set, spawn, place-random, текстуры D3D) не записываются в журнал и не восстанавливаютсятак задуманоruntime-управление
Слепое пятно отпечатка handle: объект того же класса и определения, пересозданный по тому же адресу между двумя чтениями списка, не распознаётся как устаревший; для времени жизни при естественном удалении (RV-002) нет безопасного способа воспроизвести его в runtime, оно покрыто офлайн-тестамиPARTIALruntime-управление
Результаты ограничены почтовым ящиком (mailbox) на 64 KiB: длинные списки усекаются (truncated=true); данные пикселей ограничены 48 KiB на один d3d.texture.updateтак задумановозможности
Канал с одним запросом в полёте: один запрос за раз на сеанс; занятый слот даёт OL_E_RUNTIME_CHANNEL_BUSY; идентификаторы запросов нельзя использовать повторнотак задуманоruntime-управление
Телеметрия — это слот последнего значения: всплески чаще, чем выборка хоста раз в 100 ms, могут терять промежуточные события (порядковые номера позволяют различать одинаковые последовательные события; разорванные выборки пропускаются)PARTIALпостоянный плагин
Сброс устройства D3D наблюдался в runtime (resetting, restored, инвалидация поколения); отдельный переход lost воспроизвести не удалось, потому что устройство OMSI сразу перешло в DEVICENOTRESETPARTIAL (RV-007)статус проверки в runtime
Результаты ограниченных списков (операции timetable.*.list, vehicle.variables.list, vehicle.string-variables.list) возвращают не больше строк, чем помещается в runtime-слот на 64 KiB; остальные строки не входят в ответ, при этом truncated=true, а returned_count меньше (аудит документации BUG-05). В этом выпуске постраничной выборки неттак задумановозможности
timetable.logs.read, road-vehicles.list, humans.list, vehicle.constants.list и vehicle.curves.list не являются ограниченными: результат больше слота завершается ошибкой OL_E_RUNTIME_RESPONSE_TOO_LARGE (ни для одной из них на протестированных картах не наблюдалось)PARTIALвозможности
Самостоятельно сообщаемые строки подтверждения (PublicCapabilityRegistry RuntimeValidation, GetCapabilitiesAsync EvidenceState) не были обновлены после раунда закрытия проверки в runtime: для camera.lock по-прежнему указано STATICALLY_VALIDATED, а для runtime.d3d.lifecycle.reset — IMPLEMENTED_NOT_RUNTIME_VALIDATED. Авторитетной является страница статус проверки в runtimeотставание документации, а не различие в поведениивозможности
Некоторые расширенные поля графа карты/тайлов/путей/объектов не предоставляются; runtime-читатели — это типизированные снимки, заблокированные проверкой профиля, и никогда не произвольный доступ к памятитак задумановозможности
Чтение памяти внутри процесса выполняется по схеме «проверка, затем использование» на живом OMSI; одновременное изменение в OMSI между проверкой и чтением может дать несогласованный снимок (OL_E_RUNTIME_OPERATION_FAILED)принятый риск (S-33)

Локальная плоскость управления и модель доверия#

ОграничениеСтабильностьПодробности
Модель доверия в пределах одного пользователя: именованный канал (named pipe) (CurrentUserOnly), отображения памяти handoff/телеметрии/runtime и семафор lease доступны любому процессу того же пользователя Windows. Такой процесс, прочитав session_id, может читать состояние, останавливать сеанс или выполнять runtime-операции.принятый риск (S-06, S-30)локальное управление
Конечная точка управления существует только пока владелец находится в состоянии Running; во время запуска и после завершения сеанса клиент получает OL_E_NO_ACTIVE_SESSION (выход 4)так задуманолокальное управление
Если имя pipe уже занято другим процессом, владелец продолжает работу без конечной точки (ListenFault), а второй запуск может ошибочно сообщить OL_E_SESSION_ALREADY_ACTIVEпринятый рисклокальное управление
.omsilaunch\ наследует ACL корневого каталога OMSI; явное управление доступом не применяетсяпринятый риск (S-31)транзакции и восстановление после сбоя

Диагностика и вывод#

ОграничениеСтабильностьПодробности
Диагностика — только локальные файлы (.omsilaunch\diagnostics); ничего не выгружается, удалённой отправки отчётов неттак задуманотранзакции и восстановление после сбоя
Хранятся данные 50 последних сеансов; более старая диагностика с префиксом сеанса удаляется при запуске нового сеансатак задуманокак выше
JSON-вывод и диагностика содержат пути установки (RootPath, каталоги ресурсов, пути .itx)так задумано (локальные данные)
Диалог сбоя сеанса в OmsiLaunchW.exe показывает в качестве сообщения полезную нагрузку сбоя от плагина (например, {"name":"world.failed",...}), а не предложение; строка Code: корректнакосметический недочёттрей Windows
D3D-запрос, отклонённый нативным мостом до любого вызова Direct3D, корректно сообщает native_status, но его текст detail содержит HRESULT 0x00000000косметический недочётвозможности
Окно состояния в трее — это снимок запланированного сеанса, сделанный при его открытии; оно не обновляется и не показывает живые значения OMSIтак задуманотрей Windows

Документация#

Нормативной документацией этого выпуска являются английские страницы в docs/. docs/localized/<locale>/ содержит переводы тех же страниц 0.1.0-beta3 (см. LOCALIZATION-MANIFEST.md); если перевод расходится с английским текстом, авторитетными являются английский текст и код. Перечисленные там исторические и устаревшие (legacy) страницы доступны только на английском.

См. также: возможности, статус проверки в runtime, ошибки.