Tutorial de AGD 18: Optimiza tu código


Hemos empezado a escribir código en el editor de AGD, y a quisiera amploar las instrucciones que comentamos en un capítulo anterior

Me gustaría en esta ocasión compartir unas claves básicas antes de continuar con el juego en sí, sobre todo – pero no sólo – de optimización.

Orden, orden, orden

No hagas como yo, que escribí JBA al completo y no apunté para que usé cada variable, ahora me encuentro optimizando tanto para contarlo como para hacer alguna prueba de código y no se para que sirven todas las variables.

Me va a tocar tomar notas poco a poco para optimizarlo, pero tened por seguro que no me vuelve a pasar, lo mismo para los tipos de sprite, no apunte a que correspondía cada número y he de deducirlo caa vez mirando código.

Graba antes de tocar (y después)

En estos días tenemos una enorme ventaja, y es que podemos grabar snapshots continuamente desde nuestros emuladores.

Es fácil de hacer y además ocupa poco espacio, hazlo al menos:

  • Antes de tocar
  • Despues de consolidar una modificación
  • Antes de empezar tu sesión
  • Antes de parar y concluir tu sesión

Ojala hubiera seguido antes mi propio consejo, me hubiera evitao tener que repetir un juego casi al completo.

Piensa antes de hacer

Puede parecer de perogrullo, pero no pocos lios han sido resueltos pensando antes de tocar nada en el código, o al menos guadando antes de tocar para poder restaurar tras liarla parda.

Para aprender es bueno tocar y romper cosas, pero cuanto más complejo sea tu proyecto, tanto más importante es que lo hagas con cabeza, sabiendo donde vas y consolidando cada paso. Te evitarás muchos sustos.

Evita comprobar dos veces lo mismo

Estamos trabajando con un ordenador limitado en cuanto a velocidad y recursos, si en una máquina actual es importante (y profesional) evitar consumir recursos de más, en una de estas máquinas puede ser la diferencia entre un juego fluido y otro injugable.

Como ejemplo, os pongo el código del tipo de sprite 7 de JBA, la gota, básicamente la implementé creando un enemigo que rebota arriba y abajo, solo que cuando sube es invisible, y además no mata cuando no se ve.

Bien, fui torpe y comprobé PARAMA para ver si subimos o bajamos, y tras el movimento volvía a comprobar PARAMA para controlar si debe matar al jugador … absurdo consumo de ciclos de procesador y de valiosa memoria que se torna más necesaria cuanto más ambicioso es nuestro proyecto.

Cada cosa a su tiempo

Otra de esas “cuestiones imprescindibles” dentro el desarrollo retro, aquí no hay concurrencia, no hay objetos que se ejecutan siguiendo una planificación cuidadosa del sistema operativo, eres tú contra el procesador, no hay más.

Por ello es vital que coloques cada función en el punto que le corresponda, y que esta funcionalidad no impida la fluidez del juego.

Evita dejar código inútil

Sobre todo cuando hacemos pruebas, es habitual que nos puedan quedar flecos en forma de código que bien no se ejecuta o que aún ejecutándose no tiene funcion real.

Hemos de revisar regularmente el código para limpiar estas líneas residuales, por una parte para ahorrar memoria y ciclos de ejecución , por otro lado, la limpieza del código es clave para la mantenibilidad del mismo.

Truco: Eliminar el signo igual para ahorrar memoria

Puedes ganar bastantes bytes eliminando el signo igual en todas las instrucciones LET, en lugar de LET G = 1, usa LET G 1, funcionará igual y ahorrarás memoria.

Advertencia: Cuidado con los IF

Asegúrate de que compruebas cada IF y cada ELSE que escribas, sobre todo si contienen condicionales, a veces no fallan al compilar, pero tampoco funcionan como se espera, la regla general es: no escatimes bytes escribiendo esas condiciones y chequea con cuidado.

Sobre comparaciones en los IF

El IF en AGD no tiene todos los operadores de comparación. Es algo que no está documentado, y que el analizador de sintaxis no comprueba para indicarlo al usuario, pero lo compila mal, porque no existen como tal.

AGD solo entiende los siguientes operadores de comparación:

  • =
  • <>
  • <=
  • >

Por lo tanto cuidado, porque < y >= no existen para AGD y si los usas el >= causara que AGD dibuje como dos elementos independientes, y entenderá que son > e = por separado, con lo que dará como resultado una compilación ilógica.

En el caso de < directamente no lo acepta, y da error como tal

Un truco para verificar si el código pasa por determinados lugares es usar BORDER n. Si el borde cambia, es que esa parte se ha ejecutado.

Gracias a thE pOpE por la información detallada!

Precauciones al quitar el signo igual en funciones que se usan dentro de IF

Hay una excepción a la regla de no quitar los signos igual en los IF, pero que debe ser tratada con cuidado, como he dicho en general se debe poner el igual en todas las comprobaciones de variable por ejemplo IF A = 5, pero se puee obviar en caso de funciones, como por ejemplo IF KEY 2 o IF COLLISSION 0, chequea en cada caso por si no funcionara algún escenario que desconozca, pero puedes ahorrar algo más en esos escenarios.

* KEY y COLLISION no son variables, son funciones que devuelven un valor booleano y llevan un argumento, por eso no llevan = en un IF (IF KEY 2 , realmente sería como poner IF KEY(2) en otros lenguaje de más alto nivel), mi experiencia con eliminar el = en los IF es que parece fallar cuando se usa ELSE

thE pOpE

Concluyendo

Una vez que se domina, resulta relativamente sencillo escribir código con soltura, pero a veces el compilaor es algo caprichoso, póngase, por tanto, especial cuiado en estas cuestiones que he indicao.

Un pequeño IF que no se ejecuta tal cual aparenta hacerlo a primera vista, puede tenernos horas – incluso días – buscando un bug en apariencia irresoluble, no des nunca ningun IF por sentado en AGD.

Control de Versiones

VersiónFechaNotas
1.116 de Mayo de 2021Una serie de mejoras en los datos, funcionamiento interno y precisión del lenguaje aportada por Sergio ‘thEpOpE’ ¡Gracias!
1.08 de Junio de 2020Versión inidical del documento

¡Compártelo!

Ayudame a difundir este contenido a todo aquel que pueda sacarle partido, difundelo en redes, cuéntaselo a tus amigos, coméntalo en la cola del supermercado, además de aportar, ¡seguro que conoces a gente interesante y acabas uniéndose al bando rebelde!

Sígueme en Redes

Acelera mi progreso de la materia que te interesa.

El calendario y ritmo de publicaciones actualmente responde a mis necesidades de estudio y desarrollo de proyectos personales, si quieres invertir en que acelere alguna materia concreta, te ofrezco una posibilidad:

Puedes donar en mi paypal (paypal at metsuke.com), indicando la materia, por cada 25 euros donados, priorizaré un capítulo de la materia que me indiques que ya tenga escrito para que salga el proximo dia viable y disponible de lunes a viernes (en orden de llegada y a un post diario).

En caso de que el capítulo aún no exista, centraré mi atención en escribirlos y publicarlos con prioridad, pero no puedo prometer inmediatez.

De nuevo priorizaré las donaciones por orden de llegada pero cuando coincidan varias, iré rotando cada dia una para evitar la monopolización de mi foco de tareas.

Me reservo el fin de semana para priorizar lo que considere pertinente en el caso de que haya cola de entrega. Si te gusta el proyecto, ¡es un buen modo de apoyarme!

¿Te interesan mis servicios a título personal?

Puedo ofrecerte una amplia gama de productos y servicios en accesibilidad a través de mis partners, aunque quizá prefieras que lo haga yo personalmente…

En ese caso, puedes contactarme en mi correo r.carrillo@metsuke.com y cuéntame que necesitas, si lo que leo me gusta, te pongo en contacto con el comercial de mi empresa de consultoría.

Si quieres que sea yo expresamente quien te atienda, puedes indicármelo y llegamos a un acuerdo.

Advierto que esta última posibilidad te saldrá bastante más cara que hablar con mi equipo, pero si es lo que deseas, a tu disposición.

Un Abrazo.

Sobre las traducciones

Por el momento me he visto obligado a detener la traducción del contenido, apenas doy abasto a escribirlo (que es mi objetivo, ya que son mis apuntes de estudio), por lo que no parece tener sentido mantener activas unas traducciones que no doy abasto a crear.

En caso de que más adelante el flujo de caja me lo permita, es mi intención contratar servicios de traducción y editores que realicen la tarea, pero por ahora lo dejo desactivado.


Quizá te interese leer más sobre AGD

Dejar una Respuesta

XHTML: Usted puede usar las siguientes etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>