Objective-C или C ++ для игр для iOS?


18

Я довольно уверенно программирую на Objective-C и C ++, но я считаю, что Objective-C несколько проще в использовании и более гибок и динамичен по своей природе.

Какие были бы плюсы и минусы при использовании C ++ вместо Obj-C для написания игр в iOS? Или, скорее, есть ли известные проблемы с использованием Obj-C по сравнению с C ++?

Например, я подозреваю, что с Obj-C могут возникнуть проблемы с производительностью по сравнению с кодом, написанным на C / C ++.


Подобный вопрос был задан на SO
bobobobo

Ответы:


21

Один большой плюс в C ++: если вы решите сделать это, будет относительно легко портировать на Android / PC / DS / PSP / (укажите платформу здесь). Objective-C заблокирует вас в iOS, пока вы не решите переписать всю игру.


10
Я не согласен со словом «легко». «Возможно» может быть лучшим выбором.
3Dave

1
Да, для многих небольших игр (например, большинства игр для iPhone) лучше просто переписать все с нуля для новой платформы, чем пытаться адаптировать код с одной платформы для работы на другой. Надежная архитектура MVC минимизирует эту боль, но кто будет беспокоиться об этом для игры в матч-3?
Джокинг

3
Относительно легко! Если альтернатива невозможна, то «чрезвычайно сложно» сравнительно легко;)
ZorbaTHut

blog.vucica.net/2011/06/… он рассказывает о создании приложений Objective C для Android. Это просто Linux и Linux может запускать Objc так же легко, как iPhone.
Feloneous Cat

Использование цели c не заблокирует вас. Использование функций, специфичных для ядра XNU, сделает это. Gclang существует по причине.

16

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

Производительность не должна быть проблемой. Маловероятно, что вы написали бы тяжелую работу с большим количеством сообщений во внутренних циклах, если вы хороший программист на Obj-C, что означает, что вы действительно будете писать эти внутренние циклы на C. Если вы не низкий программист, шансы на то, что тяжелые работы будут выполняться любыми библиотеками, которые вы решили отложить, тоже, и вы будете зависеть от того, что они выбрали.

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

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

Мои предпочтения? Я парень C ++. Я как Obj-C просто отлично, но я счастлив в C ++, и я делать записи кросс - код платформы.


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

4

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

Тем не менее, какова цель вашей игры?

  • Если вы пишете исключительно для IOS, не беспокойтесь и пишите на любом языке или комбинации, в которых вы чувствуете себя более комфортно. Для меня это происходит с Obj-C ++ с STL, так как это моя любимая часть C ++. Поскольку я предпочитаю Obj-C немного по сравнению с C ++, я склонен использовать эту опцию.

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

  • Если вы самый чистый и хотите только один язык, пишите на Obj-C.

Другие говорили о других библиотеках (физика и тому подобное). Нет абсолютно никаких проблем с доступом к любому из языков, о которых вы говорите (Obj-C, C ++ или Obj-C ++). У вас также не будет проблем с производительностью этих библиотек на любом языке.

Предостережение: есть вызов косвенного указателя с передачей сообщения. Я не уверен, насколько вы можете интерпретировать это как издержки, так как я почти уверен, что это точно так же, как унаследованный вызов метода C ++. Кто-нибудь может уточнить это?

Надеюсь, это поможет,

Lee.


1
Хорошие моменты, но вы действительно хотите написать свой Vector3Dкласс в Obj-C? Мои интуитивные ощущения говорят мне, что это может привести к плохой работе.
Мартин Уикман,

1
Вот и все. Obj-C - это C. Не проблема с производительностью. Если вы перейдете к стандартным заголовочным файлам с XCode, то обнаружите, что базовые типы - это просто C-структуры.
Ли

2
Издержки сообщений в Obj-C немного выше, чем в C ++, потому что они более динамичны. Это, конечно, не "точно так же". Например: см. developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
Энди Дент

1

Это зависит от того, что именно вы программируете. Если это в основном игровая логика с использованием существующих физических и графических движков, я могу с уверенностью сказать, что не вижу смысла использовать c или c ++, если вам удобнее использовать obj-c. Если вы собираетесь внедрять классы рендеринга или физики, я бы написал те, которые используют c или c ++. Cocos2d - замечательная и одна из самых популярных библиотек игр для iOS, написана на obj-c.

Прочтите это прочтение - соответствующая часть «Разделение труда» может помочь вам решить, когда писать код на языке более высокого уровня, а когда использовать более низкий уровень: управляемый код в играх

Несмотря на то, что издержки target-c не должны быть рядом с C # и даже не управляются (на iOS), я считаю, что логика все еще применима, и устройства под управлением iOS также не так сильны, как ПК, который будет интерпретировать MSIL :)


2
Obj-C не является управляемым кодом на iOS. Например (и в частности) Obj-C имеет сборщик мусора при программировании для OSX, но он не имеет сборщика мусора на iOS.
Джоккинг

@jhocking Я никогда не говорил, что это удалось, разве нет никаких издержек при использовании obj-c в отличие от c ++? Я упоминал, что c # против c ++, это было не где-то рядом с obj-c против c ++
Zaky German

Когда вы публикуете ссылку под названием «Управляемый код в играх», когда говорите об Obj-C, я понимаю, что вы думаете, что Obj-C - это управляемый код. Что это на OSX, но не на iOS. Это глупо, как если бы Java на некоторых платформах компилировалась в машинный код, а на других работала в JVM.
Джоккинг

о, и я не знаю, есть ли у Obj-C какие-либо издержки по сравнению с C ++. Вот почему я не публикую ответ сам.
Джоккинг

1
@jhocking no sir :) «Дело в том, что модель сохранения / выпуска в Objective-C - это примерно среднее положение от отсутствия управления памятью до базового GC, так что вы уже впереди». interfacelab.com/objective-c-memory-management-for-lazy-people
Заки Герман,

1

В этом исследовании говорится, что для того, чтобы действительно добиться высокой производительности в игре, интенсивно использующей процессор, вы должны использовать C. Связанная статья содержит проект XCode, который вы можете запустить.

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

Я имею в виду, было бы совершенно глупо видеть position = [[Vector3 alloc] init] ;. Вы просто запрашиваете снижение производительности, если используете счетчик ссылок на базовые объекты, такие как вектор положения.

Смотрите также эти сравнения,

сравнения


Downvoter? Пожалуйста, объясни.
Бобобобо
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.