¿Objective-C o C ++ para juegos iOS?

18

Confío bastante en la programación en Objective-C y C ++, pero creo que Objective-C es algo más fácil de usar y más flexible y dinámico por naturaleza.

¿Cuáles serían los pros y los contras al usar C ++ en lugar de Obj-C para escribir juegos en iOS? O más bien, ¿hay algún problema conocido con el uso de Obj-C en comparación con C ++?

Por ejemplo, sospecho que podría haber problemas de rendimiento con Obj-C en comparación con el código escrito en C / C ++.

Martin Wickman
fuente
Una pregunta similar se ha hecho en SO
bobobobo

Respuestas:

21

Una gran ventaja para C ++: si decide hacerlo, será relativamente fácil portar a Android / PC / DS / PSP / (inserte la plataforma de elección aquí). Objective-C te encerrará en iOS hasta que decidas reescribir todo el juego.

ZorbaTHut
fuente
10
No estoy de acuerdo con la palabra "fácil". "Posible" puede ser una mejor opción.
3Dave
1
Sí, para muchos juegos más pequeños (por ejemplo, la mayoría de los juegos de iPhone) es mejor volver a escribir todo desde cero para la nueva plataforma en lugar de intentar adaptar el código de una plataforma para que funcione en otra. Una arquitectura sólida de MVC minimizaría este dolor, pero ¿quién se molestaría con eso para un juego de combinar 3?
jhocking
3
Relativamente fácil! Si la alternativa es imposible, entonces "extremadamente difícil" es relativamente fácil;)
ZorbaTHut
blog.vucica.net/2011/06/… habla sobre la creación de aplicaciones Objective C para Android. Es solo que Linux y Linux pueden ejecutar Objc tan fácilmente como un iPhone.
Feloneous Cat
El uso del objetivo c no lo bloqueará. El uso de funciones específicas del núcleo XNU lo hará. Gclang está ahí por una razón.
16

Aquí no hay verdaderos pros o contras, al menos ninguno que deba obligar a un programador cómodo en un idioma a tener que usar el otro.

El rendimiento no debería ser un problema. Es poco probable que escriba un trabajo pesado con muchos mensajes en los bucles internos si es un buen programador de Obj-C, lo que significa que realmente escribirá esos bucles internos en C. Si no es bajo programador de nivel, lo más probable es que el trabajo pesado lo realicen las bibliotecas que elija para diferir eso también, y estará a merced de lo que sea que hayan elegido hacer.

La portabilidad es un problema real, si te importa. Si no, entonces meh. Ser multiplataforma no es el final, todo será todo. Ser exitoso en uno primero sería bueno :) Siempre puedes portar más tarde. Si no está planeando cuidadosamente ser multiplataforma desde el día 1 de todos modos, solo estar en el mismo idioma no lo llevará muy lejos: hay muchas más diferencias reales entre las plataformas que deben abordarse.

Terminar el proyecto es más importante que preocuparse por la tecnología, y si eres más productivo en Obj-C, entonces quédate en Obj-C.

¿Mi preferencia? Soy un chico de C ++. Me gusta Obj-C muy bien, pero estoy feliz en C ++, y yo hago escribir código de plataforma cruzada.

Chris Subagio
fuente
55
Estoy muy de acuerdo con los consejos para centrarme en terminar el proyecto con las herramientas con las que sea más productivo. Evitar la optimización prematura no solo se aplica a escribir código, es una buena manera de acercarse a la vida.
jhocking
4

No hay problemas de rendimiento con Obj-C sobre C ++. Ambos son código compilado, y recuerden que Obj-C es un superconjunto de C, y Obj-C ++ es un superconjunto de C ++, lo cual es excelente cuando desea mezclar Obj-C y C ++ en el mismo programa (fácil de hacer y XCode tiene buen soporte para el lado de C ++). Todas las combinaciones de idiomas admiten OpenGL, por lo que cualquier trabajo gráfico serio está bien y el soporte de la biblioteca está bien con Apple, independientemente del idioma.

Dicho esto, ¿cuál es el propósito de tu juego?

  • Si solo escribe para iOS, no se preocupe y escriba en cualquier idioma o combinación con la que se sienta más cómodo. Para mí, esto es Obj-C ++ con STL, ya que esa es mi parte favorita de C ++. Como prefiero Obj-C ligeramente sobre C ++, tiendo a usar esta opción.

  • Si está escribiendo con el objetivo de portar a otro dispositivo, escriba en C ++ con una capa de traducción a Obj-C para tratar cualquier cosa específica del dispositivo (gráficos, entrada, cámara, ...), donde se realizan las llamadas a puntos de entrada en su solicitud.

  • Si eres el más puro y quieres un solo idioma, escribe en Obj-C.

Otros han hablado de otras bibliotecas (física y tal). No hay absolutamente ningún problema para acceder a nada de eso desde cualquiera de las opciones de idioma de las que está hablando (Obj-C, C ++ u Obj-C ++). Tampoco tendrá problemas de rendimiento con esas bibliotecas en ningún idioma.

Una advertencia: hay una llamada indirecta de puntero con el mensaje pasando No estoy seguro de cuánto puede interpretar eso como gastos generales, ya que estoy bastante seguro de que es exactamente lo mismo que una llamada al método C ++ heredado. ¿Alguien puede aclarar esto?

Espero que ayude,

Sotavento.

Sotavento
fuente
1
Buenos puntos, pero ¿realmente quieres escribir tu Vector3Dclase en Obj-C? Mi instinto me dice que eso podría conducir a un mal desempeño.
Martin Wickman
1
Solo es eso. Obj-C es C. No es un problema de rendimiento. Si va a los archivos de encabezado estándar con XCode, encontrará que los tipos subyacentes son solo estructuras de C.
Lee
2
La sobrecarga de mensajes con Obj-C es bastante más alta que C ++ porque es más dinámica. Ciertamente NO es "exactamente lo mismo". por ejemplo: vea developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
Andy Dent el
1

Depende exactamente de lo que esté programando. Si se trata principalmente de la lógica del juego usando motores físicos y gráficos existentes, puedo decir con seguridad que no veo ninguna razón para usar c o c ++ si te sientes más cómodo con obj-c. Si va a implementar clases de representación o de física, probablemente las escriba con c o c ++. Cocos2d, que es una maravillosa y una de las bibliotecas de juegos iOS más populares, está escrita en obj-c.

Echa un vistazo a esta lectura: la parte relevante es "división del trabajo", podría ayudarte a decidir cuándo codificar en un lenguaje de nivel superior y cuándo usar el nivel inferior: código administrado en juegos

Si bien la sobrecarga del objetivo-c no debería estar cerca de C # y ni siquiera se administra (en iOS), creo que la lógica aún se aplica, y los dispositivos que ejecutan iOS tampoco son tan fuertes como la PC que interpretaría MSIL :)

Zaky German
fuente
2
Obj-C no es código administrado en iOS. Por ejemplo (y en particular) Obj-C tiene un recolector de basura cuando programa para OSX, pero no tiene un recolector de basura en iOS.
jhocking
@jhocking nunca dije que fuera administrado, ¿no hay todavía gastos generales al usar obj-c en lugar de c ++? Mencioné c # vs c ++ no estaba cerca de obj-c vs ​​c ++
Zaky German
Cuando publicas un enlace llamado "Código administrado en juegos" mientras hablas de Obj-C, entonces entiendo que piensas que Obj-C es código administrado. Que es en OSX, pero no en iOS. Es un poco tonto eso, como si Java compilara el código de la máquina en algunas plataformas pero se ejecutara en JVM en otras.
jhocking
Ah, y no sé si Obj-C tiene alguna sobrecarga en comparación con C ++. Es por eso que no estoy publicando una respuesta yo mismo.
jhocking
1
@jhocking no señor :) "La cuestión es que el modelo de retención / liberación en Objective-C es más o menos un punto intermedio desde la administración de memoria hasta un GC básico, por lo que ya está por delante de la curva". interfacelab.com/objective-c-memory-management-for-lazy-people
Zaky German
1

Este estudio dice que para obtener realmente el rendimiento en un juego intensivo de CPU, debe usar C. El artículo vinculado se completa con un proyecto XCode que puede ejecutar.

Creo que la conclusión es: use Objective-C donde debe interactuar con las funciones del iPhone (después de todo, poner trampolines en todas partes no puede ser bueno para nadie ), pero cuando se trata de bucles, cosas como clases de objetos vectoriales o intensivos acceso a la matriz, quédese con las matrices C ++ STL o C para obtener un buen rendimiento.

Quiero decir que sería totalmente tonto verlo position = [[Vector3 alloc] init] ;. Solo está pidiendo un éxito de rendimiento si usa recuentos de referencias en objetos básicos como un vector de posición.

Ver también estas comparaciones,

comparisons

bobobobo
fuente
Downvoter? Por favor explique.
bobobobo