iPhone GameKit 异步服务器模式

Posted

技术标签:

【中文标题】iPhone GameKit 异步服务器模式【英文标题】:iPhone GameKit asynchronous server pattern 【发布时间】:2010-08-17 18:44:58 【问题描述】:

使用 ios GameKit 实现服务器应用程序的最佳方式是什么?我是否应该创建一个单独的服务器线程以某种方式响应所有委托事件(接收到的数据等)?或者也许使用 NSRunLoops?

【问题讨论】:

【参考方案1】:

除非您知道需要,否则不要使用线程。

默认情况下,几乎所有东西都使用主线程的运行循环。不使用另一个线程就不能(轻松)使用另一个运行循环——每个线程最多有一个运行循环。

(严格来说,大部分东西都使用“当前”的run loop,也就是当前正在执行的线程的run loop,一般会是主线程。)

过去,大多数 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 和中继进行通信。我没有测试过。这不是很重要。)

【讨论】:

以上是关于iPhone GameKit 异步服务器模式的主要内容,如果未能解决你的问题,请参考以下文章

Apple GameKit - 如何将多部 iPhone 连接到 Ipad 作为服务器但具有不同的 Bundle ID

iPhone 到 iPhone 传输的 GameKIt 的替代品

原则上,Android 设备是不是可以通过蓝牙/GameKit 与 iPhone 交互?

使用 GameKit 通过 NSDictionary 在 iPhone 之间传输 CoreData 数据

发送 iOS GameKit 消息所需的时间

在 iPhone 上以编程方式打开蓝牙