domingo, 16 de febrero de 2014

Unity3D Scripting: Optimización de código (I)

Hoy voy a enseñar un pequeño truco de optimización de código que he aprendido investigando un poco.

Unity3D, tiene cierta funcionalidad que si bien es útil y bastante intuitiva, no es muy práctica a la hora de optimizar el código de programación y voy a explicar como optimizarlo y por qué optimizarlo de esta manera.



Este código es el como NO debería hacerse

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour {
    void Start() {
        if (Application.platform == RuntimePlatform.WindowsPlayer)
            //Si el juego está compilado en windows....
        
    }
}
Como podemos ver aquí arriba, dentro del Start, estamos preguntando si estamos ejecutando nuestro juego en Windows, ya que, dentro de Unity3D, podríamos compilar nuestro videojuego para diversas plataformas y podría ser que una funcionalidad en concreto debas programarla diferente en otra plataforma, por ejemplo si estás portando el videojuego de Windows a Android.

Ahora bien, esta manera de programar no es la correcta ya que, si has cambiado de plataforma, lo normal es que este código lo elimines ya que no sirve en tu nuevo proyecto, como he puesto de prueba anteriormente, Android.

Ahora bien, una manera de evitarlo sería pues, en vez de ese if, meterlo en comentarios de manera que ese comentario no se compila con el resto del código, pero eso genera otro problema.

Si comento la parte que es solo para Windows, pero mas adelante tengo que volver a cambiar algo de mi proyecto de windows... tendré que descomentar todo lo que anteriormente comenté que era específico de windows y volver a comentar todo lo del resto de sistemas operativos.

¿Hay una solución práctica para ello? Si

Aquí pondré un código muy útil para estos casos.

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour {
    void Start() {
        #if UNITY_STANDALONE_WIN
           //Código de windows
        #endif
    }
}
De esta manera, si tu proyecto está creado para windows compilará el código dentro de ese if y si cambias de plataforma pues ese proyecto quedará como comentado y no se compilará, por lo cual tendrás menos código en tu programa, menos carga en memoria que jamás se utilizará e incluso ahorrarte ciertos fallos que podría dar tener cierto código en memoria a pesar de no poder usarlo.

¿Cuales son los códigos posibles para estas condiciones?

UNITY_EDITOR Modo debug.
UNITY_STANDALONE_OSX Mac OS X.
UNITY_DASHBOARD_WIDGET Widget para el dashboard de Mac OS X. UNITY_STANDALONE_WIN Windows.
UNITY_STANDALONE_LINUX Linux.
UNITY_STANDALONE Windows, Mac OS X o Linux.
UNITY_WEBPLAYER Ejecutable vía web.
UNITY_WII Wii.
UNITY_IPHONE iPhone.
UNITY_ANDROID Android.
UNITY_PS3 Playstation 3.
UNITY_XBOX360 Xbox 360.
UNITY_NACL Cliente nativo de google (esto es adicional al UNITY_WEBPLAYER).
UNITY_FLASH Adobe Flash.
UNITY_BLACKBERRY Blackberry 10.
UNITY_WP8 Windows Phone 8.
UNITY_METRO Windows Store Apps (Adicionalmente NETFX_CORE es definido compilando archivos C# en .NET Core).
UNITY_WINRT Equivalente a UNITY_WP8 | UNITY_METRO

Además puedes filtrar por la versión de Unity que estés usando para compilar por si hubiese problemas de compatibilidad.

UNITY_2_6 Unity 2.6.x
UNITY_2_6_1 Unity 2.6.1
UNITY_3_0 Unity 3.0.x
UNITY_3_0_0 Unity 3.0.0
UNITY_3_1 Unity 3.1.x
UNITY_3_2 Unity 3.2.x
UNITY_3_3 Unity 3.3.x
UNITY_3_4 Unity 3.4.x
UNITY_3_5 Unity 3.5.x
UNITY_4_0 Unity 4.0.x
UNITY_4_0_1 Unity 4.0.1
UNITY_4_1 Unity 4.1.x
UNITY_4_2 Unity 4.2.x

Y por último decir que estos códigos se pueden combinar como en un if normal, como por ejemplo.

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour {
    void Start() {
        #if UNITY_STANDALONE_WIN && UNITY_STANDALONE_OSX
           //Código de windows y mac os x
        #elif UNITY_STANDALONE_LINUX
           //Código de linux
        #else
           //Código de otra plataforma
        #endif
    }
}

2 comentarios:

  1. Excelente, sigue así, el contenido de tu blog es de muy buen nivel, muchas gracias.

    ResponderEliminar
  2. gracia por tu conocimiento compartido,,y el tiempo
    DIOS este con vos

    ResponderEliminar