Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Pesos en juegos móviles

Iniciado por FranBarki, Octubre 26, 2018, 04:53:14 PM

Tema anterior - Siguiente tema
Hola buenos días
 
Sigo con mi proyecto para android y me surgieron un par de dudas que al juntarse con rumores me hicieron un lío.
 
La primera pregunta es cuanto peso tiene que tener mis sprites para la interfaz y si es más optimo crearla a partir de geometría con materiales ya que escuche que unity se comporta mejor con geometrías.
 
Segunda, como hacen algunos juegos de movil que pesan por ejemplo 66MB (apk) y al iniciarla empieza a descargar hasta llegar a pesar 898MB. Sera que el juego tu lo juegas en la nube o se hace por código direccionandote  a un línk.
 
Gracias

Primero de todo, una aclaración necesaria: Los archivos digitales no pesan, ocupan tamaño. 
 
 
 
1) Respondiendo ya a tu primera pregunta, todo es relativo ya que depende del dispositivo al que vaya dirigido. No especificas si lo quieres para un móvil por 1GB de RAM, o un Samsung Galaxy de los nuevos, etc...
 
Te interesa que los gráficos ocupen lo menos posible en memoria y en disco, lo que se traduce en usar formatos con compresión compatibles con el chip gráfico del móvil, tamaños pequeños, imágenes de proporción cuadrada y de tamaños en potencia de 2 ( 256x256, 512x512, 1024x1024...). Lo importante es que trates de no abusar de los sprites con transparecias, ya que es de las cosas que más impactan al rendimiento.
 
Un ejemplo típico para portar a móviles Android, es usar imágenes en formato ETC1 ó ASTC, tener casi toda la interfaz empaquetada en una única (o muy pocas) imagen grande de 1024x1024, y, en caso de usar sprites con alpha, separarlo todo en 2 sprites ATLAS:
 

  •    Uno para empaquetar todos los gráficos y sprites SIN transparencias (opacos).


  •    Otra imagen por separado para empaquetar sólo los gráficos CON transparencias/alpha. De esta forma, el Canvas de Unity3D no tiene que realizar operaciones adicionales y todo carga más rápido.


Adicionalmente, para mostrar paneles y cajas de diálogo, es muy recomendable hacer uso de los sprites '9-slice', o partidos en 9 trozos. Son esos que te permiten escala el gráfico manteniendo las proporciones de los bordes de dicho sprite. De esta forma, puedes crear paneles extra-grandes usando una simple imagen cuadrada que haga 32x32 píxeles, o así...
 
 
 
2) Usan Assets descargables, mediante el uso de los llamados AssetBundles. Es una característica de Unity3D que requiere que entiendas el uso y la gestión de dichos Assets. Hay varias guías por Internet que te enseñan a hacerlo. Los bundles se definen desde Unity y se "exportan" a packs (parecido a .unitypackage) que se suben por separado al servidor o tienda. Luego desde código se llama a recuperarlos mediante una rutina, y el motor los descarga,etc. Hay que tener cuidado de gestionarlos correctamente, ya que de lo contrario se van acumulando y pueden acabar por corromper tu juego.
 
 

Muchísimas gracias me has dado una buena visión ahora investigare.

Octubre 31, 2018, 03:55:19 AM #3 Ultima modificación: Octubre 31, 2018, 03:58:47 AM por J Montes
Cita de: FranBarki date=1540565594Segunda, como hacen algunos juegos de movil que pesan por ejemplo 66MB (apk) y al iniciarla empieza a descargar hasta llegar a pesar 898MB. Sera que el juego tu lo juegas en la nube o se hace por código direccionandote  a un línk.
   


Como te indica  @pioj, los AssetBundles de Unity son una forma cómoda de descargar assets. Unity te da herramientas para descargarlos, cachearlos y cargarlos en el juego (instanciados como cualquier otro prefab).
 
Puedes hacerlo de otras formas, pero es más manual. Yo descargo imágenes y datos a través de HTTP, usando la clase WWW. Las imágenes se pueden importar como texturas o sprites, usando Sprite.Create y la propiedad .texture del objeto WWW:
 

Sprite image = Sprite.Create(www.texture, Rect.MinMaxRect(0, 0, www.texture.width, www.texture.height), new Vector2(1, 1));

 
Puedes descargar cualquier archivo, al final son datos que puedes usar para construir geometría desde código, para formar imágenes, audio... Depende de tus necesidades. Durante el juego, Unity te permitirá cargar fácilmente sprites y audio. Pero no puedes importar, en tiempo de ejecución, un modelo 3D .obj o un SVG, o cargar un .prefab de Unity como si estuvieras dentro del editor... en este caso deberías utilizar AssetBundles.
 
En cualquier caso, si estás descargando contenido deberías cachearlo en el dispositivo (usando AssetBundles esto se facilita bastante), y ahí es cuando crece el tamaño. Cachear es por supuesto necesario, pero hay que gestionar esa cache para que no crezca demasiado.
 
Puedes escribir contenido al almacenamiento del teléfono usando algo como:
 

                if (www.bytes != null) {
                    Debug.Log("Writing file to persistent storage: " + path);
                    CreateFolders("cache/" + path);
                    System.IO.File.WriteAllBytes(Application.persistentDataPath + "/cache/" + path, www.bytes);
                }

 
Y para acceder a los archivos cacheados, se puede por ejemplo usar la misma clase WWW con un esquema de tipo file:
 

string urlCache = "file://" + Application.persistentDataPath + "/cache/" + path;
www = new WWW(urlCache, null, headers);
yield return www;

 
Recuerda que la propia clase WWW cachea sus descargas también, pero en este caso, no puedes controlar cuándo se borran.
 
Por último, la clase WWW puede dar problemas en Android, se comporta diferente en WebGL, y no soporta compresión (al menos no en todos los dispositivos que yo epa).
 
Y hay más alternativas, como usar WebRequest (Unity), Websockets... Pero normalmente, los AssetBundles son lo más cómodo.

Etiquetas: