Я согласен с @Blaze и в качестве ответа буду использовать сопрограммы. Тогда возникает вопрос, когда и как обернуть сценарии Lua в сопрограммы.
Простая упаковка каждого скрипта в собственную сопрограмму может * потерять вам некоторую производительность, но если большинство ваших скриптов длиннее, чем несколько строк, это не должно быть очень заметно. Помимо проблем со скоростью вы должны иметь в виду, что в 5.1 coroutine.running()
тогда не вернется nil
даже на верхнем уровне скрипта, потому что это также просто сопрограмма. В 5.3 это меньше проблем, так как всегда возвращает поток плюс логическое значение.
* Вам нужно будет провести сравнительный анализ, если это вообще имеет отношение
Следующий большой вопрос будет заключаться в том, делать ли обтекание в Lua или в C (++). Lua, очевидно, более гибок и его легче изменить, но C может принести вам некоторую производительность, которая редко бывает такой же актуальной, как при разработке игр. Очевидным недостатком является то, что использовать C API просто неудобнее.
Самая важная проблема заключается в том, что вы не можете (или не должны) просто реализовать, например, next()
как обертку вокруг coroutine.yield('next')
или что-то в этом роде, потому что у вас могут быть вложенные сопрограммы; поэтому вам понадобится больше логики для передачи вызовов API на верхний уровень, а затем в C ++.
Надеюсь, это даст вам хороший обзор наиболее важных соображений при принятии решения о том, стоит ли использовать сопрограммы для этой проблемы.