首先,我认为你混淆了
MasterServer和在游戏过程中发送和接收游戏数据所需的连接。MasterServer用于检索创建游戏的服务器的信息,例如IP地址和端口号。获取IP和端口号后,客户端可以使用这些信息直接连接到服务器。
我们是否可以使用简单的http请求和json结果来完成?
对于
MasterServer,是的,您可以。您还可以将其与PHP结合使用,在数据库上保存游戏会话。
例如,当玩家想要创建新游戏时,您需要获取他们的游戏信息,例如游戏名称、密码、最大玩家数、玩家的IP地址、端口号,然后将其序列化为JSON并使用RESTful发送。
您可以使用PHP接收游戏信息并将其存储到服务器上,以便其他玩家可以找到它。
这不应该影响性能,因为您只使用它来创建、查询和销毁游戏季节。您不在游戏过程中使用它来发送游戏数据。
关于在游戏过程中发送数据,您可以使用原始套接字进行操作。无论是使用C#的TCP还是UDP,或者如果您想获得最大的性能,可以使用本机C++,因为Unity的UNet是用C++编写的。大多数FPS服务器都是用C++编写的,这样可以确保它们获得最大的性能。
请记住,有许多类型的服务器,所以我无法在本文中涵盖所有类型。我将专注于MasterServer,它会告诉客户端创建的游戏的IP地址,然后是Relay,当玩家之间不能建立直接连接时使用。
我建议您使用Google的Protobuf而不是Json,因为它具有良好的性能和轻量级。如果您找到比Protobuf更快的序列化API,则使用它。
直接连接:
服务器:
1.使用Nat执行端口转发。
2.通过创建TCP/UDP服务器来创建游戏。
3.向MasterServer发送游戏信息(游戏名称、IP地址、端口号)。
4.当客户端使用该信息连接时,通过使用Protobuf序列化数据(FPS玩家位置?),向客户端发送数据。
5.当您从客户端接收数据时,使用Protobuf反序列化它。
客户端:
1.连接到MasterServer并检索运行中的游戏信息。
2.创建一个TCP/UDP客户端,并连接到其中一个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. 当您从Relay服务器接收到其他玩家发送的数据时,请使用
Protobuf进行反序列化。
请在连接仍然活动且游戏尚未结束时,重复执行
#4至
#6。