Networking

GameMaker网络函数基于套接字,这是所有平台上的行业标准。使用套接字,您可以使用简单的 GML 创建客户端和服务器,这允许您使用客户端/服务器模型创建单个玩家游戏(这将允许稍后轻松添加多人游戏)。

基本上,套接字是一个可以发送、接收、连接和侦听网络上的 端口 的对象。使用 TCP 时,您可以将使用 IP 地址 (假设为 192.168.1.10) 的一个套接字连接到另一个 IP 地址 (假设为 192.168.1.11) 上的另一个套接字。连接后,这两个套接字可以使用 network_send_* 函数 (如 network_send_packet) 以及由它们触发的专用异步事件来回发送数据。此异步事件将生成一个包含接收到的数据以及其他详细信息的 DS 映射 ,您可以在有关 网络异步事件 的部分中找到完整的详细信息。

NOTE There is a maximum limit of 1024 sockets on Windows, macOS and Ubuntu, and 64 sockets on all other platforms.

UDP 协议是无连接的,因此您无需连接套接字,而是使用 network_send_udp 直接将数据发送到 IP 地址和端口。 GameMaker 还支持 WebSocket。

注意GameMaker 在除 Nintendo Switch、PlayStation 4 和 PlayStation 5 之外的所有平台上支持 IPv4 和 IPv6 地址。

与程序必须读取和处理进入计算机的每一位网络流量不同,IP地址还处理从0到65535的端口。这允许每个程序只获得它感兴趣的数据包,而不是每个程序发送的所有数据。这还节省了大量Cpu时间,因为它严重减少了数据处理,因此使用GameMaker,您还可以"侦听"端口。因此,服务器将创建一个套接字,然后将其绑定到要侦听的特定端口。然后,它将收到来自该套接字的连接、断开连接和数据传输的通知。

数据 "packets" 本身由从缓冲器获取的二进制数据组成。可以使用 GameMakerBuffer 系列函数创建和操作此缓冲区。

值得注意的是,如果您要为 HTML5 目标创建项目,那么由于浏览器限制,您将无法使用服务器创建功能,并且必须使用 ElectronNodeJS。另请注意,如果您的游戏是跨平台的,并且您预计从移动或桌面设备上运行的服务器连接到游戏的 HTML5 实例,那么您的服务器只能使用 Web Socket 协议 (这是使用常量 network_socket_wsnetwork_socket_wss 完成 - 请参阅 network_create_server 了解更多信息)。这意味着您的服务器可能必须在不同端口上创建两个套接字,一个用于连接到非 HTML5 目标 (Android、Windows 等),另一个用于连接到 HTML5 目标。

原始函数

用于创建套接字、连接到服务器和发送数据的函数有原始的替代方案,您可以在下面的列表中看到。

通过常规网络功能 (例如 network_connect) 发送的数据包 / 请求包含 GameMaker 插入的附加标头数据,因此只有 GameMaker 游戏可以相互通信。

原始函数 (例如 network_connect_raw) 用于与非 GameMaker 服务器 / 客户端连接,例如如果你想连接到用 JavaScript、PHP 等编写的服务器。

您不得在游戏中混合使用常规函数和原始函数,因为这样做会导致问题。这意味着,对于使用 network_connect 建立的连接,您必须使用 network_send_packet,而对于 network_connect_raw,则必须使用 network_send_raw.

数据包分离

当使用原始 TCP 网络时,一个客户端发送的多个数据包可能会被接收客户端作为单个数据包接收,并且相反的情况也可能发生,即单个数据包被拆分为多个数据包。非原始网络功能可以防止这种情况发生,因为 GameMaker 将标头插入到每个数据包中,从而允许接收 GameMaker 客户端分离或组合传入数据包以代表它们发送时的情况。

当使用原始 TCP 函数时,游戏将负责读取传入的数据包并在发送数据包时将它们分开 / 组合。

使用 UDP 或 WebSocket 时,数据包将以发送时的形式进行传递,因此对这些协议使用非原始函数只会增加不必要的开销。

功能参考