Подтвердить что ты не робот

Какая лучшая альтернатива С++ для графического программирования в реальном времени?

С++ просто засасывает слишком много времени, заставляя меня управлять своим собственным памятью вручную, заставляя меня вводить слишком много (привет std::vector<Thingy>::const_iterator it = lotsOfThingys.begin()), и скучно меня долгое время компиляции. Какая единственная лучшая альтернатива серьезному графическому программированию в реальном времени? Сбор мусора является обязательным (а также способностью избегать его использования, когда это необходимо), а скорость должна быть конкурентоспособной с С++. Разумная история для доступа к C libs также обязательна.

(Полное раскрытие: у меня есть свой собственный ответ на это, но мне интересно узнать, что другие считают хорошими альтернативами С++ для работы в режиме реального времени.)

Изменить: Спасибо всем за продуманные ответы. Учитывая, что на самом деле нет "правильного" ответа на этот вопрос, я не буду выбирать какой-либо конкретный ответ. Кроме того, я бы просто выбрал язык, который мне нравится, как альтернатива С++, что было бы нечестно.

4b9b3361

Ответ 2

Я бы не отказался от С++. На самом деле, я бы подумал о добавлении Boost в вашу библиотеку С++, что делает язык гораздо более удобным. Ваш пример:

BOOST_FOREACH( Thingy& t, lostOfThingys ) {
    // do something with 't'
}

У Boost есть множество инструментов, которые помогут сделать С++ лучшим языком.

Ответ 3

С# - хороший язык, который соответствует вашим требованиям, и он определенно подходит для графики, благодаря усилиям Microsoft предоставить ему отличные инструменты и библиотеки, такие как Visual Studio и XNA.

Ответ 4

Я не согласен с вашей предпосылкой. При использовании тщательно и правильно, С++ - отличный язык, особенно для домена, такого как графика в реальном времени, где скорость имеет смысл.

Управление памятью становится легким, если вы хорошо проектируете свою систему и используете контейнеры stl и интеллектуальные указатели.

std::vector::const_iterator it = lotsOfThingys.begin()) станет намного короче, если вы используете

using namespace std;
typedef vector::const_iterator ThingyConstIter;

И вы можете значительно сократить время компиляции, разбив свои системы на разумно автономные модули, используя предварительно скомпилированные заголовки или используя идиом PIMPL.

Ответ 5

В реальном времени + сборка мусора не очень хорошо сочетается. Я боюсь.

Немного сложно сделать какие-либо гарантии в режиме реального времени, если сборщик мусора может в любой момент взорваться и потратить undefined количество обработки...

Ответ 6

Возможно, гибридный подход. Python и С++ создают хорошую комбинацию (см., Например, PyGame).

Ответ 7

Не забывайте упоминать новое использование "auto":

auto it = lotsOfThingys.begin(); // Let the compiler figure it out.
auto it2 = lotsOfFoos.begin();
if (it==it2) // It still strongly typed; a Thingy iter is not a Foo iter.

Ответ 8

Некоторая вариация Lisp, которая компилируется в машинный код, может быть почти такой же быстрой, как С++ для такого рода программирования. Команда Naughty Dog создала версию Lisp под названием Game Oriented Assembly Lisp, который они использовали для создания нескольких названий AAA, включая серии Jak и Daxter. Двумя основными препятствиями для подхода Lisp в игровой индустрии были бы укоренившийся характер разработки C/С++ (как инструменты, так и человеческие ресурсы вложены в C/С++), а также трудности поиска талантливых инженеров, которые звезд как в домене программирования игр, так и в языке Lisp.

Многие команды программирования в отрасли переходят на гибридный подход, в котором код реального времени, особенно графический и физический код, написан на C или С++, но логика игры выполняется на языке сценариев более высокого уровня, который доступными и редактируемыми программистами и не-программистами. Lua и Python являются популярными для сценариев более высокого уровня.

Ответ 9

Будучи разработчиком/исследователем/профессором приложений 3D VR в течение примерно 20 лет, я бы предположил, что альтернативы нет (кроме, возможно, C). Единственный способ уменьшить латентность и включить взаимодействие в режиме реального времени - это оптимизированный скомпилированный язык (например, C или С++) с доступом к быстро распространяемой 3D-графической библиотеке, такой как OpenGL. Хотя я согласен с тем, что мне сложно кодировать все, это также необходимо для выполнения и оптимизации.

Ответ 10

Иногда, глядя за избитый путь, вы можете найти настоящий драгоценный камень. Возможно, вы захотите рассмотреть PureBasic (не позволяйте названию вводить вас в заблуждение). Вот несколько деталей:

Функции PureBasic

  • исполняемые файлы машинного кода (сборки) (FASM)
    • Поддержка встроенной сборки
    • Не требуется время выполнения (не требуется DLL и т.д.) 1 исполняемый файл
    • Крошечные исполняемые файлы (как маленькие, так и меньшие/такие же быстрые или быстрые, чем С++, из среды выполнения)
    • Вы можете писать DLL
    • Поддержка нескольких потоков.
    • Поддержка Full OS API.
  • Поддержка нескольких платформ
    • Windows 95-2003
    • Linux
    • Mac OS X
    • Амига
  • Разработка 2D и 3D игр
    • DirectX
    • OGRE
  • Щедрое лицензирование
    • Недорогая (79 евро или около $112).
    • Лицензия на срок службы (включая все будущие обновления и версии)
    • Одна цена для всех платформ
  • Поддержка внешней библиотеки
    • Сторонние DLL
    • Пользовательские библиотеки
  • Поддержка on-line
    • Команда реагирования, возглавляемая им создателем
    • Он-лайн форум
      • Одно место для ответов (не нужно ходить по сети)
      • Огромное количество примерного кода (попробуйте код в IE с IEtool)
      • Быстрый ответ на вопросы
  • Бонусное обучение (альтернатива обучению С++)
    • API
    • Структуры
    • Интерфейсы
    • Указатели

Посетите онлайн-форум, чтобы получить лучшее представление о PureBasic (http://www.purebasic.fr/english/index.php) или на главном сайте: www.purebasic.com

Ответ 11

Я полностью согласен с упоминанием С# для графического программирования. У него есть небольшой недостаток, заключающийся в том, что он управляемый язык и позволяющий бесплатному управлению сборщиком мусора над вашей заявкой через некоторое время ускоряет самоубийство, но с некоторыми относительно интеллектуальными распределениями пулов, сделанными на раннем этапе жизни программы, можно избежать любых реальных проблем.

Несколько человек уже упомянули XNA, которая невероятно дружелюбна и хорошо документирована, и я также хотел бы повторить эту рекомендацию. Я лично использую его для своих проектов в хобби, и он очень хорошо относился ко мне.

XNA - не единственная альтернатива. Существует также SlimDX, который постоянно развивается как средство предоставления скудной оболочки DirectX аналогично Managed DirectX (который, я полагаю, был прекращен Microsoft в пользу XNA). Оба заслуживают исследования: http://code.google.com/p/slimdx/

Ответ 12

Нет никаких истинных альтернатив для больших названий AAA, особенно на консолях. Для меньших заголовков С# следует делать.

Ответ 13

С# - хороший ответ здесь - у него есть прекрасная сборка мусора (хотя вам придется прорабатывать ее совсем немного), чтобы изменить то, как вы обрабатываете вещи сейчас, когда вся обработка памяти не в ваших руках), это прост в использовании, имеет множество примеров и хорошо документирован. В 3D-отделе он полностью поддерживает шейдеры и эффекты, и поэтому - это будет мой выбор.

Тем не менее, С# не так эффективен, как С++, и медленнее из-за накладных расходов, поэтому, если это скорость и гибкость в использовании любого трюка в книге, которая вам нравится (с указателями и сборкой, если вы хотите, чтобы ваши руки были грязными) - придерживайтесь С++, и цена будет писать больше кода, как вы упомянули, но имея полный контроль над всем, включая управление памятью.

Ответ 14

Я бы сказал, что язык программирования D - хороший вариант. Вы можете ссылаться на объектные файлы C и интерфейс с кодом С++ через библиотеки C. D имеет сбор мусора, встроенную сборку, а разработчики игр создали привязки к SDL и OpenGL-библиотекам, а также активно работают над новой игрой разработки apis. Я люблю D. Слишком плохо, моя работа не требует его использования.: (

Ответ 15

Как и Джеймс (hopkin), для меня гибридный подход - лучшее решение. Python и С++ - хороший выбор, но работает другой стиль, например С#/С++. Все зависит от вашего графического контекста. Для игры XNA - хорошая платформа (ограниченная win32), в этом случае С#/С++ - лучшее решение. Для научной визуализации принимается Python/С++ (например, привязки vtk в python). Для мобильной игры JAVA/С++ может работать...

Ответ 16

Если вы ориентируетесь на Windows, С++/CLI (управляемый "Microsoft" диалект С++) является интересной возможностью, особенно если вы хотите использовать свой опыт на С++. Вы можете легко скомбинировать собственный код (например, вызовы в библиотеках C-стиля) с управляемым кодом .NET и воспользоваться преимуществами .NET GC и библиотек.

Что касается влияния GC на производительность реального времени, я думаю, что они, как правило, раздуты. Многопользовательский .NET GC очень хорош в том, что он не занимает много времени, чтобы делать коллекцию, если вы не находитесь в какой-то критической ситуации с низкой памятью. Я пишу код .NET, который взаимодействует с электронными деривативными биржами, где задержка времени == много $$$, и у нас никогда не было проблемы, связанной с GC. Несколько миллисекунд - долгое время для GC, но не для человека, взаимодействующего с программным обеспечением, даже в режиме реального времени. Если вам действительно нужна истинная производительность в реальном времени (для медицинских устройств, управления технологическими процессами и т.д.), Вы не можете использовать Windows в любом случае - это просто не оперативная ОС.

Ответ 17

Множество игровых движков, возможно, подойдет вашим потребностям. Например, используя SDL или Cairo, если требуется переносимость. Множество языков сценариев (в общем, с простым синтаксисом и сборкой мусора) имеют привязку к этим холстам.
Flash может быть другой альтернативой.

Я просто укажу Processing, который является языком программирования с открытым исходным кодом и средой для людей которые хотят запрограммировать изображения, анимацию и взаимодействия.

На самом деле, это тонкая оболочка вокруг Java, что делает ее похожим на язык сценариев: она имеет (примитивную) IDE, когда вы можете ввести несколько строк кода и нажать Run, даже не сохраняя файл. На самом деле он обертывает код вокруг класса и добавляет вызов main(), компилирует его и запускает в окне.

Многие люди используют его для выставок в режиме реального времени (VJ и т.п.). Он обладает мощью и ограничениями Java, но добавляет из коробки несколько хороших оберток (библиотек), чтобы упростить доступ к Java2D, OpenGL, SVG и т.д.

Каким-то образом он стал моделью простого графического языка: существует несколько приложений, пытающихся имитировать обработку на других языках, таких как Ruby, Scala или Python. Одной из самых впечатляющих является реализация JavaScript с использованием компонента canvas, реализованного в Firefox, Safari, Opera и т.д.

Ответ 18

Я проголосую С++ 0x. Частичная поддержка уже доступна в gcc-4.3 +, используя флаг -std = С++ 0x.

Ответ 19

Я очень успешно использовал С++ для движка, с приложением, написанным в Lua сверху. JavaScript также очень практичен, теперь на базе JS-основанных JS-движков находятся (tracemonkey, V8 и т.д.).

Я думаю, что С++ будет с нами еще некоторое время; даже Тим Суини фактически не переключился на Haskell (pdf), AFAIK: -)

Ответ 20

Java и LWJGL (обертка OpenGL) хорошо работали для меня. Если вы ищете больше библиотеки типа графа сцены, например Orge, посмотрите на jMonkeyEngine, который мы использовали для создания приложения типа google earth (см. Www.skapeworld.com). Если вы разумны при создании объекта, сборка мусора - не проблема.

Ответ 21

Будет ли "С" слишком очевидным ответ?

Ответ 22

Если ваша цель - ПК, я думаю, вы можете попробовать С# или вставить Lua в свое приложение на С++ и запускать скрипты для "высокоуровневых" материалов. Однако, если ваша цель - это консоль, вы должны управлять своей собственной памятью!

Ответ 23

Objective-C выглядит неплохо для ваших требований (последняя версия с дополнительным GC), хотя она слишком динамична и похожа на Smalltalk на мой вкус.

Ответ 24

XNA - ваш лучший выбор, я думаю. Будучи поддерживаемой платформой .NET, вы можете создавать платформу Windows или Xbox 360, просто изменив настройку в Game Studio. Лучше всего, все инструменты бесплатны!

Если вы решите пойти с XNA, вы можете легко начать использовать их руководство по быстрому старту Руководство по быстрому старту XNA

Это был полезный и интересный опыт для меня до сих пор, и хороший разрыв с управлением памятью на С++.

Ответ 25

Сбор мусора является обязательным (как есть способность избегать его использования, когда необходимо)

Вы не можете временно отключить сборщик мусора. Тогда вам понадобится детерминированный сборщик мусора. Но такой зверь действительно приходит с ударом производительности. Я думаю, что BEA JRockit - это такой зверь, а затем вы должны придерживаться Java.

Просто, чтобы прокомментировать ваш пример; typedef - ваш друг...

typedef std::vector<Thingy> Thingys;
Thingys::const_iterator it = lotsOfThingys.begin()

Ответ 26

Не забывайте о независимых языках в вашем квесте. Emergence BASIC от Ionic Wind Software имеет встроенный движок DirectX 9, поддерживает OOP и может легко взаимодействовать с библиотеками C.

http://www.ionicwind.com

Джеймс.

Ответ 27

Лучшая среда для вашего проекта - это то, что вы выполняете свою задачу максимально быстро. Это - особенно для 3D-графики - включает библиотеки.

В зависимости от задачи вы можете избежать некоторых незначительных хакеров DirectX. Затем вы можете использовать .NET и slimdx. Управляемые языки, как правило, быстрее работают с программой и легче отлаживаются.

Возможно, вам нужен действительно хороший 3D-движок? Попробуйте Ogre3D или Irrlicht. Вам необходимо коммерческое качество (можно утверждать, что Ogre3D предлагает это) - идите на Cryengine или Unreal. С Ogre3D и Irrlicht вы также можете использовать .NET, хотя порты не всегда обновлены, а плагины не так легко включены, как в версиях С++. Для Cryengine/Unrealengine у ​​вас не будет реального выбора, я думаю.

Вам нужно, чтобы он был более портативным? OpenGL для спасения - хотя вам может понадобиться какая-то обертка (например, SDL).

Вам нужен графический интерфейс? wxWidgets, QT может быть Possiblity.

У вас уже есть инструментальная цепочка? Ваши библиотеки должны иметь возможность обрабатывать форматы файлов.

Вы хотите написать библиотеку? C/С++ может быть решением, поскольку большинство стран мира могут использовать библиотеки C/С++. Возможно, с использованием COM?

Есть еще много проектов/библиотек, которые я не упоминал (XNA, Boost,...), и если вы хотите создать некоторую программу, которая не только отображает 3D-графику, но и другие потребности ( Input, Sound, Network, AI, Database, GUI,...)

Подводя итог: язык программирования - инструмент для достижения цели. Это следует рассматривать в контексте поставленной задачи. Задача имеет свои собственные потребности, и эти потребности могут выбрать язык для вас (например, вам нужна определенная библиотека для получения функции, которая занимает много времени для программы, и вы можете обращаться к библиотеке только с помощью языка X).

Если вам нужен один-все-почти-все: попробуйте С++/CLI (возможно, в сочетании с С# для упрощения синтаксиса).

Ответ 28

Хороший вопрос. Что касается того, что "заставляя меня вводить слишком много", С++ 0x, похоже, обращается к большинству из них как уже упоминалось:

auto it = lotsOfThingys.begin())//... выводить тип, как в * ML VS2010beta реализует это уже.

Что касается управления памятью - для эффективности - вам нужно будет хорошо отслеживать распределения памяти, с сборкой мусора или без нее (т.е. иногда создавать блоки памяти, повторно использовать выделенный объект), чтобы в конечном итоге среда - это сбор мусора или нет, дело меньше. Вам также необходимо явно вызвать gc(), чтобы память не фрагментировалась. Устойчивые способы управления памятью важны где угодно. RAII - это функция убийцы С++ Другое дело - в том, что память - это всего лишь один ресурс, вам все равно нужно отслеживать другие ресурсы с помощью GC, поэтому RIAA.

Во всяком случае, С# - хорошая альтернатива во многих отношениях, я нахожу ее очень приятным языком, особенно способностью писать в ней код функционального стиля (симпатичный синтаксис лямбда → , сопоставление/выбор 'LINQ' и т.д.), таким образом, возможность писать параллельный код; в то время как это все еще "стандартные фигурные скобки", когда вам (или вашим коллегам) это нужно.

Ответ 30

Вы можете посмотреть Ada. Нет сборщика мусора, но этот язык часто используется для системы реального времени, требующей высокой надежности. Это означает меньшее время отладки для ваших 3D-приложений.

И вы также можете посмотреть Haskell, если вы не знаете функциональную парадигму, этот язык будет выглядеть странно для вас, но это стоит немного вашего времени. Тим Суини (EPIC Inc) рассматривает этот язык как альтернативу С++.