Что лучшее альтернативно к C++ для графического программирования в реальном времени? [закрытый]

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

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

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

33
задан Bill the Lizard 9 August 2012 в 03:26
поделиться

27 ответов

Я не отбросил бы C++. На самом деле я рассмотрел бы добавляющее Повышение Вашей библиотеки C++, которая делает язык намного более применимым. Ваш пример стал бы:

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

Повышение имеет тонны инструментов, что справка делает C++ лучшим языком.

18
ответ дан Martin Cote 27 November 2019 в 17:21
поделиться

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

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

Только для комментария примера; определение типа является Вашим другом...

typedef std::vector<Thingy> Thingys;
Thingys::const_iterator it = lotsOfThingys.begin()
0
ответ дан Markowitch 27 November 2019 в 17:21
поделиться

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

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

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

0
ответ дан Game_Overture 27 November 2019 в 17:21
поделиться

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

0
ответ дан Nemanja Trifunovic 27 November 2019 в 17:21
поделиться

Если Ваша цель является ПК, я думаю, что можно попробовать C#, или встроить Lua в приложение C++ и выполнить сценарии для 'высокоуровневого' материала. Однако, если Ваша цель является консолью, Вы должны управлять своей собственной памятью!

0
ответ дан R Caloca 27 November 2019 в 17:21
поделиться

При предназначении для Windows C++ / CLI (.NET Microsoft 'справилась', диалект C++) интересная возможность, особенно если Вы хотите усилить свой опыт C++. Можно смешать собственный код (например, звонит в C-библиотеки-стилей) с управляемым кодом.NET вполне беспрепятственно, и используйте в своих интересах GC.NET и библиотеки.

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

2
ответ дан McKenzieG1 27 November 2019 в 17:21
поделиться

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

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

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

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

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

2
ответ дан PhiLho 27 November 2019 в 17:21
поделиться

Давайте не забывать упоминать новое 'автоматическое' использование:

auto it = lotsOfThingys.begin(); // Let the compiler figure it out.
auto it2 = lotsOfFoos.begin();
if (it==it2) // It's still strongly typed; a Thingy iter is not a Foo iter.
13
ответ дан graham.reeds 27 November 2019 в 17:21
поделиться

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

3
ответ дан komma8.komma1 27 November 2019 в 17:21
поделиться

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

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

3
ответ дан Adi 27 November 2019 в 17:21
поделиться

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

3
ответ дан yrp 27 November 2019 в 17:21
поделиться

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

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

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

5
ответ дан mittens 27 November 2019 в 17:21
поделиться

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

Функции PureBasic

  • Машинный код (блок) исполняемые файлы (FASM)
    • поддержка Встроенного ассемблерного кода
    • Никакое необходимое время выполнения (никакой необходимый DLLs, и т.д.) 1 исполняемый файл
    • Крошечные исполняемые файлы (как маленькие или меньший/поскольку быстрый или быстрее, чем C++ w/out время выполнения)
    • можно записать поддержку Мультипотока DLLs
    • Полная поддержка API ОС
  • Поддержка разных платформ
    • Windows 95-2003
    • Linux
    • MacOS X
    • Amiga
  • 2D & 3D разработка игр
    • людоед DirectX
  • Щедрое Лицензирование
    • Недорогой (79 евро или приблизительно 112$)
    • Пожизненная лицензия (все будущее обновляет & версии включали)
    • Одна цена за все платформы
  • Внешняя поддержка Библиотеки
    • сторонние Пользовательские библиотеки DLLs
  • онлайн-поддержка
    • Быстро реагирующая группа разработчиков во главе с, он - создатель
    • Онлайн-форум
        <литий> Одно место для ответов (don’t, должны пойти по всей сети) <литий> Огромная сумма примера кода (испытайте код в то время как в IE с IEtool) <литий> Быстрые ответы на вопросы премия
  • , учащаяся (альтернатива изучению C++)
    • структуры API
    • Интерфейсы
    • Указатели

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

6
ответ дан DevilDog 27 November 2019 в 17:21
поделиться

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

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

12
ответ дан Nathan 27 November 2019 в 17:21
поделиться

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

2
ответ дан Johan Moreau 27 November 2019 в 17:21
поделиться

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

13
ответ дан James Hopkin 27 November 2019 в 17:21
поделиться

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

немного трудно сделать любые гарантии ответа в режиме реального времени, если сборщик "мусора" может умереть когда-либо и потратить неопределенный объем обработки...

14
ответ дан Pieter 27 November 2019 в 17:21
поделиться

Я не соглашаюсь с Вашей предпосылкой. Когда используется тщательно и правильно, C++ является большим языком, специально для домена как графика в реальном времени, где скорость является существенной.

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

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

using namespace std;
typedef vector::const_iterator ThingyConstIter;

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

15
ответ дан Dima 27 November 2019 в 17:21
поделиться

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

17
ответ дан Drealmer 27 November 2019 в 17:21
поделиться

Что относительно Язык программирования D ?

Некоторые ссылки запросили в комментарии:

Оставленный Win32 Api

(Мультимедийный lib)

18
ответ дан scable 27 November 2019 в 17:21
поделиться

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

http://www.ionicwind.com

Джеймс.

0
ответ дан 27 November 2019 в 17:21
поделиться

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

8
ответ дан 27 November 2019 в 17:21
поделиться

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

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

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

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

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

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

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

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

Подводя итог: язык программирования - это инструмент для достижения цели. Это следует рассматривать в контексте поставленной задачи.

0
ответ дан 27 November 2019 в 17:21
поделиться

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

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

1
ответ дан 27 November 2019 в 17:21
поделиться

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

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

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

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

0
ответ дан 27 November 2019 в 17:21
поделиться

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

2
ответ дан 27 November 2019 в 17:21
поделиться

Взгляните на объект Delphi / Pascal и некоторые примеры: http://www.delphigamer.com или http://glscene.cjb.net/

0
ответ дан 27 November 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: