Objective-C oder C ++ für iOS-Spiele?


18

Ich bin ziemlich sicher in Objective-C und C ++ zu programmieren, aber ich finde, dass Objective-C etwas einfacher zu bedienen und flexibler und dynamischer ist.

Was wären die Vor- und Nachteile, wenn Sie C ++ anstelle von Obj-C für das Schreiben von Spielen unter iOS verwenden? Oder gibt es bekannte Probleme bei der Verwendung von Obj-C im Vergleich zu C ++?

Ich vermute zum Beispiel, dass es Leistungsprobleme mit Obj-C im Vergleich zu in C / C ++ geschriebenem Code gibt.


Eine ähnliche Frage wurde am SO
Bobobobo

Antworten:


21

Ein großer Vorteil von C ++: Wenn Sie sich dafür entscheiden, ist es relativ einfach, auf Android / PC / DS / PSP / zu portieren (fügen Sie hier die Plattform Ihrer Wahl ein). Objective-C wird Sie an iOS binden, bis Sie sich dazu entschließen, das gesamte Spiel neu zu schreiben.


10
Ich bin mit dem Wort "einfach" nicht einverstanden. "Möglich" kann eine bessere Wahl sein.
3Dave

1
Ja, für viele kleinere Spiele (z. B. die meisten iPhone-Spiele) ist es besser, einfach alles von Grund auf neu für die neue Plattform zu schreiben, anstatt zu versuchen, den Code von einer Plattform zur Arbeit auf einer anderen anzupassen. Eine solide MVC-Architektur würde diesen Schmerz minimieren, aber wer würde sich bei einem Match-3-Spiel damit abfinden?
schockierend

3
Relativ einfach! Wenn die Alternative unmöglich ist, dann ist "extrem schwierig" relativ einfach;)
ZorbaTHut

blog.vucica.net/2011/06/… er spricht über das Erstellen von Objective C-Apps für Android. Es ist nur Linux und Linux kann Objc so einfach wie ein iPhone ausführen.
Feloneous Cat

Die Verwendung von Ziel c wird Sie nicht daran hindern. Die Verwendung von Funktionen, die für den XNU-Kernel spezifisch sind, wird dies tun. Gclang ist nicht ohne Grund da.

16

Hier gibt es keine wirklichen Vor- oder Nachteile, zumindest keine, die einen Programmierer, der sich in einer Sprache wohlfühlt, dazu zwingen sollten, die andere zu verwenden.

Leistung sollte kein Problem sein. Wenn Sie ein guter Obj-C-Programmierer sind, ist es unwahrscheinlich, dass Sie in den inneren Schleifen eine schwere Übung mit viel Messaging schreiben, was bedeutet, dass Sie diese inneren Schleifen wirklich in C schreiben werden Level-Programmierer, es besteht die Möglichkeit, dass das schwere Heben von den Bibliotheken durchgeführt wird, die Sie ausgewählt haben, um dies ebenfalls aufzuschieben, und Sie sind dem ausgeliefert, was auch immer sie tun.

Portabilität ist ein echtes Problem, wenn Sie sich darum kümmern. Wenn nicht, dann meh. Plattformübergreifend zu sein ist nicht das Ende von allem. Ein erster Erfolg wäre schön :) Sie können später immer portieren. Wenn Sie ohnehin nicht sorgfältig planen, ab Tag 1 plattformübergreifend zu sein, werden Sie mit der gleichen Sprache nicht weit kommen: Es gibt viele weitere echte Unterschiede zwischen Plattformen, die angesprochen werden müssen.

Das Projekt abzuschließen ist wichtiger als sich über die Technologie zu ärgern. Wenn Sie in Obj-C produktiver sind, bleiben Sie in Obj-C.

Meine Vorliebe? Ich bin ein C ++ - Typ. Ich mag Obj-C ganz gut, aber ich bin glücklich , in C ++, und ich tue Schreib Cross - Plattform - Code.


5
Ich stimme dem Rat sehr zu, mich darauf zu konzentrieren, das Projekt mit den Tools abzuschließen, mit denen Sie am produktivsten sind. Das Vermeiden vorzeitiger Optimierung gilt nicht nur für das Schreiben von Code, sondern auch für die Annäherung an das Leben.
jhocking

4

Es gibt keine Leistungsprobleme mit Obj-C über C ++. Beide sind kompilierter Code und erinnern daran, dass Obj-C eine Obermenge von C und Obj-C ++ eine Obermenge von C ++ ist. Dies ist großartig, wenn Sie Obj-C und C ++ in demselben Programm mischen möchten (einfach zu tun und XCode) hat nette Unterstützung für die C ++ Seite). Alle Sprachkombinationen unterstützen OpenGL, daher ist jede ernsthafte Grafikarbeit in Ordnung und die Bibliotheksunterstützung ist für Apple unabhängig von der Sprache in Ordnung.

Das heißt, was ist der Zweck Ihres Spiels?

  • Wenn Sie ausschließlich für IOS schreiben, machen Sie sich keine Sorgen und schreiben Sie in einer Sprache oder Kombination, in der Sie sich wohler fühlen. Für mich ist dies zufällig Obj-C ++ mit STL, da dies mein Lieblingsteil von C ++ ist. Da ich Obj-C gegenüber C ++ etwas bevorzuge, benutze ich diese Option.

  • Wenn Sie mit dem Ziel schreiben, auf ein anderes Gerät zu portieren, schreiben Sie in C ++ mit einer Übersetzungsebene nach Obj-C, um alle gerätespezifischen Aufgaben (Grafiken, Eingaben, Kameras usw.) zu erledigen, an die die Anrufe getätigt werden Einstiegspunkte in Ihre Anwendung.

  • Wenn Sie ein Reiner sind und nur eine Sprache wollen, schreiben Sie in Obj-C.

Andere haben über andere Bibliotheken (Physik und dergleichen) gesprochen. Es gibt absolut keine Probleme mit dem Zugriff auf eine der von Ihnen angesprochenen Sprachen (Obj-C, C ++ oder Obj-C ++). Außerdem treten bei diesen Bibliotheken in keiner Sprache Leistungsprobleme auf.

Eine Einschränkung: Es gibt einen Zeiger-Indirektionsaufruf mit Nachrichtenübergabe. Ich bin mir nicht sicher, wie viel Sie als Overhead interpretieren können, da ich mir ziemlich sicher bin, dass dies genau dasselbe ist wie ein geerbter C ++ - Methodenaufruf. Kann das jemand klären?

Hoffentlich hilft das,

Lee.


1
Gute Punkte, aber möchten Sie wirklich Ihre Vector3DKlasse in Obj-C schreiben ? Mein Bauchgefühl sagt mir, dass dies zu einer schlechten Leistung führen könnte.
Martin Wickman

1
Das war's auch schon. Obj-C ist C. Kein Leistungsproblem. Wenn Sie mit XCode zu den Standardheaderdateien wechseln, werden Sie feststellen, dass die zugrunde liegenden Typen nur C-Strukturen sind.
Lee

2
Der Nachrichten-Overhead mit Obj-C ist ziemlich viel höher als in C ++, da er dynamischer ist. Es ist sicherlich nicht "genau das gleiche". Beispiel: siehe developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
Andy Dent

1

Es kommt genau darauf an was Sie programmieren. Wenn es hauptsächlich um Spielelogik mit vorhandenen Physik- und Grafik-Engines geht, kann ich mit Sicherheit sagen, dass ich keinen Grund sehe, c oder c ++ zu verwenden, wenn Sie mit obj-c besser umgehen können. Wenn Sie Rendering- oder Physikkurse einführen wollen, würde ich diese wahrscheinlich mit c oder c ++ schreiben. Cocos2d - das ist eine wunderbare und eine der beliebtesten iOS-Spielebibliotheken, die in obj-c geschrieben ist.

Schauen Sie sich diese Lektüre an - der relevante Teil ist "Arbeitsteilung". Dies kann Ihnen bei der Entscheidung helfen, wann Sie in einer höheren Sprache codieren und wann Sie eine niedrigere Version verwenden sollten: Verwalteter Code in Spielen

Während Objective-C-Overhead nicht in der Nähe von C # sein sollte und nicht einmal verwaltet wird (unter iOS), glaube ich, dass die Logik immer noch zutrifft, und Geräte mit iOS sind auch nicht annähernd so stark wie der PC, der MSIL interpretieren würde :)


2
Obj-C ist unter iOS kein verwalteter Code. Zum Beispiel (und insbesondere) hat Obj-C einen Garbage Collector, wenn es für OSX programmiert, aber keinen Garbage Collector unter iOS.
jhocking

@jhocking Ich habe nie gesagt, dass es verwaltet wurde, gibt es nicht noch Overhead bei der Verwendung von obj-c im Gegensatz zu c ++? Ich habe erwähnt, c # vs c ++ es war nicht weit entfernt von obj-c vs ​​c ++
Zaky Deutsch

Wenn Sie einen Link namens "Verwalteter Code in Spielen" posten, während Sie über Obj-C sprechen, dann verstehe ich, dass Sie glauben, Obj-C sei verwalteter Code. Was es unter OSX ist, nur nicht unter iOS. Irgendwie doof, als ob Java auf einigen Plattformen zu Maschinencode kompiliert, auf anderen in JVM ausgeführt würde.
jhocking

Oh und ich weiß nicht, ob Obj-C Overhead im Vergleich zu C ++ hat. Deshalb poste ich selbst keine Antwort.
jhocking

1
@jhocking no sir :) "Die Sache ist, dass das Retain / Release-Modell in Objective-C in etwa ein Mittelweg von der Speicherverwaltung zu einem Basis-GC ist, sodass Sie der Kurve bereits einen Schritt voraus sind." interfacelab.com/objective-c-memory-management-for-lazy-people
Zaky Deutsch

1

Diese Studie besagt, dass Sie C verwenden müssen, um die Leistung in einem CPU-intensiven Spiel wirklich zu erzielen. Der verknüpfte Artikel enthält ein XCode-Projekt, das Sie ausführen können.

Meiner Meinung nach lautet das Fazit : Verwenden Sie Objective-C, bei dem Sie mit den Funktionen des iPhones interagieren müssen ( Trampoline überall zu platzieren, kann schließlich für niemanden gut sein ), aber wenn es um Schleifen, Dinge wie Vektorobjektklassen oder Intensiv geht Halten Sie sich beim Array-Zugriff an C ++ STL- oder C-Arrays, um eine gute Leistung zu erzielen.

Ich meine, es wäre total albern zu sehen position = [[Vector3 alloc] init] ;. Sie fragen nur nach einem Leistungstreffer, wenn Sie Referenzzählungen für grundlegende Objekte wie einen Positionsvektor verwenden.

Siehe auch diese Vergleiche,

Vergleiche


Downvoter? Bitte erkläre.
Bobobobo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.