Pero antes de hablar sobre performance, que es el tema principal que queremos discutir en esta presentación, primero necesitamos hablar sobre cómo funciona la state management y cómo es diferente cuando estamos en un entorno de juego.
Entonces, cuando miramos una aplicación web tradicional, podemos pensar en ella de esta manera. Tenemos tu navegador, por ejemplo, aquí tengo Firefox ejecutando la UI y eso tiene su propio entorno de ejecución de JavaScript y luego tenemos, digamos, un servidor en internet ejecutando Node.js y luego tenemos solicitudes HTTP y respuestas que regresan. Así que es una especie de separación de solicitud-respuesta y luego tenemos una copia del estado en el navegador.
Cuando entras en un mundo de juego, lo que usualmente tenemos es solo un solo proceso, ¿verdad? Tenemos el motor de JavaScript todavía en funcionamiento, que tendrá nuestro código de React y nuestro código de UI en él, pero tenemos el motor de juego C++ justo allí y eso es lo que llamamos nuestro backend y eso es generalmente el titular del estado. Si quieres entender esto, es mejor mirar un ejemplo y un buen ejemplo es Minecraft.
Entonces, si miras esta pantalla, que es básicamente lo que ves si estás jugando el juego, esto es el HUD. Vemos básicamente la información sobre cuánta health tiene tu personaje, la saciedad porque Minecraft es un juego de supervivencia, así que si no comes, empiezas a pasar hambre y puedes morir. También vemos los elementos a los que tienes acceso en tu barra de acceso rápido, así que estos son elementos que puedes cambiar rápidamente usando el gamepad, y qué elemento tienes seleccionado. Así que aquí puedes ver que tenemos el primer elemento seleccionado, que es la espada, pero un jugador también puede, interactuando con el juego, cambiar el elemento seleccionado a la Carne Podrida y eso no solo afecta al juego en sí, sino que también necesita ser reflejado en la UI. Y el jugador también puede recibir daño, ¿verdad? Digamos que un mob viene y un creeper explota al lado del jugador, y entonces necesitamos restar algo de health y aquí la health ha bajado a ocho. Así que podemos ver aquí que tenemos algo así como dos categorías de data, dos grupos de data. Y a esos los llamamos facetas.
Así que facetas es un término que acuñamos internamente en el estudio porque necesitábamos algo que no existía dentro de la base de code. Así que no podíamos usar modelo, por ejemplo. Pero esto es más o menos lo que es. Es solo una porción de data. Pero así como eso, como las facetas conceptualmente, son muy similares a un observable donde disponible con el tiempo. Así que nos suscribimos a una faceta, como digamos las estadísticas del jugador, y luego seguimos recibiendo actualizaciones sobre nuevos valores a medida que cambian, a medida que el jugador juega el juego, ¿verdad? Así que en la parte de abajo podemos ver cómo a medida que avanza el tiempo y el jugador pierde health, tenemos un componente hipotético de health del jugador que se actualiza con cuánta health tiene el jugador. Conceptualmente entonces lo que queremos es que el estado no viva en el lado de JavaScript, sino que más bien debería vivir en el lado de C++, que es nuestro backend, pero está viviendo justo allí dentro del mismo proceso. Queremos algo así como un almacén global y ese almacén global es el lado C++ del juego. Y cuando pensamos en almacenes globales, y miramos el ecosistema de JavaScript, hay un par de soluciones disponibles. Algunas de las más populares en estos días son Recoil o Jotai y son muy parecidas a esta moda donde tienes un almacén global. Y tomamos un enfoque muy similar a estas soluciones, y nos inspiramos en la API de Recoil's para construir algo que se siente muy familiar para que cualquiera que venga al estudio entienda qué conceptos estamos tratando de implicar. Pero hay algunas diferencias, por supuesto, que vamos a repasar en Next. Así que RackFacet es en realidad un pack, una colección de paquetes. Tenemos muchos paquetes. La parte que se ocupa de la comunicación entre los bits de JavaScript y los bits de C++ la llamamos RackFacet Remote. Y esa es la primera parte de la que voy a hablar ahora. Y supongo que lo primero que necesitamos mirar es cómo definimos las facetas, ¿verdad, los bits de estado que tenemos que se comparten entre el lado C++ y el lado de JavaScript.
Comments