Unity3D:通过网络加载资产时的顺畅交互?

时间:2013-07-02 23:30:48

标签: multithreading performance rendering unity3d

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

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

  1. 我创建了一个新线程来从服务器提取数据。
  2. 当数据到达时,我把它放在一个受互斥锁保护的缓冲区中。
  3. 在Unity线程中,在每一帧上,我检查缓冲区是否为空。如果它不为空,我等待互斥锁以获得处理数据的权限。获得许可后,我会解析数据并进行渲染。
  4. 我这样做是因为Unity不允许我在我创建的网络线程中创建新的GameObject。但我想知道我能做些什么来优化用户体验。

1 个答案:

答案 0 :(得分:1)

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

Unity Profiler (Pro only)

一般解决方案:

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

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

  • 如果这是实例化GameObjects的最后一步,那么你 可以尝试预先实例化您期望的对象,只需重新配置即可 他们根据新的网络数据;或者分开瞬间 处理成单独的,增量的阶段,具有不明显的小 暂停,例如首先是根节点,然后是下一个阶段的子节点,依此类推,直到完全重建为止。