Developing multiplayer games has different set of difficulties as compared to single player games which makes it even more challenging. While developing multiplayer games, you have to deal with number of factors that can affect the performance of your games and one such factor is: physics.
El desarrollar juegos multi-jugador tiene un conjunto de dificultades en comparación a juegos de un solo jugador, lo que lo hace más desafiante. Mientras que al desarrollar juegos multi-jugador, usted debe lidiar con un número de factores que pueden afectar el rendimiento de sus juegos y un factor como ese es: la física.
Cualquier juego involucrará diferentes tipos de acciones tales como moverse, saltar, disparar, etc. Las acciones como saltar, disparar, etc. no ocurren muy a menudo, pero acciones como el movimiento cambian en cada cuadro, as que intercambiar esta información en cada cuadro no es viable. Suponga que su jugador se está moviendo y si usted envía la posición del jugador en cada cuadro; y el juego corre a 60fps, habrá un enorme número de mensajes a ser enviados y recibidos, lo cual hará la red más lenta. Además, estos mensajes serán difíciles de manejar.
Para manejar tales problemas, debe planear de manera apropiada la forma en la que la física operará en su juego, y cómo sincronizará la física con todos los clientes. La forma más fácil de manejar esta situación es mantener ciertas características para su jugador, tales como
1. Posición
2. Velocidad
3. Aceleración
4. Masa
5. Gravitación
(aquí la Posición, Velocidad, Aceleración son cantidades de vector y la Masa es una cantidad escalar. La gravitación puede ser simulada como una cantidad de vector manteniendo el componente X como 0 y solamente utilizando el componente Y para representar la fuerza gravitacional hacia abajo.
La fuerza gravitacional será constante con todos los clientes, por lo mismo, ni siquiera necesita intercambiar esta información lo cual disminuirá la carga de mensaje.
Inicialmente, cuando el jugador empieza a moverse, necesita enviar información en relación a posición, velocidad, aceleración y masa. Comience a estimar la física en otros clientes utilizando esta información. Envíe información solamente cuando haya un cambio en velocidad (o aceleración) porque si estas se mantienen constantes, no habrá desviación (asumiendo todas las condiciones ideales) en el camino seguido por el jugador en todos los clientes.
Actualizando Posición y Velocidad:
Posición.X = Posición.X + Velocidad.X
Posición.Y = Posición.Y + Velocidad.Y
Velocidad.X = Velocidad.X + Aceleración.X
Velocidad.Y = Velocidad.Y + Aceleración.Y – Gravedad.Y
Puede ignorar la Aceleración si no es necesaria en su caso, solamente para mantenerse al mínimo. Como puede observar si la velocidad es constante, la posición incrementará en la misma proporción y aparecerá como la misma en todos sus clientes. Cuando hay un cambio en la velocidad, usted solamente necesita intercambiar información en ese momento solamente.
Mantener estas cantidades como vector le da una ventaja más, como por ejemplo, si hay un cambio en la dirección, entonces habrá un cambio en la velocidad, por lo que usted también puede enviar información sobre la dirección a través de la velocidad.
Considere este ejemplo simple:
1. Al momento t, el jugador A empieza a moverse de la posición p(x,y) con una velocidad v(x1,y1). Usted necesita enviar esta información a todos los clientes, por lo que el jugador A aparecerá en la posición p(x,y) y empezará a moverse con velocidad v(x1,y1) a todos los clientes.
2. Al momento t+dt, el jugador aparecerá en p’(x1’,y1’) a todos los clientes, por lo que no necesita intercambiar ninguna información entre los tiempos t y t+dt.
3. Al momento t+dt, el jugador cambia su dirección, por lo que la nueva velocidad será v(x1’,y1’), ahora debe intercambiar esta información con todos los clientes, cambiando la dirección del jugador A en todos los clientes.
De esta manera usted puede reducir considerablemente el número de mensajes que han de ser intercambiados.
Esperamos que este artículo le haya sido de ayuda, por favor comparta sus comentarios. Si tiene alguna pregunta o necesita asistencia, por favor escribanos a support@shephertz.com.
Any game will involve different types of actions like moving, jumping, shooting, etc. Actions like jump, shoot, etc. do not occur often but actions like movement change at every frame so exchanging this information at every frame is not feasible. Suppose your player is moving and if you send the position of the player at every frame; and game is running at 60fps, there will be enormous number of messages to be sent and received making the network slow.Also, these messages will be difficult to handle.
To handle such problems, you have to properly plan how physics will work in your game, and how you are going to synchronize the physics across all clients. The easiest way to handle this situation is to maintain few characteristics for your player like
-
Position
-
Velocity
-
Acceleration
-
Mass
-
Gravitation
(here Position, Velocity, Acceleration are vector quantities and Mass is a scalar quantity. Gravitation can be simulated as vector quantity by keeping X component as 0 and only using Y component to represent the downward gravitational force)
Gravitation force will be constant on all clients, hence you don’t even need to exchange this information which will decrease message load.
Initially, when the player starts to move, you need to send information regarding position, velocity, acceleration and mass. Start simulating the physics on other clients using this information. Send information only when there is a change in velocity (or acceleration) because if these remain constant, there will be no deviation (assuming all the ideal conditions) in the path followed by the player on all clients.
Updating Position and Velocity:
Position.X = Position.X + Velocity.X
Position.Y = Position.Y + Velocity.Y
Velocity.X = Velocity.X + Acceleration.X
Velocity.Y = Velocity.Y + Acceleration.Y – Gravity.Y
You can ignore Acceleration if it’s not needed in your case just to keep it minimal. As you can see if velocity is constant, position will increase in same ratio and will appear same in all clients. When there is a change in velocity, you only need to exchange information at that instant only.
Keeping these quantities as vector gives one more advantage i.e. if there is a change in direction then there will be a change in velocity, hence you can also send information regarding the direction through velocity.
Consider this simple example
1. At Instant t, player A starts to move from position p(x,y) with velocity v(x1,y1). You need to send this information to all clients, so the player A will appear at position p(x,y) and will start to move with velocity v(x1,y1) across all clients.
2. At instant t+dt, the player will appear at p’(x1’, y1’) across all clients so you don’t need to exchange any information between the time t and t+dt
3. At instant t+dt, the player changes its direction so the new velocity will be v(x1’,y1’), now you have to exchange this information with all clients, changing the direction of player A in all clients.
This way you can reduce considerably the number of messages to be exchanged
Hope this article helped you, please do share your feedback. If you have any questions or need any further assistance, please feel free to write us at support@shephertz.com
Leave A Reply