Remove planning and acceptance scaffolding while retaining the native Vulkan mission preview, format readers, runtime algorithms, and ordinary Rust tests. Keep the book aligned with the runnable project and validate checked-in shaders without generated tool metadata.
68 lines
6.1 KiB
Markdown
68 lines
6.1 KiB
Markdown
# VII. Работа над движком
|
|
|
|
FParkan развивается небольшими законченными изменениями. Для нового поведения
|
|
сначала нужен пример из оригинала и Rust-тест, затем реализация и объяснение
|
|
в соответствующей главе. Если меняется видимый результат, проверка заканчивается
|
|
запуском приложения на настоящих игровых ресурсах.
|
|
|
|
## Где находится код
|
|
|
|
Библиотеки в `crates/` читают архивы и форматы, связывают ресурсы миссии,
|
|
вычисляют геометрию и хранят мир. Они не создают окно и не обращаются к GPU.
|
|
Окно находится в адаптере winit, графические ресурсы — в адаптере Vulkan.
|
|
`fparkan-game` связывает их в приложение.
|
|
|
|
У файла на диске и объекта в игре разные сроки жизни. Одна модель может быть
|
|
прочитана однажды и использоваться многими объектами, у каждого из которых
|
|
свои положение и время анимации. Материалы и текстуры тоже разделяются между
|
|
экземплярами. Владение этими данными видно из Rust-структур; отдельный сервис
|
|
или интерфейс добавляется, когда появляется реальная потребность.
|
|
|
|
## Один тест на правило
|
|
|
|
Для бинарного формата полезен короткий массив байтов: тест проверяет значения
|
|
полей и отказ при обрыве записи или неправильной ссылке. Для преобразования
|
|
координат удобны точки и повороты, результат которых легко посчитать вручную.
|
|
Тесты находятся рядом с соответствующим алгоритмом и запускаются через
|
|
`cargo test --workspace`.
|
|
|
|
Оригинальные ресурсы остаются в установленной игре. Локальные тесты с ними
|
|
помечены `#[ignore]`, чтобы обычная проверка работала без коммерческих файлов.
|
|
Сообщение об ошибке должно назвать ресурс и причину: например, какой материал
|
|
сослался на отсутствующую текстуру. Отдельный отчёт для каждого запуска не нужен.
|
|
|
|
## Числа и порядок вычислений
|
|
|
|
Порядок умножения матриц имеет значение: поворот объекта вокруг своей оси и
|
|
поворот его положения вокруг начала мира дают разные результаты. Единицы высоты
|
|
ландшафта могут отличаться от единиц размещённых объектов. Эти преобразования
|
|
выполняются в одном месте и проверяются конкретными точками.
|
|
|
|
Оригинальный x86-код использует x87. Промежуточное значение может иметь большую
|
|
точность, чем сохранённый `float32`. Особенно внимательно проверяются переходы
|
|
между кадрами анимации, округление и границы треугольников. Эмулировать x87 во
|
|
всём движке не требуется: существенные расхождения разбираются в конкретной
|
|
формуле.
|
|
|
|
Случайные числа и порядок обхода тоже влияют на поведение. Перестановка вызовов
|
|
генератора меняет время молнии или траекторию частицы даже при прежнем seed.
|
|
Для повторяемой проверки сохраняют начальное состояние и одинаковую
|
|
последовательность шагов. Дополнительные потоки и альтернативные алгоритмы
|
|
имеют смысл после измерения узкого места.
|
|
|
|
## Проверка изображения
|
|
|
|
Успешное создание Vulkan pipeline доказывает только корректность обращения
|
|
к API. Положение моделей, масштаб карты, текстуры, прозрачность и свет
|
|
проверяются в самом окне. Validation layer помогает находить ошибки владения
|
|
GPU-ресурсами, синхронизации и пересоздания swapchain.
|
|
|
|
Кадр для сравнения читается после завершения работы GPU. При изменении размера
|
|
окна старые framebuffer и изображения освобождаются лишь после окончания их
|
|
использования. При сворачивании окно может иметь нулевой размер; тогда новые
|
|
кадры не отправляются. Обычное закрытие завершает программу успешно.
|
|
|
|
Оптимизация начинается с измерения: время загрузки, число повторных декодирований,
|
|
объём текстур и время кадра. Повторное использование уже загруженного ресурса
|
|
обычно полезнее дополнительного слоя управления кэшем.
|