最近,我一直在unity3d做多人游戏开发。我对Unity的MasterServer如何统一工作非常了解
但现在我想从头开始制作自己的游戏服务器。我研究并了解我们可以使用Google云计算和应用引擎制作我们自己的配对服务器和游戏主机服务器。
但我完全无能为力,我们如何开始编码我的服务器。我们使用简单的http请求和json结果吗?或者还有其他技术可以实时与FPS类型的游戏一起使用。我不认为发送http请求并等待它的结果可以足够快地在FPS类型的游戏中工作,每秒我们发送超过100个数据。
起初我想过编写php脚本并将其托管到某个url,然后向该url发送请求并等待其响应。但我发现,如果我使用这个过程然后从服务器获得一个响应,它将花费我至少0.5秒或更多。在这种情况下,游戏会有很多滞后
我知道游戏服务器可以在某种tcp或udp网络上运行。但我的问题是,我应该为服务器提供什么样的应用程序来接收这些数据并快速发送处理结果。
答案 0 :(得分:9)
首先,我认为您将 MasterServer 与游戏过程中发送和接收游戏数据所需的连接混淆。
MasterServer用于检索创建游戏的服务器的信息,如IP地址和端口号。检索IP和端口号后,客户端可以使用这些信息直接连接到服务器。
我们是使用简单的http请求和json结果吗?
对于 MasterServer ,是的,你可以。您还可以将它与PHP结合使用,以便在数据库中保存游戏会话。
例如,当玩家想要创建一个新游戏时,你会带上他们的游戏信息,如游戏名称,密码,最大玩家,玩家的IP地址,端口号,然后将其序列化为json并使用REST风格。
您可以使用PHP接收该游戏信息并将其存储到服务器中,以便其他玩家可以找到它。
这不会影响性能,因为您只使用它来创建,查询和破坏游戏季节。您不使用它在游戏过程中发送游戏数据。
至于在游戏过程中发送数据,可以使用原始套接字执行此操作。使用 C#的TCP或UDP。如果你想获得最高性能,那么使用 C ++ 进行本地化Unity的UNet是用 C ++ 编写的。大多数FPS服务器都是用 C ++ 编写的,这是为了确保它们能够获得最高性能。
请记住,有许多类型的服务器,所以我不能在这篇文章中涵盖所有这些服务器。我将只关注 MasterServer ,它告诉客户端创建的游戏上的IP地址,然后在无法建立玩家之间的直接连接时使用的中继。
我建议您使用Google的Protobuf而不是Json,因为它的性能和轻量级。如果您发现任何序列化API比Protobuf更快,那么请使用它。
直接连接:
服务器强>:
1 。使用Nat执行port forwarding。
2 。通过创建TCP/UDP server来创建游戏。
3 。将游戏信息(游戏名称,IP,端口号)发送到MasterServer。
4 。当客户端连接该信息时,通过将 Protobuf 发送序列化数据(FPS播放器位置?)开始发送到客户端。
5 。当您从客户端收到数据时,请使用 Protobuf 对其进行反序列化。
<强>客户端强>:
1 。连接到MasterServer并检索正在运行的游戏信息。
2 。创建TCP/UDP client并连接到其中一个IP和端口号。
要发送和接收数据,请使用服务器#4 和#5 中的步骤。
有时,端口转发无法在某些设备上运行。在这种情况下,具有不同全局IP地址的两个玩家无法连接在一起,这就是继电器和C ++发挥作用的地方。中继应不使用http请求,json或php完成。它应该使用C ++或类似的快速语言,如python。
同样,有很多方法可以做到这一点。最简单的方法是为每个创建的游戏生成私钥。当服务器/客户端相互发送数据时,它们必须在该数据中包含此密钥,并且此密钥将用于确定中继服务器应将数据发送给谁。
与中继的连接:
服务器强>:
1 。通过连接将游戏信息(游戏名称)发送到 MasterServer 来创建游戏。
2 。 MasterServer 通过生成私钥并将其返回给服务器来响应。
3 。使用该私钥连接到中继服务器。
4 。要将数据发送给其他播放器,请使用 Protobuf 序列化数据(FPS播放器位置?),然后发送到中继服务器。该数据还必须包含私钥。
5 。中继服务器从此服务器接收数据,读取私钥并使用相同的私钥将数据转发/发送到任何其他客户端。
6 。当您从其他播放器发送的中继服务器收到数据时,请使用 Protobuf 对其进行反序列化。
重复从#4 到#6 ,只要连接仍然有效且游戏仍未结束。
<强>客户端强>:
1 。连接到MasterServer并检索正在运行的游戏信息。
2 。 MasterServer 通过将该游戏的私钥返回给客户来做出响应。
3 。使用该私钥连接到中继服务器。
4 。要将数据发送给其他播放器,请使用 Protobuf 序列化数据(FPS播放器位置?),然后发送到中继服务器。该数据还必须包含私钥。
5 。中继服务器从此服务器接收数据,读取私钥并使用相同的私钥将数据转发/发送到任何其他客户端。
6 。当您从其他播放器发送的中继服务器收到数据时,请使用 Protobuf 对其进行反序列化。
重复从#4 到#6 ,只要连接仍然有效且游戏仍未结束。