¿Hay alguna diferencia significativa en el rendimiento y el tamaño del archivo al programar un juego de iOS en Unity y Swift?

Para un pequeño proyecto 3D, diría que Unity funcionará mejor en gráficos, porque el motor ha sido muy optimizado de forma nativa por profesionales talentosos. Si comienzas tu juego en Swift usando solo bibliotecas de Apple, deberás agregar bibliotecas gráficas adicionales que probablemente no puedan competir con las de Unity.

Para el código principal del juego, probablemente usarás C # en Unity. Su código se compilará en bytecode que será interpretado por la máquina virtual de Mono durante el tiempo de ejecución. Esto será ciertamente más lento que su código en Swift. Swift es un lenguaje moderno como C #, por lo que la calidad del código será comparable, pero el código Swift se compilará en un archivo binario nativo, su rendimiento será cercano a C. Además, Mono usa Garbage Collection, que crea picos de rendimiento desde tiempo al tiempo. Swift utiliza el conteo automático de referencias, por lo que no existe tal cosa.

No estoy seguro de si todavía es cierto para las versiones recientes de Unity, pero hubo un error en la versión de Mono enviado con Unity (hasta 4.5 al menos) que crea referencias estáticas de las variables pasadas a través de lambdas, lo que introduce fugas de memoria horribles que obviamente disminuye el rendimiento (en el mejor de los casos, o falla en el peor). Di un ejemplo de esto en mi charla en Unite Japan 2013 (ver las diapositivas “FLM en la vida real”). El GC también hace que sea una pesadilla depurar tu memoria, y tendrás que confiar en las herramientas de Unity, porque las herramientas de rendimiento de Apple solo verán una gran cantidad de memoria asignada por Mono …

Nuevamente, si está trabajando en un proyecto pequeño, la diferencia en el tamaño del archivo será bastante notable. Debido a que Unity incluirá Mono con tu juego, el binario será bastante grande. Probablemente haya muchas cosas del motor, incluidas las texturas, que probablemente no necesite, pero de todos modos también se incluirán. No solo espacio en disco, sino que el juego usará más memoria en general. De hecho, si toma una captura de fotograma de un juego vacío de Unity, verá que se cargan muchas texturas en su memoria gráfica de forma predeterminada.

Sin recursos de audio, un juego 2D típico hecho en Unity tendrá un tamaño de alrededor de 50 MB. Por el contrario, un juego creado de forma nativa con XCode tendrá alrededor de 10 MB. Creé 2 juegos 2D y 1 aplicación iOS completamente en Swift durante el año pasado y tienen menos de 15 MB.

¿Su juego necesitará gráficos modernos y limpios y no tiene los recursos para programarlos en Swift / Metal? Usa la unidad.

¿Planeas ir multiplataforma? Usa la unidad.

En cualquier otro caso, recomendaría XCode / Swift puro.

Naturalmente, los mejores motores conducirán a juegos que funcionan mejor y son más grandes. Están agrupando muchas bibliotecas y características, pero están ahí para que le resulte más fácil crear su visión y optimizar su rendimiento. Porque seamos sinceros: no puedes hacer que un juego funcione mejor desde cero que las personas cuyo trabajo es solo eso.

Su pregunta es buena, porque esa es la compensación directa de ir con un motor o no. Todo esto supone que su juego es cualquier cosa menos lo más simple de juego y arte.

No soy un desarrollador de juegos, así que puedo darte una respuesta general.

Unity se basa en Mono y utiliza API nativas. En realidad, si no desea que su aplicación sea multiplataforma, puede usar API exclusivamente nativas sin API multiplataforma .Net (que al final del día se convierten a las API nativas, solo podrían agregar un poco de sobrecarga en eso )

Entonces, teniendo en cuenta el rendimiento, no esperaría ganancias mensurables al usar Swift. Teniendo en cuenta el tamaño del archivo, puede obtener algunos gastos generales al incluir algunas partes de Mono en su código, cuánto puede influir en su aplicación depende de su aplicación, pero seguramente solo son un par de megabytes, lo que no debería ser demasiado para un juego .