使用 iOS GameKit 实现服务器应用程序的最佳方法是什么?我是否应该创建一个单独的服务器线程,以某种方式响应所有委托事件(接收到的数据等)?或者也许使用 NSRunLoops?
1 回答
除非您知道需要,否则不要使用线程。
默认情况下,几乎所有东西都使用主线程的运行循环。不使用另一个线程就不能(轻松)使用另一个运行循环——每个线程最多有一个运行循环。
(严格来说,大多数事情都使用“当前”运行循环,即当前正在执行的线程的运行循环,一般会成为主线程。)
过去,大多数 PC 游戏不会在不同的线程中运行网络代码,这意味着速度较慢的显卡会降低网络代码的性能。如今,FPS 经常默认在单独的线程中运行网络代码,或者可以选择这样做(Quake 3 有“纯服务器”模式);这使得游戏物理与主机的渲染性能脱钩,这通常是一件好事。
(不知何故,在 Quake 3 中做任何导致纹理/等重新加载的事情仍然滞后于服务器线程。)
如果您要在单独的线程中运行服务器,我建议通过“网络”与本地“客户端”进行通信。无论如何,您都必须编写某种网络代码,所以只需使用类似的东西socketpair(AF_UNIX, SOCK_DGRAM, 0, &sockets)
(如果这不起作用,请尝试 AF_INET)并将它们视为 UDP 套接字。
请注意,您不需要使用 GameKit 通过蓝牙进行通信。如果您发布 Bonjour 服务(请参阅 NSNetService),它将自动通过用于 GameKit 的相同蓝牙 PAN 进行广告(在后台,GameKit 通过蓝牙在 IP 上运行 Bonjour)。如果您只使用 Bonjour 和 UDP,则更容易使其跨平台并支持不通过蓝牙执行 GameKit 的旧设备。
(我认为 GameKit 具有额外的网状网络功能,因此 A 和 B 可以通过使用 C 和中继进行通信。我还没有测试过。这不是很重要。)