Хотя я знаю, что функциональные языки не являются наиболее часто используемыми для написания игр, с ними связано много преимуществ, которые, кажется, будут интересны в любом контексте программирования. Особенно легкость распараллеливания, я думаю, могла бы быть очень полезной, поскольку акцент делается на все больше и больше процессоров.
Кроме того, с F # в качестве нового члена семейства .NET, его можно использовать напрямую, например, с XNA, что несколько снижает порог, в отличие от использования с LISP, Haskell, Erlang и т. Д.
Если у кого-то есть опыт написания игр с функциональным кодом, что оказалось положительным и отрицательным? Для чего он подходит, а для чего нет?
Изменить: Трудно решить, что есть один хороший ответ для этого, так что, вероятно, лучше подходит как вики-пост сообщества.
источник
Ответы:
В настоящее время я работаю над игрой в Haskell. Я не могу говорить о функциональном программировании в целом, но конкретно о Haskell:
Добро
Это удивительные вещи, которые делают Haskell действительно выдающимся.
Плохо
Это вещи, которые не очень хорошо , но могут быть разработаны вокруг , не слишком много усилий.
Гадкий
Это вещи, которые потребуют значительных усилий для преодоления.
источник
В прошлом году я потратил на разработку коммерческого игрового движка в Haskell, и для нас этот опыт был чрезвычайно положительным. Наш игровой мир сложен, и Haskell упростил моделирование процесса преобразования из формата редактора в формат игрового движка. Я бы не хотел думать, как будет выглядеть этот код на императивном языке.
В некоторых случаях возникали космические утечки, и хотя они вызывали небольшие проблемы, в общей схеме они были незначительными (например, по сравнению с обнаружением взаимоблокировок в Java-проектах аналогичного размера), и после их устранения они остались на месте.
Мы используем FRP, похожий на Yampa, и с ним, безусловно, связана кривая обучения, но как только это закончится, опыт очень положительный. Библиотеки не были для нас проблемой - все, что нам было нужно, было доступно. Задержки сбора мусора были особой проблемой, так как это для встроенной платформы. Мы использовали немного C ++ для управления анимацией. Производительность также была проблемой при использовании встроенной платформы (= медленный процессор). Мы сделали немного C, и мы также смотрим на новые технологии Haskell, такие как ускорение. Аниматор C ++ был на раннем этапе дизайнерским решением, и места, где код слишком медленный, - это очень маленькие области. В конце концов, мы хотим перевести все наши C на Haskell.
Haskell сделал сложную работу легкой, и все трудности, которые я только что упомянул, были крошечными по сравнению с большим количеством сложного кода, который мы создали, который является чистым, обслуживаемым и в значительной степени неразрушимым. Параллелизм станет проблемой в разработке игр очень скоро, и мы очень хорошо справимся с этим. Часть из того, что я сказал, может не относиться к небольшим проектам, потому что мы находимся в этом надолго, поэтому затраты на запуск, такие как обучение, поддержка библиотек и т. Д., Являются гораздо меньшей проблемой.
источник
Дейв упоминает несколько отличных моментов, хотя я должен отметить, что Хаскелл решил обе свои проблемы. Безгражданство может быть обойдено с помощью монады состояния (EDIT: не совсем - см. Ниже) , а последовательность может быть обработана с помощью монады ввода-вывода (EDIT: или любой другой монады, в этом отношении ...) .
Проблемы, с которыми вы столкнетесь (и которые я пытался изучить как в программировании игр, так и в Haskell), в большей степени сходны с этими. (Все они специфичны для Haskell, поскольку я действительно еще не углублялся в какие-либо другие языки FP).
С другой стороны, все быстро улучшается. И все действительно зависит от того, что вы хотите от опыта. Вы хотите создать игру и разместить ее на своем сайте в поисках славы и богатства? Придерживайтесь C ++ или Python. Но если вы хотите узнать что-то новое, что потребует от вас инноваций в ваших процессах, попробуйте функциональный язык. Просто будьте терпеливы с собой, пока вы учитесь.
У Антти Салонена есть интересный блог, в котором подробно рассказывается о его работе « снова-снова-снова-снова» с программированием игр на Haskell. Это стоит прочитать.
Редактировать (один год спустя): Теперь, когда я больше изучил монаду государства, я понимаю, что это не очень хорошее решение для государства, которое предназначено для сохранения вне определенной функции. Реальные решения безгражданства можно найти в Haskell в IOVar, ST, MVar (для безопасности потоков) или через что-то вроде Yampa, которое использует Arrows и FRP для управления внутренним состоянием, которое тем не менее скрыто от разработчика. (Этот список в порядке сложности, хотя первые три не особенно сложны, когда вы понимаете монады.)
источник
Объектив Caml!
Использование функциональных языков может быть огромным преимуществом в большинстве видов разработки программного обеспечения, в основном потому, что они значительно сокращают время разработки. Я вижу большой потенциал для написания серверного бэкенда в игре или на уровне AI и логики на клиенте на функциональном языке. И как все знают, LISP использовался для создания сценариев NPC.
Если бы я попытался написать интерфейс игры на функциональном языке, я бы определенно выбрал Objective Caml , который является гибридным языком. Он является потомком ML и позволяет смешивать итерационные и функциональные стили, имеет целевую систему с объектами с состоянием. (Caml - это язык, на котором смоделирован F #.)
Привязки OpenGL, кажется, работают безупречно, и люди давно делают игры в OCaml. Язык может быть скомпилирован и потенциально очень быстр (он давно одержал победу над C в некоторых тестах, не так, как сейчас).
Есть также тонны библиотек. Все, от компьютерных наук до привязок ко всем видам библиотек.
источник
На самом деле не является ответом ни на что, но я чувствую, что обсуждение игрового программирования на функциональных языках является неполным без упоминания о функциональном реактивном программировании (FRP) - http://www.haskell.org/frp/ - и его наиболее распространенной реализации ( Я думаю?), YAMPA - http://www.haskell.org/yampa/ .
источник
Что касается преимуществ, посмотрите Чистую библиотеку игр (http://cleangl.sourceforge.net/) и платформерную игру. Как только вы разберетесь с синтаксисом (я призываю вас попробовать), вы увидите явную элегантность конструкций и то, насколько близко исходный код соответствует понятиям, которые они выражают. В качестве дополнительного бонуса, абстракция состояния и необходимость явной передачи состояния делает ваш код намного более дружественным к многоядерным процессам.
С другой стороны, это требует серьезного изменения парадигмы. Многое из того, что вы привыкли делать, не думая об этом, внезапно больше не существует, и вы будете ломать голову над тем, как решить это, просто потому, что вы думаете по неправильным схемам.
источник
С моей точки зрения самые большие проблемы будут:
(begin...
" в схеме plt).Не стесняйтесь расширять этот список (и, возможно, добавить некоторые положительные моменты ^^).
источник
Вы можете написать свой код на C / C ++ и использовать встроенный язык, такой как Embedded Common Lisp, для своих сценариев. Хотя заставить их скомпилировать на другой платформе может быть сложно. Вы можете посмотреть Lisp In Small Pieces, чтобы узнать, как написать свой собственный язык сценариев. Это действительно не так сложно, если у вас есть время.
источник
Я написал простые игры на LISP, и это было весело, но я бы не советовал. Функциональное программирование - это все о конечном результате. Так что это очень удобно для обработки данных и принятия решений, но я обнаружил, что это затрудняет создание простого чистого кода, такого как базовый цикл управления.
Я не выучил F #, хотя с ним гораздо проще работать.
источник
положительным фактором будет производительность и переносимость, а отрицательным - управление сложностью , сегодня игры очень сложны и нуждаются в инструментах или языке программирования, которые могут лучше управлять сложностью, таких как объектно-ориентированная методология или универсальное программирование, которое трудно реализовать в функциональном программировании. язык.
источник