Close
    Search Search

    Tutorial: Fighting Lag

    Página de tutoriales Este artículo es un tutorial intermedio.Todos los tutoriales · Tutoriales de secuencias de comandos

    Los juegos en red como tus juegos en Roblox vienen con el frustrante e inevitable problema del retraso. Si su juego tiene FilteringEnabled, es probable que utilice una cantidad decente de Tutorial: Fighting LagRemoteFunctions o Tutorial: Fighting LagRemoteEvents. Si usa RemoteFunctions o RemoteEvents, necesariamente habrá un retraso en su juego. Afortunadamente, hay un par de estrategias que puedes usar para adoptar este retraso e integrarlo con gracia en la funcionalidad de tu juego.



    Contenido

    La fuente del retraso

    Antes de aprender algunas estrategias que ocultan lag, es importante tener un modelo mental preciso de por qué debe existir lag en juegos con llamadas remotas.

    Supongamos que es uno de nuestros usuarios en el Reino Unido y está jugando a un juego de ROBLOX FilteringEnabled. En este juego, un script local te permite presionar la tecla 'F' para disparar un cañón. El desarrollador de este juego ha decidido que las balas de cañón son demasiado importantes para que las maneje el cliente. En consecuencia, el script local realiza una llamada remota al servidor para que el servidor pueda ser el que se active. Cuando el cliente detecta que se ha presionado la tecla 'F', se comunica con el servidor, el servidor dispara el cañón y el servidor le informa al cliente qué sucedió como resultado. Sin embargo, debido a que su computadora está en el Reino Unido y debido a que los servidores de Roblox están en los Estados Unidos, esto requiere que se transmita una señal a través de todo el Océano Atlántico. Dos veces. Esto lleva tiempo, y esta vez se presenta en forma de un molesto retraso entre presionar la tecla 'F' y ver realmente el fuego del cañón.



    Cañones retrasados

    Para que ese último ejemplo sea un poco menos hipotético, este tutorial va acompañado de un sencillo juego de ROBLOX llamado "Laggy Cannons". Puedes jugarlo en línea aquí, y también puedes descargar la versión Studio por ti mismo si así lo deseas.

    En Laggy Cannons, hay cuatro cañones apuntados en la dirección de cuatro objetivos en movimiento. Cada par de cañón-objetivo se ve afectado por el mismo tiempo de retraso exagerado artificialmente, pero cada par de cañón-objetivo aborda este retraso de una manera ligeramente diferente. Algunos pares manejan este retraso mejor que otros. El par morado es mejor que el rojo, el par rojo es mejor que el naranja y el par naranja es mejor que el azul.

    Tutorial: Fighting Lag

    Antes de leer el resto de este tutorial, ahora sería un buen momento para jugar a Laggy Cannons y ver si puedes sentir las diferencias entre los cuatro. Para jugar Laggy Cannons, usa los cuatro teletransportadores cerca del punto de generación para teletransportarte a las plataformas de los cañones con los colores correspondientes. Cuando esté parado sobre una plataforma de cañón, puede presionar 'F' para disparar una bala de cañón e intentar golpear el objetivo en movimiento de ese cañón. Sube al área coloreada de la plataforma del cañón para volver a las plataformas de teletransporte y prueba con otro cañón. Puede manipular la cantidad de segundos de retraso artificial haciendo clic en los botones '+' y '-' en el panel de control cerca del punto de generación. El resto de este tutorial explica en profundidad cómo se comporta el cañón o el objetivo de cada color y por qué. También generalizaremos las estrategias que utiliza cada pareja para que puedas aplicarlas más fácilmente a tus juegos.


    El cañón azul

    Comencemos con el cañón que realmente no prueba nada: el cañón azul. Si presiona la tecla 'F', verá y escuchará inmediatamente la explosión del cañón disparando, pero no verá la bala de cañón por un buen tiempo. Aquí está la función que se llama en un script local cuando dispara el cañón azul:


    --En una función local de secuencia de comandos local badCannonStrategy () Workspace.FireCannonEvent: FireServer (activeCannon) createExplosion (activeCannon) end

    La primera línea de esta función usa un RemoteEvent llamado "FireCannonEvent" para pedirle al servidor que active una variable global llamada "activeCannon". El activeCannon aquí es, por supuesto, el cañón azul. FireCannonEvent es una solicitud unidireccional al servidor. Después de enviar al servidor un mensaje pidiéndole que dispare el cañón azul, este script local pasa inmediatamente a mostrar una explosión en pantalla utilizando la función auxiliar no mostrada "createExplosion". No hay ningún esfuerzo aquí para trabajar con el retraso inherente al RemoteEvent. Se envía el mensaje, se crea la explosión y luego esperamos a que el servidor dispare el proyectil.

    Lección 1: Tenga cuidado con su código

    La función badCannonStrategy () parece bastante inocente. Dispara el cañón y crea una explosión, ¿no es eso lo que queremos? El problema es que ignora el retraso por completo, y esto es muy fácil de hacer. Si quieres hacer juegos excelentes, debes notar que aquí habrá un retraso. Siga leyendo para saber qué puede hacer al respecto.

    El cañón naranja

    El cañón naranja modifica ligeramente la estrategia del cañón azul para sincronizar el disparo del proyectil con la explosión. La función que dispara el cañón naranja se ve así:


    --En un script local, función local okCannonStrategy () local waitForResponse = Workspace.FireCannonFunction: InvokeServer (activeCannon) createExplosion (activeCannon) end

    Puede ver que el único cambio aquí es la primera línea de la función. En lugar de usar un RemoteEvent para disparar la bala de cañón, el cañón naranja usa una RemoteFunction llamada "FireCannonFunction". Una RemoteFunction se diferencia de un RemoteEvent en que tiene un valor de retorno. Mientras que un RemoteEvent es solo una señal del cliente al servidor, una RemoteFunction es una señal del cliente al servidor y también un valor de retorno del servidor al cliente. Además, debido a que el cliente espera un valor de retorno, en realidad esperará a que llegue este valor de retorno antes de continuar en su secuencia de comandos local. Esta es exactamente la característica que aprovecha el script de cañón naranja. Esta función de disparo de cañón ligeramente mejor espera a que el servidor diga que ha disparado una bala de cañón antes de continuar para crear la explosión que la acompaña.


    Lección 2: Sincronizar la experiencia

    El cañón azul no tiene sentido porque ves la explosión del cañón mucho antes de ver la bala de cañón. En el mundo real, las explosiones y los disparos de balas de cañón ocurren simultáneamente. Para que un juego sea divertido e inmersivo, no debe violar las expectativas del jugador por cosas tontas como esta. Siga el ejemplo del cañón naranja y use RemoteFunctions para sincronizar eventos en el cliente y el servidor.

    El cañón rojo

    Si bien el cañón naranja resuelve el problema de las balas de cañón no sincronizadas y las explosiones, en realidad expone otro problema con el retraso. Cuando el jugador presiona la tecla 'F' para disparar, hay un retraso significativo antes de que el juego responda. Esto se llama retraso de entrada y es una de las cosas que más odian los jugadores. Hay un truco simple que puede utilizar para eliminar el retraso de entrada. No se puede acelerar el tiempo que tarda el cañón en disparar. No importa qué, eso tomará el tiempo de ida y vuelta que toma un mensaje para ir de cliente a servidor a cliente. Sin embargo, puedes darle al jugador alguna otra retroalimentación inmediata que le hará sentir que el juego está respondiendo a sus órdenes. La respuesta inmediata que el cañón rojo elige dar es un sonido. Cuando el jugador presiona 'F', el cañón rojo inmediatamente comienza a reproducir el sonido de la mecha de un cañón ardiendo. Este sonido se reproducirá durante el tiempo que sea necesario para que el servidor responda a la función remota. Una vez que el servidor responde, el cañón rojo apaga el sonido de la mecha encendida y crea una explosión que acompaña al proyectil que acaba de disparar el servidor.

    --En una función local de script local bestCannonStrategy () Workspace.Sounds.BurningFuse: Play () local waitForResponse = Workspace.FireCannonFunction: InvokeServer (activeCannon) Workspace.Sounds.BurningFuse: Stop () createExplosion (activeCannon) end

    Si vas a jugar con el cañón rojo, debería ser totalmente natural. Todavía hay un retraso entre presionar la tecla 'F' y ver el disparo de la bala de cañón, pero es imperceptible porque el cañón incorpora este retraso en la forma en que funciona.

    Lección 3: ¡Sin retraso de entrada!

    Los jugadores odian el retraso de entrada. Es frustrante sentir una desconexión entre usted y el juego. Aunque puede ser necesario tener una respuesta lenta a la entrada del jugador, siempre puede darles algo pequeño para indicar que su solicitud ha sido escuchada. Puede ser un sonido, un color de ladrillo cambiante o cualquier cosa. Hazles saber a los jugadores que están siendo escuchados y tendrás jugadores felices.

    El objetivo morado

    El cañón púrpura funciona exactamente de la misma manera que funciona el cañón rojo. La diferencia entre la plataforma violeta y todos los demás colores es la funcionalidad del objetivo en movimiento.

    Cuando golpea el objetivo azul, naranja o rojo, notará que hay un retraso entre ver que el objetivo es golpeado y el sonido "ding" resultante y la actualización de la puntuación. A modo de ejemplo, la siguiente función del servidor ejecuta el "ding" y la actualización de la puntuación para el objetivo azul:

    --Scripts de servidor Workspace.Blue.Target.Face.Touched: connect (function (proyectil) wait (_G.artificialLag) - Cómo Laggy Cannons crea un retraso artificial - Reproducir sonido de golpe objetivo Workspace.Sounds.TargetHit: Play () - -Actualizar puntaje azul blueScore = blueScore + 1 Workspace.Blue.Scoreboard.SurfaceGui.ScoreLabel.Text = blueScore end)

    Sabemos que algo tan importante como la puntuación del jugador debe ser manejado por el servidor. Por lo tanto, debe haber un retraso al actualizar la puntuación de un objetivo. Pero, ¿qué pasa con el sonido de dar en el blanco?

    Aunque, en última instancia, el servidor es el que decide si el objetivo fue alcanzado o no, el cliente es perfectamente capaz de reproducir inmediatamente el sonido de golpe del objetivo. En el peor de los casos, si el cliente y el servidor tienen un desacuerdo poco común sobre si el objetivo fue alcanzado, el jugador experimentará una discrepancia entre el sonido "ding" y la actualización de la puntuación. Esto podría suceder una de cada cinco mil veces, y es un costo que vale la pena darle al jugador una retroalimentación inmediata. Por lo tanto, podemos dividir la secuencia de comandos del servidor anterior en una secuencia de comandos de servidor y una secuencia de comandos local:

    --Scripts de servidor Workspace.Purple.Target.Face.Touched: Connect (function (proyectil) wait (_G.artificialLag) -– (Cómo Laggy Cannons crea un retraso artificial) --Update purpleScore purpleScore = purpleScore + 1 Workspace.Purple. Scoreboard.SurfaceGui.ScoreLabel.Text = purpleScore end) - Script local Workspace.Purple.Target.Face.Touched: connect (function (proyectil) --Play target hit sound Workspace.Sounds.TargetHit: Play () end)

    Lección 4: Divida sus guiones

    A veces tienes que hacer la mitad del trabajo en el servidor y la mitad del trabajo en el cliente. No tenga miedo de detectar el mismo evento dos veces. La detección local proporciona retroalimentación al jugador y la detección del servidor maneja la lógica del juego importante.

    Lag en el mundo real

    El retraso artificial predeterminado para los Laggy Cannons es de un segundo. Esto se superpone al retraso que su máquina experimenta naturalmente cuando juega un juego de ROBLOX. En toda nuestra base de jugadores, vemos jugadores con retrasos que oscilan entre 0.1 y 1.5 segundos. El retraso promedio parece rondar los 0.3 segundos. Afortunadamente, ahora está equipado con las herramientas para manejar este retraso.

    Prueba de retraso en Studio

    Si desea simular el retraso en ROBLOX Studio, puede ir a Archivo -> Configuración -> Red -> IncomingReplicationLag y ajustar la cantidad de segundos de retraso que Studio simulará al ejecutar un servidor de prueba.

    Añade un comentario de Tutorial: Fighting Lag
    ¡Comentario enviado con éxito! Lo revisaremos en las próximas horas.