Objective-C o C ++ per giochi iOS?


18

Sono abbastanza fiducioso nella programmazione in Objective-C e C ++, ma trovo che Objective-C sia un po 'più facile da usare e più flessibile e dinamico in natura.

Quali sarebbero i pro e i contro quando si usa C ++ invece di Obj-C per scrivere giochi in iOS? O meglio, ci sono problemi noti con l'utilizzo di Obj-C rispetto a C ++?

Ad esempio, sospetto che potrebbero esserci problemi di prestazioni con Obj-C rispetto al codice scritto in C / C ++.


Una domanda simile è stata posta su SO
bobobobo,

Risposte:


21

Un grande vantaggio del C ++: se decidi di farlo, sarà relativamente facile eseguire il port su Android / PC / DS / PSP / (inserisci la piattaforma preferita qui). Objective-C ti bloccherà in iOS fino a quando deciderai di riscrivere l'intero gioco.


10
Non sono d'accordo con la parola "facile". "Possibile" potrebbe essere una scelta migliore.
3Dave

1
Sì, per molti giochi più piccoli (ad es. La maggior parte dei giochi per iPhone) è meglio riscrivere tutto da zero per la nuova piattaforma piuttosto che tentare di adattare il codice da una piattaforma per lavorare su un'altra. Una solida architettura MVC minimizzerebbe questo dolore, ma chi se ne preoccuperebbe per un gioco match-3?
jhocking

3
Relativamente facile! Se l'alternativa è impossibile, allora "estremamente difficile" è relativamente facile;)
ZorbaTHut

blog.vucica.net/2011/06/… parla della creazione di app Objective C per Android. È solo Linux e Linux che possono eseguire Objc con la stessa facilità di un iPhone.
Feloneous Cat,

L'uso dell'obiettivo c non ti bloccherà. L'uso delle funzioni specifiche del kernel XNU lo farà. Gclang è lì per un motivo.

16

Non ci sono pro o contro reali qui, almeno nessuno che dovrebbe costringere un programmatore a proprio agio in una lingua a dover usare l'altra.

Le prestazioni non dovrebbero essere un problema. È improbabile che tu scriva qualsiasi sollevamento pesante con un sacco di messaggi nei loop interni se sei un buon programmatore di Obj-C, il che significa che scriverai davvero quei loop interni in C. Se non sei un basso programmatore di livello, è probabile che il sollevamento pesante sarà fatto da qualsiasi libreria tu abbia scelto di rinviare anche quello, e sarai in balia di qualunque cosa abbiano scelto di fare.

La portabilità è un vero problema, se ti interessa. Altrimenti, allora meh. Essere multipiattaforma non è la fine di tutto. Avere successo su un primo sarebbe bello :) Puoi sempre portarlo più tardi. Se comunque non stai pianificando attentamente di essere multipiattaforma dal primo giorno, solo essere nella stessa lingua non ti porterà molto lontano: ci sono molte altre differenze reali tra le piattaforme che devono essere affrontate.

Finire il progetto è più importante che preoccuparsi della tecnologia, e se sei più produttivo in Obj-C, rimani in Obj-C.

La mia preferenza? Sono un ragazzo C ++. Mi piace Obj-C più che bene, ma sono felice in C ++, e io faccio di scrittura di codice cross-platform.


5
Sono molto d'accordo con il consiglio di concentrarmi sulla conclusione del progetto con qualsiasi strumento tu sia più produttivo. Evitare l'ottimizzazione prematura non si applica solo alla scrittura del codice, ma è anche un buon modo per avvicinarsi alla vita.
jhocking

4

Non ci sono problemi di prestazioni con Obj-C su C ++. Entrambi sono codici compilati e ricordano che Obj-C è un superset di C e Obj-C ++ è un superset di C ++, il che è fantastico quando si desidera mescolare Obj-C e C ++ nello stesso programma (facile da fare e XCode ha un buon supporto per il lato C ++). Tutte le combinazioni linguistiche supportano OpenGL, quindi qualsiasi lavoro grafico serio va bene e il supporto della libreria è ok con Apple indipendentemente dalla lingua.

Detto questo, qual è lo scopo del tuo gioco?

  • Se stai scrivendo esclusivamente per IOS, non preoccuparti e scrivi in ​​qualunque lingua o combinazione ti senta più a tuo agio. Per me, questo è Obj-C ++ con STL poiché questa è la mia parte preferita di C ++. Dato che preferisco Obj-C leggermente al C ++, tendo a usare questa opzione.

  • Se stai scrivendo con l'obiettivo di eseguire il porting su un altro dispositivo, scrivi in ​​C ++ con un livello di traduzione su Obj-C per gestire qualsiasi elemento specifico del dispositivo (grafica, input, videocamera, ...), dove vengono effettuate le chiamate a punti di ingresso nell'applicazione.

  • Se sei il più puro e vuoi solo una lingua, scrivi in ​​Obj-C.

Altri hanno parlato di altre biblioteche (fisica e simili). Non ci sono assolutamente problemi con l'accesso a nessuna di queste opzioni linguistiche di cui stai parlando (Obj-C, C ++ o Obj-C ++). Inoltre non avrai problemi di prestazioni con quelle librerie in nessuna lingua.

Un avvertimento: c'è una chiamata indiretta del puntatore con il passaggio del messaggio. Non sono sicuro di quanto tu possa interpretarlo come overhead, dal momento che sono abbastanza sicuro che sia esattamente lo stesso di una chiamata al metodo C ++ ereditata. Qualcuno può chiarire questo?

Spero possa aiutare,

Lee.


1
Aspetti positivi, ma vorresti davvero scrivere la tua Vector3Dlezione in Obj-C? La mia sensazione viscerale mi dice che potrebbe portare a cattive prestazioni.
Martin Wickman,

1
Questo è tutto. Obj-C è C. Non è un problema di prestazioni. Se vai ai file di intestazione standard con XCode, scoprirai che i tipi sottostanti sono solo strutture C.
Lee,

2
L'overhead del messaggio con Obj-C è leggermente più alto di C ++ perché è più dinamico. Non è certamente "esattamente lo stesso". ad es .: vedi developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
Andy Dent

1

Dipende esattamente da cosa stai programmando. Se si tratta principalmente di logica di gioco che utilizza motori fisici e grafici esistenti, posso tranquillamente dire che non vedo alcun motivo per usare c o c ++ se ti senti più a tuo agio con obj-c. Se stai per lanciare lezioni di rendering o di fisica, probabilmente scriverò quelle che usano c o c ++. Cocos2d - che è una delle librerie di giochi iOS meravigliose e una delle più popolari è scritta in obj-c.

Dai un'occhiata a questa lettura: la parte rilevante è "divisione del lavoro", potrebbe aiutarti a decidere quando codificare in una lingua di livello superiore e quando usare un livello inferiore: codice gestito nei giochi

Mentre il sovraccarico obiettivo-c non dovrebbe essere vicino a C # e non è nemmeno gestito (su iOS), credo che la logica sia ancora valida e anche i dispositivi che eseguono iOS non sono così forti come il PC che interpreterebbe MSIL :)


2
Obj-C non è un codice gestito su iOS. Ad esempio (e in particolare) Obj-C ha un Garbage Collector durante la programmazione per OSX, ma non ha un Garbage Collector su iOS.
jhocking

@jhocking non ho mai detto che fosse gestito, non c'è ancora un sovraccarico quando si utilizza obj-c rispetto a c ++? Ho citato c # vs c ++ non era vicino a obj-c vs ​​c ++
Zaky tedesco

Quando pubblichi un link chiamato "Managed Code in Games" mentre parli di Obj-C, lo prendo per dire che pensi che Obj-C sia un codice gestito. Che è su OSX, non solo su iOS. Un po 'sciocco che, come se Java compilasse il codice macchina su alcune piattaforme ma funzionasse in JVM su altre.
jhocking

oh e non so se Obj-C ha qualche sovraccarico rispetto al C ++. Ecco perché non sto pubblicando una risposta da solo.
jhocking

1
@jhocking no signore :) "Il fatto è che il modello di mantenimento / rilascio in Objective-C è approssimativamente una via di mezzo da nessuna gestione della memoria a un GC di base, quindi sei già davanti alla curva." interfacelab.com/objective-c-memory-management-for-lazy-people
Zaky German

1

Questo studio dice che per ottenere davvero le prestazioni in un gioco ad alta intensità di CPU, devi usare C. L'articolo collegato è completo di un progetto XCode che puoi eseguire.

Credo che la linea di fondo sia: usa Objective-C dove devi interagire con le funzioni dell'iPhone (dopo tutto, mettere i trampolini ovunque non può essere buono per nessuno ), ma quando si tratta di loop, cose come classi di oggetti vettoriali o intensivo accesso all'array, attenersi agli array C ++ STL o C per ottenere buone prestazioni.

Voglio dire, sarebbe totalmente sciocco da vedere position = [[Vector3 alloc] init] ;. Stai solo chiedendo un hit delle prestazioni se usi i riferimenti conta su oggetti di base come un vettore di posizione.

Vedi anche questi confronti,

i confronti


Downvoter? Spiega per favore.
Bobobobo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.