Portada » ¿Por qué los desarrolladores de juegos de Unity deberían utilizar el análisis estático?

¿Por qué los desarrolladores de juegos de Unity deberían utilizar el análisis estático?

by Donal Sandro Noblejas Huaman

Sandro Noblejas Huamán 

Hola mi nombre Donal Sandro Noblejas Huaman de Lima Perú y hoy vengo con un nuevo artículo y como siempre y en cada uno de ellos completamente sólo sin familiares o empresas que me ayuden o persona alguna cuidado con los estafadores siempre eh dicho. Bueno ahí vamos.

A lo largo de los años, el costo de crear juegos ha aumentado, su escala ha aumentado y, por lo tanto, su base de código también ha crecido. Cada vez es más difícil para los desarrolladores realizar un seguimiento de los errores. Un juego con errores conlleva pérdidas financieras y de reputación. ¿Cómo puede ayudar el análisis estático con esto?

Introducción

Cómo comprobar proyectos y analizar sus errores. El artículo de hoy también incluirá una descripción general de los errores en el código, pero el tema principal es una discusión sobre los problemas urgentes en el campo del desarrollo de juegos. Hablaremos principalmente sobre desarrollo para Unity, pero muchos puntos también son relevantes para programadores de otras áreas. Los temas principales serán el aumento del coste de los juegos, la reputación de las empresas de juegos y el análisis estático.

Costo de crear juegos.

El costo del desarrollo de juegos aumenta cada año. Como resultado, los propios juegos se vuelven más caros. Averigüemos por qué sucede esto.

En 2020, el precio de un título AAA aumentó en 10 dólares. Anteriormente, el precio era de 60 dólares y se formó en la década de 2000. Naturalmente, los estudios de juegos entienden que en muchos países el poder adquisitivo de las personas no aumenta y en algunos incluso disminuye. Si subes aún más el precio de los juegos, la gente simplemente no los comprará. Como resultado, son posibles dos escenarios:

  • El precio de los juegos sigue subiendo. Esto afectará la cantidad de copias vendidas;
  • el precio se deja en el mismo nivel o se aumenta ligeramente. En este caso, la calidad se verá afectada, porque las empresas no operarán con pérdidas.

Entonces, ¿por qué los presupuestos de los juegos crecen año tras año? Para responder a esta pregunta, debes preguntarte: “¿Compraría un juego que no sea diferente al del año pasado?” Creo que muchos responderían “no”. Los desarrolladores se ven obligados a hacer juegos cada vez más grandes para sorprender a los jugadores.

Se podría hacer una pregunta lógica: “¿Cuánto ha aumentado el costo de crear juegos?” Para responder a esto, sugiero recurrir a las estadísticas. Pude encontrar una tabla de presupuestos de juegos hasta 2017. Estos datos excluyen los costos de marketing, lo que significa que solo se muestran los costos de desarrollo.

En el gráfico anterior se puede ver que aproximadamente cada 10 años el costo de desarrollo crece 10 veces. Además, en la actualidad las cifras son bastante impresionantes. Por cierto, hay un ejemplo reciente interesante.

Tomemos como ejemplo el famoso Cyberpunk 2077, que tuvo un presupuesto aproximado de 313 millones de dólares . Esta cifra incluye los costos de promoción del juego. Normalmente, los costos de marketing son menores o iguales a los costos de desarrollo. Pero incluso si dividimos el presupuesto total a la mitad, seguiremos obteniendo una cantidad enorme.

Vale la pena señalar que el juego era bastante tosco y tenía muchos errores. Creo que su presupuesto ya ha crecido bastante, considerando que el juego ya lleva 2 años finalizándose y se están preparando adiciones para él. Este tipo de actividad se denomina soporte posterior al lanzamiento. Es necesario para casi cualquier proyecto grande, porque ¿de qué sirve el juego si la mayoría de los jugadores lo abandonan después del comienzo? Esta etapa incluye la creación de contenido nuevo y la corrección de errores que no se pudieron solucionar durante la etapa de desarrollo principal.

Hablando de errores…

Errores y errores

¿Puedes recordar al menos un juego con errores? Sí, todos los juegos tienen errores.

Por supuesto, esta frase se aplica no sólo a los juegos, sino también a cualquier otro proyecto. Es imposible crear un producto grande y complejo que no contenga errores. Cientos de personas pueden trabajar en un juego o incluso en cualquier programa serio. Y no todos ellos son dioses perfectos; tienden a cometer errores.

Los juegos modernos son enormes, lo que hace que sea muy difícil y costoso encontrar errores en ellos. A los desarrolladores les resulta cada vez más difícil trabajar, teniendo que trabajar demasiado y sacrificar varios aspectos del juego para poder completar el trabajo a tiempo.

Además, la corrección inoportuna de errores afecta la reputación. Imagine que su empresa ha lanzado un juego que tiene muchos errores. Las personas están diseñadas de tal manera que recuerdan en mayor medida las cosas malas. No deberías desperdiciar tu reputación, que con tanto esfuerzo se gana, en errores que podrían haberse evitado fácilmente.

Por ejemplo, el equipo de PVS-Studio hace esto, verificando proyectos de código abierto. 

Análisis estático

Los estudios de juegos modernos tienen un arsenal de tecnologías para simplificar el desarrollo. Uno de ellos es el análisis estático. Esta metodología para encontrar posibles errores en el código fuente puede ayudar a los estudios y a sus desarrolladores a encontrar diversos problemas y defectos de seguridad en sus programas. ¿Por qué esperar a que un jugador descubra un error si se puede solucionar mientras se escribe el código?

Alguien podría preguntar: “¿Cómo se correlaciona esto con el presupuesto, los precios, etc.?” Naturalmente, la búsqueda de errores se produce en horario laboral, por lo que hay que pagar. Cuando se utiliza el análisis estático, encontrar defectos es mucho más rápido. Por lo tanto, el tiempo liberado se puede utilizar para llenar el mundo, crear nuevas mecánicas y más.

Vale la pena señalar que la mayoría de los errores cometidos por los desarrolladores de juegos no se diferencian de los errores de los desarrolladores de otros campos de actividad. Esto se puede entender, por ejemplo, en los  juegos de código abierto. Siempre hay lugares sospechosos en estos proyectos. Por tanto, el análisis estático será útil para todos los programadores.

Una de las herramientas que realiza análisis estático es PVS-Studio. ,les diré cuáles son sus beneficios para los proyectos de Unity.

PVS-Studio tuvo varias mejoras especiales en el análisis de proyectos que utilizan este motor de juego. Por ejemplo, agregando información sobre el comportamiento de métodos de clases populares de Unity. 

PVS-Studio también tiene en cuenta otras características de este motor. Por ejemplo, Unity proporciona una implementación inusual del operador ‘==’ para tipos que heredan de la clase UnityEngine.Object .

Con la ayuda de PVS-Studio, podras encontrar una serie de rarezas en el código de Unity. 

¿Cómo utilizar PVS-Studio en Unity?

Para comenzar, ya debes tener el analizador instalado y una licencia ingresada. Si aún no lo has hecho, esta página te ayudará con esto .

Abra su proyecto en Unity Hub. A continuación, haga clic en: Activos -> Abrir proyecto C#. Verá el IDE especificado en la configuración del editor de Unity. Se indica aquí:

Usaré Visual Studio 2022. Para analizar el proyecto en esta versión del IDE, puede usar el elemento del menú Extensiones -> PVS-Studio -> Verificar -> Solución.

Puede leer más sobre el uso del analizador aquí .

Ejemplos de errores

Sería incorrecto escribir un artículo sobre la necesidad de utilizar análisis estático al desarrollar juegos y no proporcionar ejemplos de errores encontrados por el analizador. Desafortunadamente, muchos juegos grandes y populares son de código cerrado. Así, no podremos comprobar la calidad del código de juegos como Ori and the Blind Forest, Superhot, Beat Saber, Rust, Firewatch y otros. La solución se puede encontrar en los espacios abiertos del Open Source. Para el análisis, tomé un juego simple en Unity: Card-Game-Simulator . Este proyecto será más que suficiente para demostrar cómo funciona el analizador.y cómo sabrán pido disculpas por mis propios errores pero es la idea uno no puede hacer tanto a la vez 😔

Ejemplo 1

private void Update()

{

  ….

  if (Inputs.IsSubmit && joinButton.interactable)

    Join();

  else if (Inputs.IsNew)

    Host();

  else if (Inputs.IsFocusBack)

    roomIdIpInputField.ActivateInputField();

  else if (Inputs.IsFocusNext)

    passwordInputField.ActivateInputField();

  else if (Inputs.IsPageVertical && !Inputs.IsPageVertical) // <=

    ScrollPage(Inputs.IsPageDown);

  else if (Inputs.IsPageHorizontal && !Inputs.WasPageHorizontal)

    ToggleConnectionSource();

  else if (Inputs.IsCancel)

    Close();

}

V3022 La expresión ‘Inputs.IsPageVertical &&!Inputs.IsPageVertical’ siempre es falsa. Probablemente el ‘||’ El operador debe usarse aquí. LobbyMenu.cs 159

El analizador informa que la expresión Inputs.IsPageVertical && !Inputs.IsPageVertical siempre es falsa. IsPageVertical es una propiedad que devuelve un valor bool .

public static bool IsPageVertical =>

  Math.Abs(Input.GetAxis(PageVertical)) > Tolerance;

Naturalmente, no existe ningún valor en el que esta condición sea cierta. Al mismo tiempo, justo debajo hay una expresión con propiedades similares. Después de mirarlos, queda claro que hay un error tipográfico en el lugar indicado por el analizador.

Lo más probable es que la condición debería verse así:

Inputs.IsPageVertical && !Inputs.WasPageVertical

Ejemplo 2

private bool DecodeDict()

{

  while (neededBits > 0)

  {

    int dictByte = input.PeekBits(8);

    if (dictByte < 0)

    {

      return false;

    }

    input.DropBits(8);

    readAdler = (readAdler << 8) | dictByte;

    neededBits -= 8;

  }

  return false;

}

V3009 Es extraño que este método siempre devuelva el mismo valor de “falso”. Inflador.cs 288

PVS-Studio señala que este método siempre devuelve false . Si miramos el código, podemos ver que solo hay dos devoluciones y ambas devuelven false . Vale la pena señalar que hay un comentario antes de la declaración del método:

/// <summary>

/// Decodes the dictionary checksum after the deflate header.

/// </summary>

/// <returns>

/// False if more input is needed.

/// </returns>

private bool DecodeDict()

El comentario deja claro que el método DecodeDict devuelve falso sólo si no hay suficientes datos de entrada. De hecho, el método siempre devuelve falso :). Puede ser cierto que el método nunca debería devolver true , pero eso parece extraño y el comentario es engañoso.

Ejemplo 3

public override int PixelWidth

{

  get

  {

#if (CORE_WITH_GDI || GDI) && !WPF

    try

    {

      Lock.EnterGdiPlus();

      return _gdiImage.Width;

    }

    finally { Lock.ExitGdiPlus(); }

#endif

#if GDI && WPF

    int gdiWidth = _gdiImage.Width;

    int wpfWidth = _wpfImage.PixelWidth;

    Debug.Assert(gdiWidth == wpfWidth);

    return wpfWidth;

#endif

#if WPF && !GDI

    return _wpfImage.PixelWidth;

#endif

#if NETFX_CORE || UWP

    return _wrtImage.PixelWidth;

#endif

#if __IOS__

    return (int)_iosImage.CGImage.Width;

#endif

#if __ANDROID__

    return _androidImage.Width;

#endif

#if PORTABLE

    return PixelWidth;                    // <=

#endif

  }

}

V3110 Posible recursividad infinita dentro de la propiedad ‘PixelWidth’. XBitmapSource.cs 97

El analizador detectó una posible recursividad infinita. El descriptor de acceso get contiene varias directivas de preprocesador #if y en la última la propiedad se refiere a sí misma. Si durante el ensamblaje se define el símbolo PORTABLE , pero no se definen otros símbolos de las directivas, se producirá una recursividad infinita.

Ejemplo 4

public override bool Equals(object obj)

{

  Selector selector = obj as Selector;

  if (obj == null)

    return false;

  return _path == selector._path; ;

}

V3019 Posiblemente una variable incorrecta se compara con nula después de la conversión de tipo utilizando la palabra clave ‘as’. Verifique las variables ‘obj’, ‘selector’. PdfFormXObjectTable.cs 217

El analizador ha detectado un posible error que podría provocar que se acceda a una referencia nula. El objeto de clase base se deriva usando as . Si la conversión falla, el valor del selector se establecerá en nulo . En este caso , se comprueba que la variable del tipo base, obj, sea igual a null . Por lo tanto, al pasar una referencia a un objeto de tipo Selector o una referencia nula a un método, no se generará una excepción. En otros casos, se lanzará una excepción. Normalmente, se esperaría que el método devolviera false en este caso . Lo más probable es que sea la variable selectora la que se debe verificar para verificar su igualdad con null .

Ejemplo 5

internal PdfFormXObject(….): base(thisDocument)

{

  ….

  XPdfForm pdfForm = form;

  // Get import page

  PdfPages importPages = importedObjectTable.ExternalDocument.Pages;

  if (   pdfForm.PageNumber < 1

      || pdfForm.PageNumber > importPages.Count)

  {

    PSSR.ImportPageNumberOutOfRange(pdfForm.PageNumber, 

                                    importPages.Count,

                                    form._path);

  }

  PdfPage importPage = importPages[pdfForm.PageNumber – 1];

  ….

}

V3010 Se requiere utilizar el valor de retorno de la función ‘ImportPageNumberOutOfRange’. PdfFormXObject.cs 99

El valor de retorno del método ImportPageNumberOutOfRange no se utiliza aquí . Echemos un vistazo:

public static string ImportPageNumberOutOfRange(….)

{

  return String.Format(“The page cannot be imported from document ‘{2}’,” +

    ” because the page number is out of range. ” +

    “The specified page number is {0},” +

    ” but it must be in the range from 1 to {1}.”, ….);

}

Se puede ver que el método devuelve un mensaje de error que no se utiliza de ninguna manera. Un descuido de este tipo puede dificultar la búsqueda del motivo del mal funcionamiento del programa. Lo más probable es que con los valores pdfForm.PageNumber < 1 o pdfForm.PageNumber > importPages.Count la ejecución del código no debería haber avanzado más.

Conclusión

En resumen, podemos decir que desarrollar juegos es cada vez más difícil y caro. Por lo tanto, los desarrolladores deben utilizar varias herramientas que ayudarán a mejorar la calidad del código y reducir el costo de encontrar errores. El analizador estático PVS-Studio puede convertirse en su fiel compañero a la hora de crear un nuevo juego.

Me interesaría saber tu opinión sobre este tema. ¿Quizás eres desarrollador de juegos y ya utilizas el análisis estático? En general, los invito a comentar para discutir.

También puedes probar PVS-Studio en tu proyecto. Quizás esto le ayude a descubrir problemas que estuvieron ocultos a su vista durante la revisión y las pruebas.

Los estaré esperando

Autor Donal Sandro Noblejas Huaman

Lima Perú 🇵🇪

¿Por qué acudir a una editorial? Sobre los derechos de juego, dinero y cooperación

https://www.linkedin.com/pulse/por-qu%C3%A9-acudir-una-editorial-sobre-los-derechos-de-y-noblejas-huaman?trk=public_profile_article_view

Cómo saber si un juego va a ser un éxito o por qué un editor necesita un prototipo

https://www.linkedin.com/pulse/c%C3%B3mo-saber-si-un-juego-va-ser-%C3%A9xito-o-por-qu%C3%A9-editor-noblejas-huaman?trk=public_profile_article_view

animador en gamedev: para aquellos que quieren animar en Spine

https://es.linkedin.com/pulse/c%C3%B3mo-convertirse-en-animador-gamedev-para-aquellos-noblejas-huaman?trk=portfolio_article-card_title

programas para gamedev

https://es.linkedin.com/pulse/programas-para-gamedev-donal-sandro-noblejas-huaman?trk=portfolio_article-card_title

Gamedev (desarrollador de juegos) para comenzar

https://es.linkedin.com/pulse/gamedev-desarrollador-de-juegos-para-comenzar-noblejas-huaman?trk=portfolio_article-card_title

¿Qué hace un guionista de juegos y por qué es necesario en el desarrollo de juegos?

https://es.linkedin.com/pulse/qu%C3%A9-hace-un-guionista-de-juegos-y-por-es-necesario-en-donal-sandro?trk=portfolio_article-card_title

Redes neuronales no reemplazarán a los escritores en el corto plazo, pero el tiempo corre

https://es.linkedin.com/pulse/redes-neuronales-reemplazar%C3%A1n-los-escritores-en-el-noblejas-huaman?trk=portfolio_article-card_title

Generos gráficos de juegos

https://es.linkedin.com/pulse/generos-gr%C3%A1ficos-de-jue-donal-sandro-noblejas-huaman?trk=portfolio_article-card_title

¿Por qué los desarrolladores de juegos de Unity deberían usar el análisis estático?

https://es.linkedin.com/pulse/por-qu%C3%A9-los-desarrolladores-de-juegos-unity-deber%C3%ADan-noblejas-huaman?trk=portfolio_article-card_title

“Un diseñador de juegos es siempre un jugador”  – verlista

https://es.linkedin.com/pulse/un-dise%C3%B1ador-de-juegos-es-siempre-jugador-verlista-noblejas-huaman-1c?trk=portfolio_article-card_title

Diseñador 3D: quién es, a qué se dedica y cómo convertirse en uno – verlista

https://es.linkedin.com/pulse/dise%C3%B1ador-3d-qui%C3%A9n-es-qu%C3%A9-se-dedica-y-c%C3%B3mo-en-uno-noblejas-huaman?trk=portfolio_article-card_title

diseñador de juegos y cómo convertirse en uno? – verlista

https://es.linkedin.com/pulse/qu%C3%A9-hace-un-dise%C3%B1ador-de-juegos-y-c%C3%B3mo-convertirse-en-donal-sandro?trk=portfolio_article-card_title

Mecánica, jugabilidad, dinámica: cómo funciona la jugabilidad en los juegos. – verlista

https://es.linkedin.com/pulse/mec%C3%A1nica-jugabilidad-din%C3%A1mica-c%C3%B3mo-funciona-la-en-los-donal-sandro-1c?trk=portfolio_article-card_title

arte en GameDev, que son y que necesitas saber – verlista

https://es.linkedin.com/pulse/especialidades-de-arte-en-gamedev-que-son-y-necesitas-donal-sandro-1c?trk=portfolio_article-card_title

Por qué no puede encontrar un entorno universal que a todos les encante(gamers) – verlista

https://es.linkedin.com/pulse/por-qu%C3%A9-puede-encontrar-un-entorno-universal-que-les-noblejas-huaman-1c?trk=portfolio_article-card_title

¿Qué hace un analista de juegos y cómo convertirse en uno? – verlista

https://es.linkedin.com/pulse/qu%C3%A9-hace-un-analista-de-juegos-y-c%C3%B3mo-convertirse-en-noblejas-huaman-1c?trk=portfolio_article-card_title

un probador de juegos: probadores principiantes – verlista

https://es.linkedin.com/pulse/c%C3%B3mo-convertirse-en-un-probador-de-juegos-probadores-noblejas-huaman-1c?trk=portfolio_article-card_title

Por qué Unreal Engine 4 es uno de los mejores motores para trabajar en juegos – verlista

https://es.linkedin.com/pulse/por-qu%C3%A9-unreal-engine-4-es-uno-de-los-mejores-motores-donal-sandro-1c?trk=portfolio_article-card_title

Artistas 2D y sus especialidades – verlista

https://es.linkedin.com/pulse/artistas-2d-y-sus-especialidades-verlista-noblejas-huaman-1c?trk=portfolio_article-card_title

You may also like

Leave a Comment

Are you sure want to unlock this post?
Unlock left : 0
Are you sure want to cancel subscription?
-
00:00
00:00
Update Required Flash plugin
-
00:00
00:00