如何为Unity3d设计我的在线游戏服务器?
最近,我一直在unity3d做多人游戏开发。 我非常清楚Unity的MasterServer如何在统一中工作。
但现在我想从头开始制作自己的游戏服务器。 我研究并了解我们可以使用Google云计算和应用引擎来制作我们自己的配对服务器和游戏主机服务器。
但我完全无能为力,我们如何开始编写服务器代码。 我们使用简单的http请求和json结果吗? 或者还有其他技术可以实时与FPS类型的游戏一起使用。 我不认为发送http请求并等待它的结果可以足够快,可以在FPS类型的游戏中工作,每秒我们发送超过100个数据。
起初我想到编写PHP脚本并将其托管到某个URL,然后向该URL发送请求并等待其响应。 但我发现如果我使用这个过程然后只是从服务器获得一个响应它将花费我至少0.5秒或更多。 在这种情况下,游戏中会有很多延迟。
我知道游戏服务器可以在某种tcp或udp网络上运行。 但我的问题是,我应该为服务器提供什么样的应用程序来接收这些数据并快速发送处理结果。
首先,我认为您将MasterServer与在游戏过程中发送和接收游戏数据所需的连接混淆。
MasterServer用于检索创建游戏的服务器的信息,如IP地址和端口号。 检索IP和端口号后,客户端可以使用这些信息直接连接到服务器。
我们使用简单的http请求和json结果吗?
对于MasterServer ,是的,你可以。 您还可以将它与PHP结合使用,以保存数据库上的游戏会话。
例如,当玩家想要创建一个新游戏时,你会带上他们的游戏信息,如游戏名称,密码,最大玩家,玩家的IP地址,端口号,然后将其序列化为json并使用RESTful发送。
您可以使用PHP接收该游戏信息并将其存储到服务器中,以便其他玩家可以找到它。
这不应该影响性能,因为您只使用它来创建,查询和破坏游戏季节。 在游戏过程中,您没有使用它来发送游戏数据。
至于在游戏过程中发送数据,你可以使用raw socket。 使用C#的 TCP或UDP。 如果你想获得最大的性能,请使用C ++本地化Unity的UNet是用C ++编写的。 大多数FPS服务器都是用C ++编写的,这是为了确保它们获得最高性能。
请记住,有许多类型的服务器,所以我不能在这篇文章中涵盖所有这些服务器。 我将专注于MasterServer ,它告诉客户端创建的游戏上的IP地址,然后在无法建立玩家之间的直接连接时使用的中继。
我建议你使用谷歌的Protobuf而不是Json的性能和轻量级。 如果您发现任何比Protobuf更快的序列化API,那么请使用它。
直接连接:
服务器 :
1.使用 Nat执行端口转发 。
2.通过创建TCP / UDP服务器创建游戏。
3.将游戏信息(游戏名称,IP,端口号)发送到MasterServer。
4.当客户端连接该信息时,通过使用Protobuf send将数据(FPS播放器位置?)序列化到客户端来开始发送数据。
5.当您从客户端接收数据时,使用Protobuf对其进行反序列化。
客户 :
1.连接到MasterServer并检索正在运行的游戏信息。
2.创建TCP / UDP客户端并连接到其中一个IP和端口号。
要发送和接收数据,请使用Server #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 。