Самое лучшее в lua - это то, что он имеет легковесную виртуальную машину, и после того, как чанки предварительно скомпилированы, их запуск на виртуальной машине довольно быстрый, но все же не такой быстрый, как в коде C ++, и я не думаю, что было бы неплохо вызывать Луа на каждый отрендеренный кадр.
Я бы поместил игровое состояние в C ++, добавил бы функции в lua, которые могут достигать, и изменил бы состояние. Подход, основанный на событиях, почти лучше, когда регистрация событий должна выполняться в lua (предпочтительно только в начале игры или на определенных игровых событиях, но не чаще, чем несколько раз в минуту), но фактические события должны запускаться C ++ код. Пользовательские вводы также являются событиями, и они обычно не происходят каждый кадр (за исключением, возможно, MouseMove, но который следует использовать осторожно из-за этого). То, как вы обрабатываете события пользовательского ввода (обрабатываете ли вы все (например, какая клавиша была нажата и т. Д.) В lua, или, например, существуют ли отдельные события для каждой клавиши на клавиатуре (в крайнем случае), зависит от игры, которую вы '' пытаемся сделать (в пошаговой игре может быть только один обработчик событий для всех событий, в RTS должно быть больше событий, и с FPS следует обращаться осторожно (в основном потому, что перемещение мыши будет происходить в каждом кадре)). Обычно, чем больше отдельные виды событий, которые вы имеете, тем меньше вам нужно кодировать в lua (что повысит производительность), но тем сложнее становится, если «реальное событие», которое вам нужно обработать, фактически инициируется более отдельными «событиями уровня программирования» ( что может фактически снизить производительность, потому что код lua должен быть более сложным).
В качестве альтернативы, если производительность действительно важна, вы на самом деле можете улучшить виртуальную машину lua, добавив в нее новые коды операций (я видел, что некоторые компании делают это, но в основном, чтобы сделать декомпиляцию скомпилированных фрагментов lua более сложной), что это на самом деле не сложно сделать. Если у вас есть то, что код lua должен выполнять много раз (например, регистрация событий, запуск событий или изменение состояния игры), вы можете захотеть реализовать их в виртуальной машине lua, поэтому вместо нескольких getglobal
и setglobal
кодам операций они будут принимать только один или два (например, вы можете сделать код операции SETSTATE с параметром 0-255 и 0-65535, где первый параметр описывает, какое состояние нужно изменить, а второй описывает новое значение состояние. Конечно, это работает, только если у вас есть максимум 255 событий, максимум 2 ^ 16 значений, но в некоторых случаях этого может быть достаточно. И тот факт, что для этого требуется только один код операции, означает, что код будет выполняться Быстрее). Это также усложнит декомпиляцию, если вы намереваетесь скрыть свой код lua (хотя и не слишком сильно для того, кто знает внутреннюю работу lua). Выполнение нескольких опкодов на кадр (около 30-40 вершин) не сильно ухудшит вашу производительность. Но 30-40 опкодов в виртуальной машине lua не уйдут далеко, если вам нужно делать действительно сложные вещи (простой if-then-else может занять до 10-20 или более опкодов в зависимости от выражения).