# Изменения 2026-10-04 — 2026-10-06 (версия 0.3) Замеры — RX 7800 XT / RADV, Mesa 26, вывод 1080p без лимита FPS, если не сказано иначе. ## Модель памяти ПК — экспериментальная, по умолчанию выключена Включается переключателем лаунчера «Новая модель памяти (экспериментально)» или `BB_GUEST_IN_PLACE=1`; по умолчанию работает модель 0.2. Проверена только на RX 7800 XT и Steam Deck, может вылетать; на NVIDIA dma-buf не отображается со смещением, и порт возвращается к старой модели. Прямая память игры выделяется через Vulkan (dma-buf, видимая GPU системная память), и GPU читает её на месте, как буферы игры для ПК. Копий всей памяти в VRAM и отслеживания записей через защиту страниц больше нет. Метки готовности (EOP/EOS) пишутся, когда GPU действительно выполнил работу. - Кадры перекрываются: первые две отправки команд кадра (`BB_SUBMIT_AHEAD=2`) не ждут конца предыдущего кадра. При K ≥ 8 куча игры течёт (~2 объекта за кадр), поэтому есть сторож: рост живых выделений на 100 000 выключает перекрытие до конца сессии. - Отправка команд асинхронная (`BB_ASYNC_SUBMIT`): command buffer'ы сегментов закрывают их потоки записи, сама отправка — упорядоченная задача на них же. - Сигналы GPU копятся на стадии записи draw и публикуются пачкой; ожидания ConstRam — точечные. - Замеры, Yahar'gul, стоя: старая модель 138,7 → 143,6 FPS, новая 101 → 152–155 FPS. Тяжёлое место (~2000 draw за кадр): 95,5 → 115–124 FPS; там теперь упор в стадию записи draw. Ключи настроек `pc_memory` и `old_memory_model` больше не читаются: новый ключ `new_memory_model` по умолчанию выключен у всех. ## Видеопамять больше не растёт от локации к локации До исправлений VRAM за 13 минут игры вырос с 3,8 до 7,3 ГБ, теперь держится на 4–5,5 ГБ. - **Сборщик текстур не освобождал ничего.** Десять самых старых текстур, в которые рисовал GPU, расходовали весь лимит прохода. Теперь такие текстуры пропускаются и уходят в конец очереди; без нехватки памяти выгружаются текстуры, не использованные `BB_GC_IDLE_SECONDS` (20) секунд. Возраст считается в секундах: прежние 16 отправок команд (~3 кадра) выкидывали всё, что ненадолго ушло с экрана. - **Блоки памяти игры в VRAM никогда не освобождались.** Теперь блоки, не использованные `BB_VRAM_IDLE_SECONDS` (60) секунд, возвращаются в память игры и снова переносятся в VRAM при обращении (без этого просадка 90 → 55 FPS: GPU читал их по PCIe). Блоки памяти, которую игра снимает с отображения, освобождаются. Свободные слоты используются и многоблочными запросами; новые блоки занимают самые заполненные куски по 64 МБ, почти пустые выселяются, пустые возвращаются драйверу. - VMA берёт память блоками по 64 МБ вместо 256 (`BB_VMA_BLOCK_MB`), текстуры от 4 МБ получают отдельное выделение (`BB_VMA_DEDICATED_MB`): удалённые текстуры не держат большие блоки. - Статистика кадров: строка `Memory:` — VRAM и GTT игры по данным ядра, RSS, блоки VMA, все изображения Vulkan, кэш текстур, блоки памяти игры в VRAM, работа сборщика. `tools/load_watch.sh` пишет VRAM/GTT/RSS каждые 5 с. ## Зависания GPU: найдено место Метки GPU (`vk_breadcrumbs.*`, `VK_AMD_buffer_marker`; `BB_BREADCRUMBS=0` — выключить): до и после каждой отрисовки, dispatch и прохода порта GPU пишет номер команды. При потере устройства журнал называет команду, на которой GPU встал, её шейдеры и параметры. Найдено (сессия ~20 минут): зависание в непрямом dispatch шейдера частиц `cs 2da7fe60` сразу после `cs 4ca76892` (1×1×1, генератор случайных чисел эмиттеров, счётчик в GDS). Число итераций циклов `2da7fe60` берётся из памяти. Аргументы непрямых dispatch теперь копируются GPU в буфер, видимый процессору: отчёт показывает, что GPU прочитал, а статистика — самые большие непрямые dispatch. **Причина ещё не устранена**: нужен следующий случай с этими данными. Зависание больше не выглядит как тихая заморозка картинки при играющем звуке (Steam Deck, бой с Германом): ожидания GPU замечают потерю устройства, а сторож через 10 с без прогресса GPU пишет в журнал отчёт меток и останавливает игру с понятной ошибкой. ## Падения и запуск - Гостевой сбой `0x263b8e7` (частый на Steam Deck): метки EOP писались через `memcpy`, который записывает 4–7 байт двумя перекрывающимися словами. Игра успевала освободить блок между ними. Теперь метки пишутся одной атомарной записью (`store_once`, `StoreLabel`). На Deck не проверено. - NVIDIA с новой моделью памяти падала при запуске: драйвер не отображает dma-buf со смещением. Перед включением модели порт проверяет это и при неудаче остаётся на старой модели. - Проверка файлов игры (`scripts/game_check.py`, issue #7, #13, #14): хеш загруженного образа eboot сравнивается с CUSA03173 1.09; без обновления, со старым eboot или другим изданием запуск останавливается с объяснением, лаунчер показывает то же. `BB_SKIP_GAME_CHECK=1` — обход. ## Лаунчер и ввод - Выпадающие списки с длинными вариантами («Фоновая загрузка в видеопамять», конвейер GPU, чтение данных GPU, контроллер) показывают короткие названия, а пояснение к выбранному — строкой под заголовком: текст больше не обрезается. - Выбор контроллера (issue #15): *Управление → Контроллер* (`BB_GAMEPAD`, GUID или часть имени); выбранный берётся, как только подключится. Список — `bb-gpu-capabilities --gamepads`. - Ввод имени персонажа в окне поверх игры (issue #19, патч из issue); ввод в игру на это время нейтрален (Backspace не нажимает тачпад). - Курсор скрыт в полноэкранном режиме и через 3 с без движения мыши в окне (issue #3). - **Переназначение клавиатуры и геймпада**: *Управление → Клавиатура / Геймпад*, кнопка «Назначить» ждёт нажатия. В `bbport.ini` — строки `key.<кнопка>=` и `pad.<кнопка>=` с именами SDL; нет строки — назначение по умолчанию. ## Патчи игры - **Sprint Fix (High FPS)**: выше ~147 FPS (а иногда и выше ~90) бег падал до половины скорости — детектор стены игры мерил расстояние за кадр. Патч включается всегда вместе с режимами 90 FPS и «без ограничения». - **Чёрный тонмаппинг на процессорах Intel** (темнее, чем на PS4; сильнее всего в DLC): код игры выполняется нативно, а приближённые float-инструкции Intel дают другие значения. Патч исправления включается сам на процессорах Intel; `BB_INTEL_TONEMAP_FIX=0/1` — принудительно. ## Сборка ассетов FSR 4.1.1 - Новейший GE-Proton выбирается по версии (`ls | tail -1` брал 9-x вместо 10-x; issue #4), также `~/.steam/root` и Flatpak; захват без кадров останавливает сборку с объяснением. - На RDNA4 DLL, вероятно, выбирает FP8-вариант шейдеров (issue #12): захват скрывает от vkd3d-proton `VK_KHR_cooperative_matrix`, `VK_NV_cooperative_matrix2`, `VK_EXT_shader_float8`. На RX 7800 XT захват совпадает побайтно; на RDNA4 не проверено. `extract.py` при нарушении правил ничего не пишет и объясняет причину. - Инструменты из системы без Nix; Nix без канала — `channel:nixos-unstable` (issue #22). ## Апскейлеры: мыло и полосы на лестницах - **Векторы камеры: перевёрнутая вертикаль.** `camera_motion.comp` и проверка глубины в `taa.comp` считали, что ось +y вида направлена вверх по экрану; у игры она вниз (по строкам). Ошибка затрагивала наклон камеры и вертикальное движение, поворот влево-вправо был верным. Поэтому видно было там, где камера покачивается вверх-вниз: на лестнице к собору от гробницы Идон и в канализации. FSR 4 и 4.1.1 давали полосатое мыло, FSR 3.1 — общее размытие, а персонаж с векторами объектов оставался чётким. Проверка: на статичных мешах, у которых есть и векторы объектов (позиции вершин с GPU), новые векторы камеры совпадают с ними в пределах 0,05 px на 17 кадрах бега по лестнице, прежние расходились на 1,3–3,7 px. В игре на FSR 4.1.1 1080p Performance «стало сильно лучше». - **Анизотропная фильтрация 16x** для текстур отрисовок сцены (`BB_ANISO`, по умолчанию 16; 0 — фильтры игры). Игра ставит большинству текстур 1x, а при апскейле поверхности под острым углом теряют детали. Переключатель для A/B на лету — бит 61 в `BB_TOGGLE_FILE`. - Дамп апскейлера (`BB_DUMP_TRIGGER`) работает и на HDR-пути, пишет матрицы камеры кадра; `tools/dump_view.py` переводит дамп в PNG. ## MangoHud: двойной оверлей Текст MangoHud двоился со сдвигом и разными значениями: рисовались два оверлея. Встроенный в AppImage слой называется `VK_LAYER_MANGOHUD_overlay_64_x86_64` (nixpkgs), системный — иначе, и загрузчик Vulkan грузил оба. На Steam Deck в игровом режиме то же дают оверлей производительности Steam (mangoapp) и MangoHud из лаунчера. Теперь `run.sh` при `MANGOHUD=1` не включает MangoHud в игре, если запущен mangoapp, и отключает встроенный слой, если в системе есть свой (`VK_LOADER_LAYERS_DISABLE`). На NixOS без системного MangoHud не воспроизводилось. ## Окклюжн куллинг (ветка rainmakerv3/shadPS4 `opts`) Коммит «correct queries» заменяет фальшивый счётчик ZPASS_DONE настоящими occlusion queries Vulkan. В Соборном округе Bloodborne делает ~0–8 таких запросов за 5 с и не использует предикацию (`SET_PREDICATION` — 0), то есть отрисовки по ним не отсекает: переносить нечего. Сетевой поток в офлайне (коммит про epoll в той же ветке) у нас ядро не занимает. ## Тесты `tests/test_game_check.py`; `build.sh --test` снова собирается (заглушка `runtime_memory_note_write` в `tests/test_file_mods.c`).