现在我正在尝试为 iPhone 制作一个 mmorpg。我已将其设置为 iPhone 每秒多次请求播放器位置。它是如何做到这一点的,客户端使用异步 NSURLConnection 向 php 页面发送请求,该页面从 mysql 数据库加载位置并以 json 形式返回。但是,从请求位置到实际加载位置大约需要 0.5 秒。这似乎真的很高,是否有任何明显的事情可能导致这种情况?
此外,这也会导致客户端上的玩家移动也非常不稳定。是否有任何算法或方法来减少玩家运动的不连贯性?
现在我正在尝试为 iPhone 制作一个 mmorpg。我已将其设置为 iPhone 每秒多次请求播放器位置。它是如何做到这一点的,客户端使用异步 NSURLConnection 向 php 页面发送请求,该页面从 mysql 数据库加载位置并以 json 形式返回。但是,从请求位置到实际加载位置大约需要 0.5 秒。这似乎真的很高,是否有任何明显的事情可能导致这种情况?
此外,这也会导致客户端上的玩家移动也非常不稳定。是否有任何算法或方法来减少玩家运动的不连贯性?
开始测量在 iPhone 之外运行数据库查询需要多长时间。
然后测量当您从 iPhone 以外的设备发送相同的 http 请求时需要多长时间(例如,一个 10-15 行的 c# 程序来解决这个问题)。
如果以上都没有显示任何明显的延迟,则需要在 iPhone 端进行改进。需要注意的一些事项:
GPRS/3G有相当高的延迟
GPRS/3G 有相当高的误码率——这意味着不时会有很多丢包,这将导致 tcp 重新传输,你会遇到更高的延迟
HTTP 有很多开销。
JSON 增加了很多开销。
也许您需要为您的消息提供一种紧凑的二进制格式,并放弃 HTTP 以支持自定义协议 - 甚至可能恢复为 UDP
以上几点通常不适用,但如果您需要在高延迟、低带宽、不稳定的连接上提供流畅的体验,它们就适用。
我没有关于玩家运动算法的任何具体信息,但经常使用的是某种运动预测。
你知道玩家移动的方向,如果速度不总是恒定的,你可以推导出速度——这意味着你可以随着时间的推移进行插值并猜测他的新位置,在查询实际位置时调整屏幕上的位置,然后调整当您得到查询响应时回到实际位置。诀窍是始终在特定边界内随时间进行插值。如果您的预测与查询返回的结果相比有点偏离,请不要立即将位置重新定位到实际位置。在少数帧上在当前位置和所需位置之间进行插值。
在服务器端,您应该使用一些保持运行并始终保持数据库连接打开的系统。最好它也会缓存东西,而不是一直从数据库中请求它们。
此外,不要为每次更新都发出新的 HTTP 请求。如果您根本不需要使用 HTTP,那将是最好的,因为它确实不适合实时通信。
GPRS 通常有 600 毫秒的 ping 时间,3G 有 300 毫秒,HSPA 有 100 毫秒。查看正在使用哪种模式。请注意,当没有足够的流量来证明更快模式的合理性时,出于省电的原因,某些设备(我不知道 iPhone)会从 HSPA 降至常规 3G。
至于位置,一个相当普遍的做法是应用线性预测,即让角色以当前速度沿当前方向继续移动,即使服务器还没有可用数据。
最重要的是:基准测试/配置文件以查看延迟在哪里。是您的服务器、网络连接还是应用程序。
快速加载玩家位置有缺点。
所以我现在看不到没有一些必要捷径的mmorpg可以工作,例如根据它们的速度和位置推断路径。加载位置不会像你想要的那样快,尤其是对于基于 PHP 的所有东西的服务器。
无论哪种方式,在为移动平台开发时,您都必须在功能方面做出牺牲,而不是在功能齐全的桌面实现方面做出牺牲。
如果不是整个服务器用更快的语言(例如 C++),我也可能会重新实现一些更关键的东西。