Objective-C ou C ++ para jogos iOS?

18

Estou bastante confiante de programação em Objective-C e C ++, mas acho que o Objective-C é um pouco mais fácil de usar e mais flexível e dinâmico por natureza.

Quais seriam os prós e os contras ao usar o C ++ em vez do Obj-C para escrever jogos no iOS? Ou melhor, existem problemas conhecidos com o uso de Obj-C em comparação com C ++?

Por exemplo, suspeito que possa haver problemas de desempenho com o Obj-C em comparação com o código escrito em C / C ++.

Martin Wickman
fonte
Uma pergunta semelhante foi solicitado no SO
bobobobo

Respostas:

21

Uma grande vantagem do C ++: se você decidir fazer isso, será relativamente fácil portar para Android / PC / DS / PSP / (inserir a plataforma de escolha aqui). O Objective-C o prenderá no iOS até você decidir reescrever o jogo inteiro.

ZorbaTHut
fonte
10
Eu discordo da palavra "fácil". "Possível" pode ser uma escolha melhor.
3Dave
11
Sim, para muitos jogos menores (por exemplo, a maioria dos jogos para iPhone), é melhor reescrever tudo do zero para a nova plataforma, em vez de tentar adaptar o código de uma plataforma para trabalhar em outra. Uma arquitetura MVC sólida minimizaria essa dor, mas quem se importaria com isso em um jogo de combinação 3?
Jhocking
3
Relativamente fácil! Se a alternativa é impossível, então "extremamente difícil" é relativamente fácil;)
ZorbaTHut
blog.vucica.net/2011/06/… ele fala sobre a criação de aplicativos Objective C para android. Apenas o Linux e o Linux podem executar o Objc tão facilmente quanto um iPhone.
Feloneous Cat
O uso do objetivo c não o trava. O uso de funções específicas para o kernel XNU. Gclang está lá por uma razão.
16

Não há prós ou contras reais aqui, pelo menos nenhum que deva forçar um programador a se sentir confortável em um idioma a usar o outro.

O desempenho não deve ser um problema. É improvável que você escreva qualquer trabalho pesado com muitas mensagens nos loops internos se você for um bom programador de Obj-C, o que significa que você realmente estará escrevendo esses loops internos em C. Se você não é baixo programador de nível, as chances são de que o trabalho pesado será feito por quaisquer bibliotecas que você escolher adiar isso também, e você estará à mercê do que eles escolherem fazer.

Portabilidade é um problema real, se você se importa. Se não, então meh. Ser multiplataforma não é o fim, tudo é tudo. Ser bem-sucedido em um primeiro seria bom :) Você sempre pode portar mais tarde. Se você não planeja cuidadosamente ser multiplataforma desde o primeiro dia, apenas estar no mesmo idioma não o levará muito longe: existem muitas outras diferenças reais entre plataformas que precisam ser abordadas.

Terminar o projeto é mais importante do que se preocupar com a tecnologia, e se você é mais produtivo no Obj-C, permaneça no Obj-C.

Minha preferência? Eu sou um cara de C ++. I como Obj-C bem, mas estou feliz em C ++, e eu fazer write código de plataforma cruzada.

Chris Subagio
fonte
5
Concordo muito com o conselho de me concentrar em terminar o projeto com as ferramentas com as quais você é mais produtivo. Evitar a otimização prematura não se aplica apenas à escrita de código, é uma boa maneira de abordar a vida.
Jhocking
4

Não há problemas de desempenho com o Obj-C sobre C ++. Ambos são código compilado, e lembre-se de que Obj-C é um superconjunto de C e Obj-C ++ é um superconjunto de C ++, o que é ótimo quando você deseja misturar Obj-C e C ++ no mesmo programa (fácil de executar e XCode tem um bom suporte para o lado C ++). Todas as combinações de idiomas são compatíveis com o OpenGL; portanto, qualquer trabalho gráfico sério é bom e o suporte à biblioteca é aceitável para a Apple, independentemente do idioma.

Dito isto, qual é o objetivo do seu jogo?

  • Se você está escrevendo exclusivamente para o IOS, não se preocupe e escreva em qualquer idioma ou combinação em que se sinta mais confortável. Para mim, esse é o Obj-C ++ com STL, já que essa é a minha parte favorita do C ++. Como eu prefiro o Obj-C um pouco do que o C ++, costumo usar essa opção.

  • Se você estiver escrevendo com o objetivo de portar para outro dispositivo, escreva em C ++ com uma camada de conversão para o Obj-C para lidar com qualquer material específico do dispositivo (gráficos, entrada, câmera, ...), onde as chamadas são feitas para pontos de entrada na sua aplicação.

  • Se você é mais puro e deseja apenas um idioma, escreva no Obj-C.

Outros já falaram sobre outras bibliotecas (física e outras). Não há absolutamente nenhum problema em acessar qualquer uma dessas opções de idioma que você está falando (Obj-C, C ++ ou Obj-C ++). Você também não terá problemas de desempenho com essas bibliotecas em nenhum idioma.

Uma ressalva: há uma chamada indireta de ponteiro com a passagem de mensagens. Não tenho certeza de quanto você pode interpretar isso como sobrecarga, pois tenho certeza de que é exatamente o mesmo que uma chamada de método C ++ herdada. Alguém pode esclarecer isso?

Espero que ajude,

Lee.

Lee
fonte
11
Bons pontos, mas você realmente gostaria de escrever sua Vector3Dturma em Obj-C? Meu pressentimento me diz que isso pode levar a um desempenho ruim.
Martin Wickman
11
É isso mesmo. Obj-C é C. Não é um problema de desempenho. Se você for aos arquivos de cabeçalho padrão com o XCode, verá que os tipos subjacentes são apenas estruturas C.
Lee
2
A sobrecarga de mensagem no Obj-C é um pouco mais alta que o C ++, porque é mais dinâmica. Certamente NÃO é "exatamente o mesmo". por exemplo: consulte developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
Andy Dent
1

Depende exatamente do que você está programando. Se for principalmente lógica de jogo usando mecanismos de física e gráficos existentes, posso dizer com segurança que não vejo motivo para usar c ou c ++ se você estiver mais à vontade com o obj-c. Se você estiver lançando classes de renderização ou física, provavelmente escreveria aquelas usando c ou c ++. Cocos2d - que é uma maravilhosa e uma das bibliotecas de jogos iOS mais populares está escrita em obj-c.

Confira esta leitura - a parte relevante é "divisão do trabalho", pode ajudá-lo a decidir quando codificar em um idioma de nível superior e quando usar o nível inferior: Código gerenciado em jogos

Embora a sobrecarga da objetiva-c não deva estar perto de C # e nem seja gerenciada (no iOS), acredito que a lógica ainda se aplica, e os dispositivos com iOS também não estão tão fortes quanto o PC que interpretaria o MSIL :)

Zaky German
fonte
2
Obj-C não é um código gerenciado no iOS. Por exemplo (e em particular), o Obj-C possui um coletor de lixo ao programar para OSX, mas não possui um coletor de lixo no iOS.
Jhocking
@jhocking Eu nunca disse que foi gerenciado, ainda não há sobrecarga ao usar obj-c em vez de c ++? Eu fiz menção c # vs c ++ que não era onde perto obj-c vs c ++
Zaky alemão
Quando você publica um link chamado "Código gerenciado nos jogos" enquanto fala sobre o Obj-C, entendo que você pensa que o Obj-C é um código gerenciado. Qual é no OSX, mas não no iOS. É meio bobo que, como se Java compilasse o código da máquina em algumas plataformas, mas rodasse na JVM em outras.
Jhocking
Ah, e eu não sei se o Obj-C tem alguma sobrecarga em comparação com o C ++. É por isso que não estou postando uma resposta.
Jhocking
11
@jhocking no sir :) "O problema é que o modelo de retenção / liberação no Objective-C é basicamente o meio termo entre o gerenciamento de memória e o GC básico, para que você já esteja à frente da curva." interfacelab.com/objective-c-memory-management-for-lazy-people
Zaky German
1

Este estudo diz que, para realmente obter o desempenho em um jogo intensivo de CPU, você precisa usar o C. O artigo vinculado está completo com um projeto XCode que você pode executar.

Acredito que a conclusão é: use o Objective-C onde você deve interagir com as funções do iPhone (afinal, colocar trampolins em todos os lugares não pode ser bom para ninguém ), mas quando se trata de loops, coisas como classes de objetos vetoriais ou intensivas acesso à matriz, use as matrizes C ++ STL ou C para obter um bom desempenho.

Quero dizer, seria totalmente bobo de se ver position = [[Vector3 alloc] init] ;. Você está apenas pedindo uma ocorrência de desempenho se usar referências contadas em objetos básicos como um vetor de posição.

Veja também essas comparações,

comparações

bobobobo
fonte
Downvoter? Por favor explique.
bobobobo