@ agnasg

Bryan Cranston cambiando un bombillo

02-02-2016 8:25 AM

Anoche me sentí como Bryan Cranston cambiando un bombillo.  La actividad en mi lista decía:

01-02-16 · (P) Variables handling (cont’d)

La (P) significa que es una task pendiente. Se refiere al manejo de variables para el control del flujo en el script de dialogos de los npcs. Está desde el 29-01 apareciendo sin misericordia. El problema es que esto implica corregir una y otra vez el parser. Lo que genera que esté cargando una y otra vez el juego. Pero me dí cuenta que ahora estaba cargando más lentamente que nunca. Además el fps estaba bajando de 126 a 62 cuando paso al lado de un npc. Me acordé que estuve  modificando la librería de irrlicht, para lo que generé un nuevo dll con un tamaño de 5mb, el original tenía 2mb, esto resolvió el problema del frame rate, pero todavía al pasar al lado de un npc hay un descenso significativo del fps. Así que comencé a revisar todo el game loop para ver si había algo inusual cuando nos acercamos a un npc (claro que lo hay). Así aquí estaba en eso cuando debería estar implementando el manejo de variables, y ahora hoy amaneció otra vez!

02-02-16 · (P) Variables handling (cont’d)

Bryan Cranston cambiando un bombillo:

¿Quieres perder el tiempo? Optimiza antes de tiempo

25-01-2016 7:14 AM

¿Quieres perder el tiempo?  Porque así se pierde el tiempo. Algunos programadores (yo incluído) tenemos la tendencia a hacer sutiles cambios al código, bien por optimización o por elegancia.

psyblast utiliza irrlicht, que como todo motor/framework viene con su propia libreria que intenta sustituir a la Standard template library. Qt también hace lo mismo con resultados mixtos. psyblast tiene soporte multilenguaje por lo que los textos son utf8. Desde hace años yo hago lo siguiente para pasar de iso-8859-1 (o latin 1 o lo que sea) a utf8:

std::string stext="Un string soñado con un hálito de común sin sentido amén de sin razón"
wchar_t wtmpbuf[2048];
mbstowcs (wtmpbuf, stext.c_str(), 2048);

se me ocurrió optimizarlo a:

wchar_t wp = stringw(stext.c_str()).c_str());

donde stringw es un typedef a core::irr::string. Profundo en los cambios que estuve haciéndo en el engine quedó ese cambio, inocente y sin ser testeado suficientemente. El viernes descubrí que los paneles de conversación no estaban desplegando los acentos y las ñ’s. Luego de revisar el font, SQLite, todas las funciones involucradas, finalmente como un acto desesperado se me ocurrió que quizás stringw () tenía algo que ver… 4 horas después. ¿Quieres perder el tiempo?  Porque así se pierde el tiempo. La ingeniería de software tiene toda una serie de reglas para evitar que esto pase… famosas últimas reglas.

No existe tal cosa llamada “la parte fácil”

23-01-2016 6:13 AM

“He estado en la industria 8 años y estoy completamente de acuerdo. Hacer un juego es la parte fácil, hacerlo exitoso es mucho más difícil.” (“Been in the industry for 8 years and I fully agree with you. Making a game is actually the easy part, making it successful is far more difficult.” tomado de esta conversación).  No es que me molesten las opiniones de las personas que no saben de lo que están hablando. Toda opinión tiene potencialmente pertinencia o algo de realidad, así sea accidentalmente sin que su dueño sepa por qué. Pero hay ciertas opiniones que me parecen tan equivocadas que no me puedo quedar callado. Y particularmente aquéllas que se refieren a decir cuál parte del trabajo es fácil. En lo que a mi concierne, no hay parte fácil. Todo es difícil. O todo es fácil, depende de lo pesimista/optimista que seamos. En este caso, el error inclusive es tratar de separar en segmentos dos elementos que no se pueden separar. Hacer el juego y hacer que sea exitoso no son dos objetivos diferentes: uno condiciona al otro. O uno está atado al otro. Se puede justificar diciendo que el mercadeo puede fallar, que el mensaje no llegó a la audiencia correcta. Yo creo que un juego exitoso lo es tenga o no un buen mercadeo, o sea visible o no. Nadie encuentra accidentalmente Flappy Bird escondido en Steam y se pregunta porque nadie lo conoce. Claro este es un buen ejemplo en varios niveles: Flappy Bird de hecho pasó desapercibido varios meses. Pero eventualmente llegó a la cúspide. Lo que pasó después fue otra historia.

Por eso los perfeccionistas (incluyéndome) se quedan en un ciclo infinito agregando y modificando características. La recomendación número uno en la lista de un item en el negocio de desarrollar juegos es “publica el maldito juego” pero justamente no hay nada que pueda matar más fácilmente un video juego que publicarlo antes de tiempo (¿Warhammer Online?). ¿Quieres destruir tu juego? Porque así es como se destruye un juego: publícalo inacabado y ni la más formidable campaña de mercadeo lo hará superar una recepción negativa.

En general no es fácil. Es como cuando “la gente” me mira con sospecha porque digo que trabajo freelancer: “¿ conque ahora te das la gran vida, verdad?” me dicen en la creencia de que freelancer es sinónimo de trabajar en pantuflas un par de horas al día. Hoy estoy levantando desde las 3:30 a.m. Ya he pasado horas hablando con clientes y trabajando 3 proyectos, incluyendo psyblast. No hay trabajo fácil, todos los trabajos son difíciles, cualquiera sea su modalidad. Así que si no sabes de lo que estás hablando, sí, cierra el pico. La gente llegará inclusive a creer que eres inteligente.

¿Debo usar C o C++ para el motor de mi juego?

21-01-2016 4:56 AM

La respuesta rápida es C++, aunque la pregunta es inválida, porque si quieres hacer un juego no deberías estar programando ningún motor, sino utilizar cualquiera de los framework disponibles. La pregunta es el título de este largo artículo, que me tomé la molestia de leer. Para mi sorpresa la conclusión es que es mejor C porque C++ es muy lento para compilar, y que interrumpe el ciclo de Observar un bug -> Detener el juego -> Corregir -> Compilar -> Probar el juego -> Repetir si necesario (el autor insiste que la conclusión es algo más complicado que eso. Sí, siempre es más complicado)

Además al parecer en la experiencia del autor C++ es lento, genera tantos crashes (caídas del juego) como C y por alguna razón necesita tener control del manejo de la memoria. Minimizar el uso de librerías adicionales por alguna razón es una meta adicional.

Mi experiencia me indica exactamente ir en dirección contraria:

  • C++ es más rápido que C porque me permite desarrollar más rápido. En relación al tiempo de ejecución la diferencia es indistinguible porque mi audiencia son jugadores experimentados quienes al menos tienen un i3 y una tarjeta gráfica decente.
  • Como C++ me permite escribir código más robusto C++ genera definitivamente menos crashes que C (aunque si eres un programador medianamente competente como lo tienes que ser para poder ser un programador de juegos, tu juego no debería tener crashes . Por favor.)
  • Yo no quiero saber nada de manejo de memoria. De hecho yo voy en dirección contraria, yo estoy eliminando cualquier “malloc” o “new Object” de mi código base. Todo debe ser manejado con std::string() o en el singleton de la clase con un único “new Object” universal cuando no hay más alternativa.
  • Minimizar el uso de librerías adicionales es ciertamente una meta. Se puede hacer con C++ . C++ no obliga esto, quizás con más razón C te obliga a esto.

En cuanto al camino de un programador, debería ser algo así como C -> C++ -> C <-> C++ -> C++ (aunque como yo empecé en los 80’s el mio fue C -> C++ -> C++) Si conocemos ambos lo suficiente y hemos iterado una y otra vez con 1,2, 20 juegos, descubriremos que debemos dejar de preocuparnos y abrazar a C++ con ternura y confianza. Inténtalo. Tú puedes.

Deja de preocuparte y sé feliz programando en C

15-01-2016 6:25 AM

Si usted leyó cómo programar en C en 2016 (versión en español), ya salió una crítica que lo analiza punto por punto. El detalle es que yo no pasé de la primera regla:

  • La primera regla de C es no escribir en C si puedes evitarlo (The first rule of C is don’t write C if you can avoid it)

En los comentarios de Hackernews aparece como justificación de esta regla “¿Por qué alguien en el planeta Tierra voluntariamente haría código en un lenguaje donde la gente puede debatir algo tan simple como el tipo a utilizar para los números enteros?”. Pero la verdad es que no hace falta, mi directorio de C tiene 150+ aplicaciones y soluciones en C que simplemente usan “int”, sólo hay 2 ó 3 que usan cosas como “unsigned int”, “short”, “unsigned long long int”, y en general, como en cualquier lenguaje, no hacen falta cosas sofisticadas para resolver problemas, el K&R (el libro básico de C) incluye la forma canonica de hacer las cosas y eso fue suficiente en 1980 así como en 2016.

El resto de las reglas aplican a soluciones bien específicas que muy probablemente no encontraremos en nuestro día a día. Y otras son simplemente equivocaciones, por ejemplo “hello” es un char[] no un char *.

Así que en lo que a mi concierne la primera regla de C es deja de preocuparte y sé feliz programando en C.

Sigue el hacha inclemente

14-01-2016 2:23 PM

No mercy!

La lista infinita de psyblast en este momento luce así (la lista simplemente, porque ni siquiera quiero ponerle un nombre. Cualquier nombre tendría una connotación optimista, así que el remoquete de “infinita” le sienta muy bien)

      • (D) Dialog
        Move cam so it points to the npc after clicking.
      • (D) Load raw texts
      • (D) Parsing
      • (D) Displaying
      • (P) Conversation flow
      • (P) Happiness

Still ahead

      • » New levels + update current levels
      • » Code / Extend python generator

Lo cual me lleva nuevas ejecuciones:

    • python como scripting language: un gran »no vas«
    • Nada de armaduras, ropa y calzado. Duro de eliminar pero eso quedará para 2.0. La idea es agregar en el generador de personajes el color de la vestimenta y alguna selección básica de estilo pero nada más.
    • De esta forma en el generador de personajes queda sexo, raza, clase y estilo de ropaje.

Promesas de año nuevo

13-01-2016 2:29 PM

“La perfección se consigue no cuando no hay nada más que agregar, sino cuando no hay nada más que remover (“Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.”, tomado de alguna parte en reddit.com/r/gamedev). He hecho de esta regla mi nueva promesa para este año. Eh… bueno, ahora que recuerdo el año pasado, 2015, también dije algo similar. “Un juego sin tantos bombos y platillos es mejor que ningún juego” ha sido mi leit motiv desde hace 20 años. “Haz juegos que puedes hacer en un corto período de tiempo ( “Build Games You Can Finish Coding in a Short Period of Time”). Hay múltiples formas de decirlo pero la regla queda ahí: termina el maldito juego.

Con eso en mente lo que estoy haciendo es eliminando gran parte del desarrollo, y dejando todo para la versión 2.0 La lista (no definitiva) luce terrible porque elimina cosas que en cualquier mmorpg deberían estar. Por ejemplo:

  • Daño/Defensa/Sanación: reducido al mínimo con un mecanismo o combinación de mecanismos por clase. De hecho todo lo demás asociados a las clases queda eliminado, siendo la santa trinidad lo que los va a diferenciar. Los hechizos y encantamientos permanecen en las escuelas (un personaje decide solamente 4 cosas: sexo, raza, clase y escuela). Lanzando hachazos a todo lo demás los mecanismos quedan reducidos a esto:
    Defensa (tankeo)
    Escudo, Inmunidad, Ídolo defensivo, Esfera defensiva, Reflejo de hechizos (genera daño también en el atacante), asistente.
    Ataque (viene dado por la escuela respectiva pero además:
    Espada, Lanzarayo, Zona destructora (mancha en el piso), Esferas destructoras direccionables o no, Lluvia de Esferas destructoras (éstas van en todas direcciones), Bombardeo de esferas destructoras (estas caen desde arriba, también lluvia de esferas destructoras).
    Sanación (Healing)
    Aura, Zona sanadora (mancha en el piso), Poción de sanación, Bebida energizante, Medicina
    Entonces se trata de distribuir esto en cada una de las clases y listo.
  • Sólo 3 clases: Mago, Guerrero y Sacerdote. Ni hablar de todas las clases que estoy eliminando aquí.
  • Algunos hechizos asociados a la escuela del tiempo que son difíciles de implementar, por ejemplo, hechizo de premonición.
  • Mecanismos básicos como crítico (Critical Hits), supervivencia (saving throw), modo heroíco (Heroic Willpower).
  • Solamente 5 Pueblos (originalmente eran 7, quizás haga más recortes aquí). Cada pueblo requiere un mes duro de trabajo (10 horas diarías 2-3 días a la semana).
  • Simplificación del sistema de diálogos. Mi diseño original ya implementado es casi un sistema interactivo manejado con menú pero lo estoy reduciendo al mínimo que permita llevar la historia y las misiones. Esto me tomó muchas horas, implementarlo todo según el diseño original sería cosas de meses, que se convertirían a mi velocidad actual en años.
  • Como se ve en el diagrama a continuación el diseño incluye además Profesiones, Familias, Clanes y Facciones. La historia no me permite eliminar nada de esto pero trataré de simplificarlo al máximo (había escrito originalmente simplificarlo al mínimo pero eso sería casi no simplificar).
  • A pesar de todos estos hachazos el diagrama del juego sigue complicado y extenso:psyblast-diagram-130116

Además de todo esto también está pendiente la página web que por ahora está al mínimo.

¡Muere IE, muere!

06-01-2016 7:13 AM

Esta puede ser una noticia sin mucho significado para muchos, pero para todos los programadores web del mundo es la mejor noticia desde 1996: Internet Explorer End of life (ya no va a ser soportado por microsoft). Atrás quedaron los días de interminables horas tratando de controlar/mantener compatibilidad con IE6, IE7 y IE8. En algunas ocasiones, hacer compatible una página web con estas versiones representaba el 50% del tiempo del proyecto. Yo dejé de soportar IE en 2012, cuando el inefable botón de compatibilidad de IE8 me hizo fallar en un proyecto sin darme cuenta hasta que ya era muy tarde. Mi versión funcionaba bien con este botón deshabilitado pero los usuarios finales lo tenían activado. Mi vida de programador web está llena de estos problemas con IE, así que no puedo sino sentir una ufana alegría por dentro.

¡Muere IE, muere!

Querido hijo, es hora de hablar de algunas realidades de nuestras vidas

17-12-2015 12:22 PM

Se acerca navidad y fin de año, así que es hora de hacer un resumen de las realidades de nuestras vidas.

  • Stuart Little es un manifiesto en contra del racismo. El primer racista es el que habla sobre  las diferencias.
  • El correcaminos y Wile E. el coyote se toman juntos una cerveza al terminar de filmar. Ambos trabajan para una empresa llamada Acme.
  • Shrek el ogro, es el ser más bondadoso, amable, gentil y cordial del mundo.
  • No es una casualidad que Han Solo y Chewbacca estuvieran en la taberna de Tatooine. Obi Wan  llamó a Chewbacca,  amigo de Yoda de los tiempos de la guerra de los clones. Chewbacca andaba casualmente con Han Solo. Chewbacca habla wookiee, así que como no lo entendemos no sabemos que el jefe es él, no Han Solo.
  • Harry Potter es un libro autobiográfico. Hermione es  J.K. Rowling
  • Los ingenieros, los creadores de la raza humana en Prometeo, la precuela de Alien, el octavo pasajero, no se dirigían a la tierra a destruirla. En el proceso evolutivo, la siguiente fase es mutar a través de los aliens a una etapa superior. El objetivo era evolucionar, no destruir.

¡Nuevo record!

11-12-2015 6:17 AM

Bien creo que he establecido un nuevo record: 75 días sin escribir en mi blog, de verdad debo sentirme orgulloso, ahora tengo que tratar de lograr algo similar con otros de mis vicios:

  • Días sin tener sexo (cualquier tipo de sexo): 13
  • Días sin consumir bebidas alcohólicas:  8
  • Días sin fumar (yay!): 4049

Y el peor record de todos los tiempos de mis vicios más odiados:

  • Días sin tener una nueva idea sobre un videojuego que definitivamente tengo que programar: 0