Dentro de ArenaNet: Chromium Embedded Framework en Guild Wars 2

por El equipo de Guild Wars 2 el 26 de abril de 2023

Soy Ben Dunkin, programador sénior de motor del equipo de Guild Wars 2. Entré en ArenaNet el año pasado para completar el recién reformado equipo de motor. Es el mismo equipo que ha estado trabajando en la mejora a DirectX 11. Ese proyecto va bastante bien, pero hoy vengo a hablaros de otra cosa en la que hemos estado trabajando: la sustitución de la tecnología CoherentUI por Chromium Embedded Framework.

¿Qué estamos reemplazando?

Vamos a reemplazar CoherentUI, una librería que nos permite ejecutar un navegador web dentro del juego. Empleamos CoherentUI en bastantes sitios, incluidos los libros del juego, el lanzador y el bazar. Y ahora, vamos a sustituirlo por Chromium Embedded Framework (“CEF” a partir de ahora). CEF se emplea para crear las interfaces de muchos otros programas como Steam, los lanzadores de Battle.net y la tienda de Epic Games.

¿Por qué hacemos este cambio?

Uno de los objetivos de nuestro equipo es modernizar el código base. Tenemos mucho código que no ha cambiado desde hace mucho tiempo. Esto se ha ido convirtiendo en un problema a medida que forzábamos los viejos sistemas más allá de sus límites. Gran parte de nuestras librerías de terceros (es decir, códigos que tomábamos de otros) han dado bastantes problemas. Por ejemplo, DirectX 9 (que usábamos para dibujar en pantalla), Havok (motor de físicas), Umbra (para la eliminación selectiva de oclusión) y CoherentUI (para algunas de nuestras interfaces).

Algunas librerías son difíciles de actualizar, y antes de realizar cualquier mejora, hace falta planificar las cosas cuidadosamente y analizar la relación coste/beneficio. Ya tomamos la decisión de actualizar DirectX 9 a DirectX 11 (podéis ver nuestra publicación de blog al respecto aquí). Nos ha costado mucho, pero esperamos que al final valga la pena. Por otro lado, hemos decidido no actualizar Havok. Está incluso más integrado en el juego que DirectX 9, así que el riesgo de que aparezcan errores de físicas que afecten al juego es demasiado alto.

CoherentUI es una librería mucho más sencilla de actualizar, y la hemos escogido por un par de razones:

  • CoherentUI no es compatible con los estándares de seguridad actuales. Nuestros socios externos de procesamiento de pagos han señalado que esto será un problema en el futuro. Existe un riesgo muy alto de que esto tenga un impacto en nuestra capacidad para financiar desarrollos del juego en el futuro.
  • CoherentUI ya no recibe soporte por parte de sus proveedores. No podemos mejorar su rendimiento ni corregir sus errores por nosotros mismos. Esto ha acabado dando como resultado varios errores sin solución en el bazar, así como problemas de rendimiento.
  • CoherentUI es un sistema antiguo. La compatibilidad con estándares modernos de programación, formato y lenguaje es limitada, y no es compatible con herramientas modernas que nos ayudarían a desarrollar más deprisa.

CEF soluciona esos problemas y muchos más. Nuestros colaboradores en el proceso de pagos están satisfechos con él, tiene un rendimiento mucho mejor y es compatible con las herramientas y estándares más recientes. También nos ofrece muchas más opciones para mejorar el rendimiento cuando sea necesario. Tenemos intención de actualizarlo a un ritmo razonable para no quedarnos atrás en cuanto a mejoras de rendimiento y resolución de errores.

Algunos sabréis que ya actualizamos CoherentUI el año pasado. Así pues, ¿por qué hacer otra mejora? La mejora del año pasado fue un arreglo temporal del primer punto que mencionamos arriba para ganar tiempo para reemplazar CoherentUI por completo. Nuestros colaboradores en el proceso de pagos estaban contentos con la nueva versión de CoherentUI, pero sabíamos que era solo cuestión de tiempo que acabara por no estar a la altura de sus estándares.

¿Qué veréis cuando terminemos este cambio?

Puede que hayáis notado que el bazar funciona un poco mejor, pero tampoco es para tirar cohetes. Nuestro objetivo es reemplazar el sistema subyacente de la manera más transparente posible. Queremos asegurarnos de que la mejora funciona correctamente antes de centrarnos en las mejoras de rendimiento o funcionalidad.

No obstante, hay diferencias significativas entre CoherentUI y CEF que vosotros no notaréis, pero que sí nos ayudarán a desarrollar más deprisa. Por ejemplo, aquí os mostramos el sitio web de Guild Wars 2 en ambas librerías.

www.guildwars2.com con CoherentUI

www.guildwars2.com con CEF

Fijaos cómo CoherentUI no muestra correctamente la barra superior, el menú desplegable, los objetos nuevos o el carrusel de navegación. Con CEF no hará falta tener que compensar estas limitaciones, por lo que podremos desarrollar la interfaz más deprisa.

Aquí tenéis un perfil de rendimiento de la carga del bazar.

CoherentUI cargando el bazar

CEF cargando el bazar

CoherentUI tarda 19,241 milisegundos, mientras que DEF tarda 6,99 milisegundos. Como referencia, un juego que funciona a 60 fotogramas por segundo renderiza un único fotograma en 16,66 milisegundos. Como podéis ver, CEF tarda un 36 % a comparación con CoherentUI en realizar esta tarea. Es decir, que no hace falta que empleemos tanto tiempo optimizando la interfaz basada en web, dada su rapidez actual.

Nota: no es lo mismo el rendimiento de la interfaz que el rendimiento de la red. A veces, el bazar parece ir lento debido a que las solicitudes de red tardan mucho, no porque la interfaz sea lenta. CEF no podrá mejorar las solicitudes de red lentas.

Estrategia de lanzamiento

Tras nuestros intentos de lanzarlo solo para retirarlo después, algunos os preguntasteis con razón por qué no lo implementamos gradualmente o damos a la gente la opción de usarlo como ya hicimos con DirectX 11.

Nuestra primera opción fue la de implementar este cambio poco a poco, pero había algunas complicaciones que nos lo impedía. Ahora mismo carecemos de las herramientas necesarias para realizar este tipo de cambios, y los elementos que complican nuestra capacidad para añadir herramientas nuevas también complican todo este proceso.

Implementarlo lentamente requiere que el juego contacte con nuestros servidores con una ID de cuenta que nos permita saber quién está usando el sistema nuevo y quién no. El lanzador se ejecuta antes de que el jugador inicie sesión, lo cual provoca un problema del tipo “¿qué fue antes, el huevo o la gallina?”. Necesitamos una ID para determinar qué sistema usar, pero necesitamos el sistema para obtener una ID. Dar a los jugadores la opción de usar el sistema o no presenta un problema similar. Los ajustes están vinculados a cada cuenta, pero aún no sabemos de qué cuenta se trata mientras se ejecuta el lanzador. Añadir un nuevo sistema de configuración que no emplee ID de cuentas requeriría modificar también el lanzador, por lo que tendríamos los mismos problemas a la hora de lanzar ese nuevo sistema que los que tenemos con el sistema CEF. Hemos decidido minimizar los riesgos con un solo cambio, en vez de con dos, aunque puede que añadamos un sistema de configuración así en el futuro.

Con DirectX 11, el error al inicializar era recuperable. Es decir, que tras recibir un aviso de error de inicialización, el juego podía responder. Nuestra respuesta consistía en volver a DirectX 9 para que el juego pudiera arrancar la siguiente vez que se usara el lanzador. Por desgracia, con CEF lo errores hacen que el lanzador se bloquee de inmediato, por lo que no tenemos capacidad de volver automáticamente a CoherentUI. En otras palabras, cuando las cosas se tuercen, la única opción para los jugadores habría sido modificar banderas en la interfaz de línea de comandos. Las banderas de línea de comandos son nuestro último recurso para resolver los problemas de los jugadores, así que si vemos incluso una cantidad relativamente pequeña de bloqueos del lanzador, interpretamos que son jugadores que no pueden jugar.

Esa es una de las peores situaciones en las que puede acabar un jugador, y por eso retiramos tan deprisa los lanzamientos anteriores. También es la razón por la que no tendría ningún sentido hacerlo opcional. Para aquellos que optaran por cambiar, nuestra única respuesta razonable habría sido revertir el cambio. Es decir, la misma respuesta que si el cambio no fuera opcional. Excepto que tendríamos menos información aún, ya que solo un pequeño porcentaje de los jugadores elegiría hacerlo.

Hemos de conseguir un equilibrio entre minimizar las molestias a los jugadores y maximizar la información que conseguimos. Los errores que vemos son bastante poco usuales. Solo una pequeña fracción de los jugadores se topa con ellos, así que no podemos reproducirlos internamente. Así pues, necesitamos una gran cantidad de jugadores ejecutando el sistema nuevo solo para recibir unos pocos informes de errores. Dado que este sistema es esencial y es necesario mejorarlo, nos hemos decantado por maximizar la obtención de información. Si recibimos demasiados informes de error, revertiremos el cambio rápidamente para limitar el tiempo de interrupción del juego.

Estado actual

El lanzamiento de CEF del 14 de marzo tuvo tantos problemas que acabamos retirándolo. Arreglamos todos los errores que pudimos reproducir y aplicamos medidas que esperamos que hayan resuelto los demás.

Tanto el lanzador como el bazar son sistemas esenciales para realizar misiones, y los sometemos a muchas pruebas internas antes de lanzarlos. Nuestro equipo de control de calidad es fantástico y han probado esta mejora en muchas configuraciones de hardware y software, pero no podemos probar las miles y miles de configuraciones que emplean nuestros jugadores. El número de veces que se ejecuta el lanzador durante semanas de pruebas internas es pequeño comparado con un solo día de partidas de nuestros jugadores. Lanzamos este cambio por segunda vez con la actualización del 18 de abril y, si detectamos más problemas serios, lo retiraremos de nuevo hasta que podamos arreglarlo.

¡Estoy deseando saber en qué mejora esto la experiencia de nuestros jugadores!

—Ben Dunkin