Ответ 1
Вы можете использовать функциональные языки для программирования графики и игр так же, как на любом другом языке.
Это только простая игра, но я написал Ironclad: Steam Legions в Clojure как упражнение в функциональном программировании для разработки игр.
Вот некоторые уроки, которые я изучил/общие замечания по использованию Clojure для игрового программирования:
-
Вы должны быть осторожны с производительностью, поскольку игры могут быть очень требовательными, а функциональные языки накладывают некоторые накладные расходы. Clojure, безусловно, "достаточно хорош" для большинства игр, но вам нужно знать трюки, чтобы оптимизировать ваш код. Например, функциональные языки могут получить немного GC-heavy, производя много временных объектов. Вам необходимо изучить уловки, чтобы избежать этого (например, используя сокращение таким образом, чтобы избежать создания новых объектов последовательности или использования примитивной арифметики)
-
Mutability полезен в играх. Например, если вы делаете что-либо с физикой или плавной анимацией, у вас часто бывает много объектов с постоянно меняющимися местами. Вы можете имитировать это с помощью функциональных/неизменных структур данных, но если вы заботитесь о производительности, это не очень хорошая идея. Поэтому стоит выяснить, как получить изменяемые данные на вашем функциональном языке, даже если он не является идиоматическим (например, в Clojure, вы, вероятно, захотите использовать массивы Java)
-
Непрерывные постоянные структуры данных действительно оказываются очень полезными и в играх. В Ironclad все игровое состояние хранилось в единой неизменной структуре данных. Это позволило использовать некоторые интересные трюки, например, эффективно снимать состояние игры/мгновенные отмены/бегать назад во времени.
-
Clojure отличный для игровых скриптов. Динамическая природа в сочетании с компиляцией во время выполнения и возможностью определять произвольные DSL с помощью макросов - это массовая победа. На самом деле, даже если бы я писал игру на языке OOP, например Java, я бы серьезно подумал об использовании Clojure (или другого Lisp) для сценариев.
-
Clojure отличный для интерактивного развития. Я часто обнаруживал, что я запускаю игру в одном окне, взламывая текущий код в REPL. Это забавно изменить структуры данных игры и сразу увидеть эффекты! Это удивительное видео также дает вам представление о том, что возможно с развитием Clojure.
-
В Clojure по крайней мере вы часто захотите использовать библиотеки Java для графики, например. Swing для 2D или LWJGL для 3D. В некоторых случаях обертки для них уже существуют, однако я нашел достаточно простым использовать их непосредственно из Clojure. В конце концов, Java interop так же прост, как
(.methodName object arg1 arg2)
В заключение я считаю, что функциональные языки являются отличным выбором для разработки игр, за исключением очень интенсивных игр, где вы, вероятно, будете лучше работать с C/С++, чтобы иметь более прямой контроль над оборудованием.