1

我在 Mac 上使用 Unity3D 3.x 版制作联网电脑游戏。我有一个游戏客户端和一个游戏服务器。每当数据从服务器到达客户端时,客户端会冻结一点(约 0.5 秒),呈现新数据,然后继续。有什么办法可以优化我的游戏,使传入的数据不会影响用户与游戏客户端的交互?

这就是我现在正在做的事情:

  1. 我创建了一个新线程来从服务器中提取数据。
  2. 当数据到达时,我把它放在一个受互斥锁保护的缓冲区中。
  3. 在 Unity 线程中,在每一帧上,我都会检查缓冲区是否为空。如果不为空,则等待互斥锁获得处理数据的权限。一旦获得许可,我就会解析数据并渲染它。

我这样做是因为 Unity 不允许我GameObject在我创建的网络线程中创建新的 s。但我想知道我是否可以做些什么来优化用户体验。

4

1 回答 1

1

最好首先了解冻结的来源,即是否由于等待锁定?由于解析?由于 GameObject 实例化?三个都?

Unity Profiler(仅限专业版)

一般解决方案:

  • 如果暂停是由于锁,请尝试将缓冲分成不同的 bin,以便主线程可以访问下一个非空 bin,而无需获取锁,或者至少是这样的粗粒度锁。

  • 如果解析是减速,您仍然可以在后台线程中完成所有这些。在最终必须实例化 GameObjects 之前尽可能多地执行。

  • 如果这是实例化游戏对象的最后一步,那么您可以尝试预先实例化您期望的对象,只需根据新的网络数据重新配置它们;或者将实例化过程划分为单独的增量阶段,并带有不明显的小停顿,例如,首先是根节点,然后是下一个阶段的子节点,依此类推,直到完全重建。

于 2013-07-02T23:44:46.653 回答