Jump to content
Sign in to follow this  
  • entries
    5
  • comments
    0
  • views
    341

ScriptableObject - Parte 1

francoe1

105 views

Cuando nuestros proyectos empiezan a crecer un error común es duplicar la información, ¿de qué manera? instanciando componentes.

Pensemos un escenario donde instanciamos 20 veces el siguiente componente.

public class BulletBehaviour : MonoBehaviour
{
    public Texture2D Texture;
    public LayerMask CollisionMask;
    public AnimationCurve CurveSpeed;
    public string String1 = "ABCDE";
    public int Int1 = 15600;
    public string[] StringArray = new string[] { "A", "B", "AB", "CD", "oisisisiisisis" };
}

Como resultado estaríamos clonando en memoria 20 veces los mismo valores, ahora supongamos que son 2000 objetos y cada uno está consumiendo 3000 bytes tendríamos como resultado un consumo de 6MB.

Unity nos ofrece una solución que se adapta perfectamente al motor, esto nos permite desacoplar la información manteniendo el mismo workflow, estoy hablando de ScriptableObject, esta esta pensada para evitar repetir información en runtime. La lógica es simple, para cada bloque de información se crea un activo que luego puede ser utilizado como referencia desde cualquier componente en escena. También, utilizando esta característica logramos centralizar la información lo cual es muy importante a la hora de desarrollar cualquier tipo de aplicación.

 


Implementación

Es importante tener en mente que un ScriptableObject es un activo, esto quiere decir que las alteración nos son persistentes fuera del editor. Para esta implementación intentaremos mejorar BulletBehaviour.

  1. Programamos nuestro ScriptableObject
    [CreateAssetMenu(fileName = "BulletInfo", menuName = "BulletInfo")]
    public class BulletInfoSO : ScriptableObject
    {    
        public Texture2D Texture;
        public LayerMask CollisionMask;
        public AnimationCurve CurveSpeed;
        public string String1 = "ABCDE";
        public int Int1 = 15600;
        public string[] StringArray = new string[] { "A", "B", "AB", "CD", "oisisisiisisis" };
    }

     

  2. Creamos un activo de BulletInfoSO
    image.png
  3. Asignamos los valores.
    image.png

Ahora crearemos una versión optimizada de BulletBehaviour para realizar las pruebas de rendimiento.

public class BulleOptimizedBehaviour : MonoBehaviour
{
    public BulletInfoSO Info;
}

Como se puede apreciar, en la versión optimizada solo tendríamos una referencia al activo, esto implica que para cada instancia de BulletOptimizedBehaviour solo existiria 1 o las posibles variantes de BulletInfoSO.

 


Pruebas de Rendimiento

5.000 Bullet vs 5.000 BulletOptimized

image.png

image.png

50.000 Bullet vs 50.000 BulletOptimized

image.png

image.png

Con estos dos ejemplos se puede apreciar que el consumo de los objetos sin la implementación de monobehaviour consumen aproximadamente el doble, hay que tener en cuenta que este ejemplo es muy simple, esto quiere decir que en producción unos cientos de objetos podrían ocupar 100mb y con miles estaríamos hablando de gigas.

La ventajas de desacoplar la información del componente es que centralizamos y optimizamos el uso de la memoria.

 



0 Comments


Recommended Comments

There are no comments to display.

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...