Para hacer un juego como un RTS en red, he visto varias respuestas que sugieren que el juego sea completamente determinista; entonces solo tiene que transferir las acciones de los usuarios entre sí y retrasar un poco lo que se muestra para "bloquear" la entrada de todos antes de que se procese el siguiente marco. Entonces, cosas como las posiciones de la unidad, la salud, etc., no necesitan actualizarse constantemente a través de la red, porque la simulación de cada jugador será exactamente la misma. También he escuchado lo mismo sugerido para hacer repeticiones.
Sin embargo, dado que los cálculos de punto flotante no son deterministas entre máquinas, o incluso entre diferentes compilaciones del mismo programa en la misma máquina, ¿es realmente posible hacerlo? ¿Cómo evitamos que ese hecho cause pequeñas diferencias entre los jugadores (o las repeticiones) que se extienden a lo largo del juego ?
Escuché que algunas personas sugieren evitar por completo los números de coma flotante y usar int
para representar el cociente de una fracción, pero eso no me parece práctico: ¿qué sucede si necesito, por ejemplo, tomar el coseno de un ángulo? ¿Realmente necesito reescribir una biblioteca matemática completa?
Tenga en cuenta que estoy principalmente interesado en C #, que, por lo que puedo decir, tiene exactamente los mismos problemas que C ++ a este respecto.