OpenGL или Direct3D для нового игрового проекта Windows? Или что-то еще?

PECS (производитель extends и потребитель super)

Мнемоника → принцип Get и Put.

Этот принцип гласит, что:

  • Используйте расширенный подстановочный знак, когда вы получаете только значения из структуры.
  • Используйте суперсимвол, когда вы только Поместите значения в структуру.
  • И не используйте подстановочный знак, когда вы оба получаете и ставите.

В Java параметры и параметры типового типа не поддерживают наследование следующим образом.

class Super {
    void testCoVariance(Object parameter){} // method Consumes the Object
    Object testContraVariance(){ return null;} //method Produces the Object
}

class Sub extends Super {
    @Override
    void testCoVariance(String parameter){} //doesn't support eventhough String is subtype of Object

    @Override
    String testContraVariance(){ return null;} //compiles successfully i.e. return type is don't care 
}

Принцип подстановки Лискова: Массивы являются ковариантными (небезопасными), но Generics не являются, то есть инвариантными (безопасными). Принцип подстановки не работает с параметризованными типами, что означает, что это незаконно писать. Ковариант просто означает, что X является подтипом Y, тогда X[] также будет подтипом Y[].

Object name= new String("prem"); //works
List numbers = new ArrayList();//gets compile time error

Integer[] myInts = {1,2,3,4};
Number[] myNumber = myInts;
myNumber[0] = 3.14; //attempt of heap pollution i.e. at runtime gets java.lang.ArrayStoreException: java.lang.Double(we can fool compiler but not run-time)

List list=new ArrayList<>();
list.add("prem");
List listObject=list; //Type mismatch: cannot convert from List to List at Compiletime  

больше примеров

ограниченный (т. е. заголовок к чему-либо) подстановочный знак: Есть 3 разных варианта подстановочных знаков:

  • In-variance / Non-variance: ? или ? extends Object - неограниченный подстановочный знак. Он обозначает семью всех типов. Использовать, когда вы оба получаете и ставите.
  • Соотношение: ? extends T (семейство всех типов, которые являются подтипами T) - подстановочный знак с верхней границей. T является самым верхним классом в иерархии наследования. Используйте подстановочный знак extends, когда вы получаете только значения из структуры.
  • Contra-variance: ? super T (семейство всех типов, которые являются супертипами T) - подстановочный знак с нижней границей. T является самым низким классом в иерархии наследования. Используйте подстановочный символ super, если вы только поместите значения в структуру.

Примечание: подстановочный знак ? означает ноль или один раз, представляет неизвестный тип. Подстановочный знак может использоваться как тип параметра, никогда не используемый в качестве аргумента типа для вызова общего метода, создания экземпляра универсального класса (т. Е. При использовании подстановочного знака, эта ссылка не используется в другом месте программы, как мы используем T).

class Shape { void draw() {}}

class Circle extends Shape {void draw() {}}

class Square extends Shape {void draw() {}}

class Rectangle extends Shape {void draw() {}}

public class TestContraVariance {
 /*
   * Example for an upper bound wildcard (Get values i.e Producer `extends`)
   * 
   * */  

    public void testCoVariance(List list) {
        list.add(new Shape()); // Error:  is not applicable for the arguments (Shape) i.e. inheritance is not supporting
        list.add(new Circle()); // Error:  is not applicable for the arguments (Circle) i.e. inheritance is not supporting
        list.add(new Square()); // Error:  is not applicable for the arguments (Square) i.e. inheritance is not supporting
        list.add(new Rectangle()); // Error:  is not applicable for the arguments (Rectangle) i.e. inheritance is not supporting
        Shape shape= list.get(0);//compiles so list act as produces only

        /*You can't add a Shape,Circle,Square,Rectangle to a List 
         * You can get an object and know that it will be an Shape
         */         
    }
      /* 
* Example for  a lower bound wildcard (Put values i.e Consumer`super`)
* */
    public void testContraVariance(List list) {
        list.add(new Shape());//compiles i.e. inheritance is supporting
        list.add(new Circle());//compiles i.e. inheritance is  supporting
        list.add(new Square());//compiles i.e. inheritance is supporting
        list.add(new Rectangle());//compiles i.e. inheritance is supporting
        Shape shape= list.get(0); // Error: Type mismatch, so list acts only as consumer
        Object object= list.get(0); // gets an object, but we don't know what kind of Object it is.

        /*You can add a Shape,Circle,Square,Rectangle to a List 
        * You can't get an Shape(but can get Object) and don't know what kind of Shape it is.
        */  
    }
}

generics и примеры

10
задан Community 23 May 2017 в 12:09
поделиться

18 ответов

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

Окончание игры, даже если это действительно глупо и просто только получить Вас движение, более важно, чем выбор правильной библиотеки. С избытком можно получить некоторый 3D объект обнаружиться на экране через день. Запустите с учебных руководств NeHe.

14
ответ дан 3 December 2019 в 13:44
поделиться

Ogre3D является большим, если Вы хотите сделать кросс-платформенное кодирование и если Вы хотите оставить весь рендеринг механизму. OpenGL является также большим для кросс-платформенного кодирования, но это также заставляет Вас сделать все скучные части - однако это обеспечивает большее управление.

Я избежал бы DirectX в случае, если Вы хотите портировать свою игру на другие платформы. Запланируйте будущее. DirectX 10 может обеспечить некоторые преимущества по сравнению с OpenGL, но я действительно не думаю, что Вы будете чувствовать их, если Вы не будете профессиональной разработкой. Иначе, если Вы - про-Microsoft, необходимо использовать XNA так или иначе, с тех пор как разработчик-любитель Вы не должны будете управлять обеспеченный DirectX.

Я кодирую с OpenGL в течение достаточно долгого времени теперь и с Ogre3D в течение нескольких месяцев теперь, и я не могу сказать, что хочу что-либо еще. Я недавно получил книгу по DirectX 7, и я считаю это грязным. Возможно, вещи изменились, но от того, что я заметил, что не нахожу DirectX, и экстраполяцией Direct3D, привлекательный.

-1
ответ дан 3 December 2019 в 13:44
поделиться

Предложения для абстракции механизма хороши, предполагая, что Вы знаете то, что Вы делаете. Трудно записать хороший уровень абстракции для графики не уже сделав это.

Я предложил бы, чтобы Вы просто выбрали тот. Вы поднимете понятия или от достаточно легко - достаточно так, чтобы можно было потенциально работать над уровнем абстракции или другой достаточно легкой библиотекой. Но просто сделайте это. Я действительно не волновался бы так, о котором правильный. Они - оба хорошие, солидные исполнители. DX10 (если у Вас есть Vista) может иметь небольшое преимущество более актуальных моделей программы построения теней, но для кого-то запускающегося теперь, который довольно не важен, я думаю. GL имеет преимущество, что некоторые nigglier матричные/векторные математические операции или скрыты от Вас или предусмотрены Вы (хотя я думаю, что DX имеет некоторые из них также.)

0
ответ дан 3 December 2019 в 13:44
поделиться

Прежде всего, у нас есть сравнение Википедии OpenGL и Direct3D.

Но я действительно хотел бы услышать некоторые практические точки зрения, особенно в свете последних разработок OpenGL 3.0 и DirectX 10.

0
ответ дан 3 December 2019 в 13:44
поделиться

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

Я действительно однако думаю, что хороший вопрос спросить - то, что является Вашей заключительной целью.
Если это - простая игра, никакая скелетная анимация, и простой 3D - OpenGL является определенно ответом. Если Вы нацеливаете путь выше и не хотите помещать время в разрабатывание всей технологии с нуля (или отправляться на охоту для свободных библиотек и соединяющий все) затем, DX является хорошим выбором, я пошел бы для DX9c, пока DX11 не выходит.

Если Вы не возражаете смешивать с другими языками кроме C++, необходимо также смотреть на среду разработки XNA - это стало довольно сформировавшимся и хорошим.

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

Надеюсь, что это помогло.

0
ответ дан 3 December 2019 в 13:44
поделиться

Я действительно соглашаюсь с теми, которые говорят Вам изучить Ogre3D. Вы сказали использование C++ таким образом, Ogre3D будет большим выбором. XNA использует C#, и необходимо было бы изучить различия между ним и C++ кроме изучения самого XNA. Также XNA не является ни Открытым исходным кодом, ни кросс-платформенный, поэтому если бы Вы хотите иметь более широкое знание о разработке игр, я предложил бы сначала изучить SDL и затем Ogre3D.

1
ответ дан 3 December 2019 в 13:44
поделиться

Это - мое понимание, что в Direct3D необходимо обработать все распределение ресурсов и управление сами, тогда как спецификация OpenGL оставляет это драйверу/реализации, а не приложению.

Это позволяет разработчикам Direct3D использовать лучшее выделение и методы управления, подходящие для приложения, но является также дополнительной работой.

Я сделал типичное "Привет Мировые" приложения в каждом, и я предпочитаю OpenGL по Direct3D, но это - просто мое мнение. Необходимо испытать обоих, провести день или два изучения и проигрывание вокруг с каждым, и решить для себя.

1
ответ дан 3 December 2019 в 13:44
поделиться

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

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

Я запустил с OpenGL для записи, и после того, как приблизительно месяц прошел на Direct3d (версия 7 в то время). Я нашел, что Direct3D вынудил меня больше знать о том, что я желал сделать и как я настраивал вещи, но я предпочел этот уровень понимания.

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

1
ответ дан 3 December 2019 в 13:44
поделиться

Вещью, которую необходимо рассмотреть, является решение о независимости от платформы. Вы хотите связать свою игру с Windows или хотели бы Вы выпускать его к Mac OS X или Linux в какой-то момент. Если Вы решите, что хотите поддерживать Linux, OS X в будущем, то необходимо будет использовать OpenGL.

Кажется, существует большая доброжелательность сообществом Linux, если игра, по крайней мере, полувыпущена для Linux.

1
ответ дан 3 December 2019 в 13:44
поделиться

Для ситуации, что Вы описываете, я рекомендовал бы Direct3D.

Основная причина для использования Direct3D вместо OpenGL - то, что часто поставщики видеокарты только делают хорошее задание на драйверах OpenGL для их "высококачественных" карт.

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

Если бы мобильность важна, то это было бы большой причиной посмотреть на OpenGL или Людоеда вместо этого.

Но если Вы никогда не планируете портировать, затем сфокусироваться на Direct3D, так как это - более широко стабильная платформа с лучшей поддержкой драйвера IHV.

2
ответ дан 3 December 2019 в 13:44
поделиться

Лучшая вещь сделать состояла бы в том, чтобы абстрагировать по Вашему рендереру максимально как можно больше, для создания портирования на другую технологию максимально безболезненным.

2
ответ дан 3 December 2019 в 13:44
поделиться

Я сделал свою диссертацию в uni на сравнении OpenGL по сравнению с Direct3D. Реальная выгода Direct3D - то, что он имеет обычный план выпуска - он всегда обновляется для использования в своих интересах последних усовершенствований в аппаратном обеспечении машинной графики. Сколько времени это взяло между OpenGL 2.0 и 3,0 выпусками? Кроме того, большая работа была сделана в расширениях для OpenGL, что означает, что только некоторый рендеринг будет работать над некоторыми картами.

Однако OpenGL будет легче начать программировать с. Поскольку Direct3D базируется в большой степени в COM, он имеет крутую кривую обучения.

Если бы это был я, то я выбор бы DirectX over OpenGL. Это за счет независимости неплатформы.

2
ответ дан 3 December 2019 в 13:44
поделиться

У меня нет предыдущего OpenGL, DirectX или опыта видеоигры, и я сделал, имеют видеоигру гонки с открытым исходным кодом с Ogre3d. Очень хорошая платформа должна запуститься в видеоиграх: хорошо сделанный код, много документов и информации в сетевых и очень хороших стартовых учебных руководствах.

Механизм визуализации является агностиком DirectX/OpenGl, можно позже выбрать для рендеринга игры с OpenGL или DirectX (withouth изменения в коде)

3
ответ дан 3 December 2019 в 13:44
поделиться

Необходимо помнить, что DirectX является набором технологий - Вход, Аудио и Графика. Однако большинству людей DX синонимичен с рендерером.

По-моему, D3D (или DirectGraphics) действительно не был этим трудно начиная с DX8. Я не попробовал DX9 или DX10.

Bernard прав - пытаются абстрагировать как можно больше. Попытайтесь сохранить DX или вызовы OGL вне Ваших классов объектов.

4
ответ дан 3 December 2019 в 13:44
поделиться

Вы могли также основывать свою работу над людоедом, которого они обеспечивают абстракции сами, и у них есть действительно хорошие инструменты. Так как это - проекты, которыми это было вокруг больше 6 лет, я думаю. Основная библиотека не действительно для новичков, так как необходимо знать немного о разработке программного обеспечения, но я нашел много людей, которые записали игры с помощью нее.

Это было бы более безопасным и более быстрым, чем изучение более тяжелого материала, так как это было уже абстрагировано. Плюс после нескольких месяцев Вы будете говорить 3D жаргон так или иначе. Существует также книга для запущения Вас с Людоеда, я думаю, что это довольно старо к настоящему времени, но начальная точка так или иначе.

7
ответ дан 3 December 2019 в 13:44
поделиться

Если Вы готовы рассмотреть C#, бросьте хороший взгляд на XNA. Для проектов хобби принимая то, что Вы хотите, должно на самом деле разбудить игру и работающий вместо того, чтобы переделать сложный код API, я не могу рекомендовать это достаточно высоко. Это является все больше сформировавшимся, хорошо зарегистрировано, и, по сравнению с D3D/OpenGL, очень быстр и прост в использовании. В качестве награды, с членством в Клубе Создателей за $100/лет, можно даже использовать его для разработки игр для Xbox 360.

8
ответ дан 3 December 2019 в 13:44
поделиться

Отвечать на этот вопрос хорошо запрашивает больше информации о Вас:

  • какова Ваша способность к программированию?

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

Если бы Вы не хотите идти с механизмом, я пошел бы с Direct3D, потому что он обновляется намного более быстрый, чем OpenGL. Я не хочу входить во все проблемы, но о версии 3.0 OpenGL объявили во время SIGGRAPH, и большинство в сообществе было очень разочаровано им. Direct3D помещает Вас в намного лучшее положение для использования в своих интересах программ построения теней и другого использования программируемого конвейера.

Если бы Ваша способность к программированию не слишком высока, и Вы делаете это для изучения программирования, я запустил бы с OpenGL, потому что легче учиться и существует больше ресурсов в сети (см. http://nehe.gamedev.net, например).

1
ответ дан 3 December 2019 в 13:44
поделиться

Не начинайте с Ogre.

Начните с OpenGL GLUT (Win32) и учебное пособие или два ].

Как только вы сможете перейти на Win32 и взгляните на этот сайт , который сейчас довольно старый, но все же неплохой.

0
ответ дан 3 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

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