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

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

by Donal Sandro Noblejas Huaman

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 crecido 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 implica pérdidas financieras y de reputación. ¿Cómo puede ayudar el análisis estático con esto?

Introducción

 El artículo de hoy incluirá una descripción general de los errores en el código, pero el tema principal es una discusión de los problemas apremiantes en el campo del desarrollo de juegos. Principalmente hablaremos sobre desarrollo bajo Unity, pero muchos puntos son relevantes para programadores de otras áreas. Los temas principales serán el aumento del costo de los juegos, la reputación de las empresas de juegos y el análisis estático.

El costo de crear juegos.

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

En 2020, hubo un aumento del precio de un título AAA de $10. Anteriormente, el precio era de $60 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 está creciendo y en algunos incluso está cayendo. Si aumenta aún más el costo de los juegos, simplemente no se comprarán. Como resultado, dos escenarios son posibles:

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

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

Puede hacer una pregunta lógica: “¿Cuánto ha aumentado el costo de crear juegos?”. Para responderla, propongo recurrir a las estadísticas. Pude encontrar un cronograma de presupuestos de juegos hasta 2017. Estos datos excluyen los costos de marketing, es decir, solo se muestran los costos de desarrollo.

 puede ver que aproximadamente cada 10 años, el costo de desarrollo crece 10 veces. Y ahora los números 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 el costo de promoción del juego. Por lo general, los costos de marketing son menores o iguales a los costos de desarrollo. Pero incluso si dividimos el presupuesto total por la mitad, todavía obtenemos una gran cantidad.

Vale la pena señalar que el juego salió bastante crudo y tenía muchos errores. Creo que su presupuesto ya ha crecido bastante, dado que el juego ya lleva 2 años completo y se están preparando complementos para él. Esta actividad se denomina soporte posterior al lanzamiento. Es necesario para casi cualquier proyecto importante, porque ¿de qué sirve el juego si después del comienzo la mayoría de los jugadores lo abandonan? Esta etapa incluye la creación de contenido nuevo y la corrección de errores que no pudieron corregirse en la etapa de desarrollo principal.

Errores y errores

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

Por supuesto, esta frase se aplica no solo 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 y, de hecho, en cualquier programa serio. Y no todos son dioses perfectos, tienden a errar.

Los juegos modernos son enormes, por eso es muy difícil y costoso encontrar errores en ellos. Cada vez es más difícil para los desarrolladores trabajar: tienen que volver a trabajar y sacrificar varios aspectos del juego para completar el trabajo a tiempo.

Además, la corrección intempestiva de errores afecta a la reputación. Imagina que tu empresa lanzó un juego con muchos errores. Las personas están tan dispuestas que en mayor medida recuerdan lo malo. No desperdicie su reputación ganada con tanto esfuerzo en errores que podrían haberse evitado fácilmente.

Análisis estático

Los estudios de juegos modernos tienen todo 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 sus desarrolladores a encontrar varios problemas y defectos de seguridad en sus programas. ¿Por qué esperar hasta que aparezca el error para el reproductor cuando se puede solucionar mientras se escribe el código?

Alguien podría preguntar: “¿Cómo se correlaciona esto con el presupuesto, los precios y otras cosas?” Naturalmente, la búsqueda de errores ocurre durante las horas de trabajo, que deben ser pagadas. Cuando se utiliza el análisis estático, la búsqueda de defectos es mucho más rápida. Por lo tanto, el tiempo liberado puede usarse para llenar el mundo, crear nuevas mecánicas y otras cosas.

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

Una de las herramientas que realizan análisis estático es PVS-Studio. Tu, como persona involucrada en el desarrollo de este producto, les diré cuál es su uso para proyectos en Unity.

PVS-Studio tuvo varias mejoras especiales en el análisis de proyectos usando este motor de juego. Por ejemplo, agregando información sobre el comportamiento de los métodos de las clases populares de Unity. Esto ayuda a encontrar más errores en el código. 

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

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

¿Cómo usar PVS-Studio en Unity?

Para comenzar, ya debe tener el analizador instalado y la licencia ingresada. Si aún no lo has hecho, entonces esta página te ayudará .

Abre tu proyecto en Unity Hub. A continuación, haga clic en: Activos -> Abrir proyecto C#. Abrirá el IDE especificado en la configuración del editor de Unity. 

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

Ejemplos de errores

Sería un error escribir un artículo sobre la necesidad de usar análisis estático al desarrollar juegos y no dar 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 salida se puede encontrar en los espacios abiertos de Open Source. Para el análisis, tomé un juego simple de Unity: Card-Game-Simulator . Este proyecto será más que suficiente para demostrar cómo funciona el analizador.

Ejemplo 1

Actualización de vacío privado ()

{ ….

if (Inputs.IsSubmit && joinButton.interactuable) Join();

más si (Inputs.IsNew) Host();

de lo contrario si (Inputs.IsFocusBack) roomIdIpInputField.ActivateInputField();

de lo contrario si (Inputs.IsFocusNext) contraseñaInputField.ActivateInputField();

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

ScrollPage(Inputs.IsPageDown);

más si (Inputs.IsPageHorizontal && !Inputs.WasPageHorizontal) ToggleConnectionSource();

más si (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 booleano.

public static bool IsPageVertical => Math. Abs ( Input.GetAxis (PageVertical)) > Tolerancia;

Naturalmente, no hay ningún valor en el que esta condición sea verdadera. 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 se vea así:

Entradas .IsPageVertical && !Inputs.WasPageVertical

Ejemplo 2

private bool DecodeDict ()

{

while (bits necesarios > 0 ) {

int dictByte = entrada. pedacitos de vistazo ( 8 );

si (dictByte < 0 ) {

devuelve falso ; } aporte. Puntas de caída ( 8 ); leerAdler = (leerAdler << 8 ) | dictByte; bits necesarios -= 8 ; }

devuelve falso ; }

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

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

/// <summary>

/// Decodifica la suma de comprobación del diccionario después del encabezado deflate.

/// </summary>

/// <returns>

/// Falso si se necesita más entrada.

/// </returns>

privado bool DecodeDict ()

El comentario deja en claro que el método DecodeDict solo devuelve falso si no hay suficiente entrada. De hecho, el método siempre devuelve falso :). Puede ser que el método realmente nunca deba devolver verdadero, pero parece extraño y este comentario es engañoso.

Ejemplo 3

public override int PixelWidth {

get

{

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

try

{ Lock.EnterGdiPlus();

volver _gdiImage.Ancho; }

finalmente { Lock.ExitGdiPlus(); }

# endif

# si GDI && WPF

int gdiWidth = _gdiImage.Width;

int wpfWidth = _wpfImage.PixelWidth; Debug.Assert(gdiWidth == wpfWidth);

devuelve ancho de wpf;

# endif

# si WPF && !GDI

devuelve _wpfImage.PixelWidth;

# endif

# si NETFX_CORE || UWP

devuelve _wrtImage.PixelWidth;

# endif

# if __IOS__

return ( int )_iosImage.CGImage.Width;

# endif

# si __ANDROID__

devuelve _androidImage.Width;

# endif

# si PORTÁTIL

return PixelWidth; // <=

# endif

} }

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

El analizador ha detectado una potencial 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 el símbolo PORTABLE se define durante el ensamblaje, pero los otros símbolos de las directivas no, se producirá una recursividad infinita.

Ejemplo 4

public override bool Equals ( object obj )

{ Selector selector = obj as Selector;

si (obj == nulo )

devuelve falso ;

return _ruta == selector._ruta; ; }

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

El analizador ha detectado un posible error que podría dar lugar a un acceso por una referencia nula. Un objeto de la clase base se transformó en un derivado usando as. Si la conversión falla, el valor del selector se establecerá en nulo. En este caso, se comprueba si la variable del tipo base, obj, es nula. Así, al pasar una referencia a un objeto de tipo Selector o una referencia nula al método, no se lanzará ninguna excepción. De lo contrario, se lanzará una excepción. Por lo general, se espera que el método devuelva falso en este caso. Lo más probable es que sea la variable selectora la que deba comprobarse si es nula.

Ejemplo 5

PdfFormXObject interno (….): base ( este documento )

{ …. XPdfForm pdfForm = formulario;

// Obtener la página de importación

PdfPages importPages = importObjectTable.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

Aquí, no se utiliza el valor de retorno del método ImportPageNumberOutOfRange. Echémosle un vistazo:

public static string ImportPageNumberOutOfRange ( …. )

{

return String .Format( “La página no se puede importar del documento ‘{2}’,” +

” porque el número de página está fuera del rango. ” +

“El número de página especificado es {0},” +

” pero debe estar en el rango de 1 a {1}.” , ….); }

Se puede ver que el método devuelve un mensaje de error, que no se utiliza de ninguna manera. Tal descuido puede dificultar encontrar la causa del funcionamiento incorrecto del programa. Lo más probable es que con los valores pdfForm.PageNumber < 1 o pdfForm.PageNumber > importPages.Count, el código no debería haber ido más allá.

Ojo disculpe por los errores que pueda cometer bueno creo que la idea está puesta

Conclusión

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

También puede probar PVS-Studio en su proyecto. Quizás esto ayude a detectar problemas que se han ocultado a sus ojos durante la revisión y las pruebas.

Los estaré esperando

Autor Donal Sandro Noblejas Huaman

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