Обновление: Выбор среды исполнения
Как и обещал, попытался поэкспериментировать с разными средами исполнения для нового движка. Архив содержит:
- Исходный код реализации алгоритма поиска пути на C, Lua и Pawn
- Скомпилированный из кода Pawn, amx исполняемый файл (размер ячейки 32 бита)
- Скомпилированное из кода C, Windows приложение (Mingw-64-10.0.0 и GCC 12, CRT и приложение собраны для процессора i486)
- Скомпилированные среды выполнения amx, lua 5.4 и lua 5.5 (Mingw-64-10.0.0 и GCC 12, CRT и приложение собраны для процессора i486)
WASM
Существующие среды выполнения или слишком сложны и написаны на плохо-переносимых языках или требуют модификации для переносимости (слишком строго привязаны к версиям ОС). Из активно поддерживаемых и на первый взгляд подходящих моим требованиям я выделил две реализации:
- WASM3, однако мне не удалось запустить его на Windows XP и более ранних версиях из-за использования некоторых новых API функций
- WAMR, но его я вообще не смог скомпилировать для Windows из GNU/Linux, так что и потестировать не получилось
Компиляция с использованием существующих инструментов невозможна на большинстве платформ -- вам потребуется довольно свежая версия Windows или GNU/Linux для этого, что существенно сократит возможности по разработке игр.
Тратить время на решение этих проблем не вижу смысла из-за большого количества неизвестных и общей сложности платформы (что может быть проблемой при переносе).
Pawn
- Компиляция и запуск потребовали некоторых усилий (некоторые вещи привязаны к платформе по-умолчанию, однако могут изменяться настройками компиляции; Мы оптимизируем под 32-разрядные системы, поэтому и размер ячейки выбрали 32 бита), однако среда выполнения легковесна и сходу работает без проблем на Windows 95 (есть поддержка и 16-разрядных версий Windows!)
- Есть встроенная поддержка арифметики с фиксированной точкой. Это не критично, поскольку может быть легко реализовано и на Lua
- В целом язык весьма минималистичен:
- Обработка строк сделана в стиле C, что... проблемно для написания игр на языке. По сути в языке нет встроенных способов сложной работы со строками
- Массивы только фиксированного размера (во время компиляции) -- это критично для использования Pawn в нашем проекте. Однако это должно быть реализуемо на ассемблере AMX
- Нет ООП -- разработка полноразмерной игры будет очень болезненной.
Производительность
Я получил вот такие результаты на 86Box (5.3, сборка 8253 old dynarec; Windows 95 OEM, Pentium 133, ASUS P/I-P55TP4XE больше деталей (PNG)). Все числа в секундах:
C: 23.5
Pawn: 694.3
Lua 5.4: 405.1
Lua 5.5: 401.9
И такие на реальном железе (Windows 98 SE; Pentium MMX 233, Via MVP3, 256 MB RAM). Все числа в секундах:
C: 36.0
Pawn: 482.5
Lua 5.4: 270.8
Lua 5.5: 258.4
C здесь представлен только для сравнения "мы не сможем быть быстрее чем это" (разве что оптимизируя код). И Lua явно выигрывает, поэтому остается нашим выбором. Во время разработки движка мы будем продолжать проверять новые версии Lua и обновляться до них если это будет давать преимущества.
Я дополню оригинальную статью этой информацией.
Спасибо вам за прочтение, как всегда ждем ваших отзывов на почту. До новых встреч!