【问题标题】:Unity3D: Smooth Interaction When Loading Asset Via Network?Unity3D:通过网络加载资产时的平滑交互?
【发布时间】:2013-07-02 23:30:48
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你应该使用 WWW 类在统一内从网络中检索东西,它会帮助你优化。
  • 嗨@AlexanderBrevig,不幸的是WWW 课程不适合我。为了这个项目的研究目的,我必须自己做网络部分,而不是依赖 Unity 提供的东西。

标签: multithreading performance rendering unity3d


【解决方案1】:

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

Unity Profiler (Pro only)

一般解决方案:

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

  • 如果解析是减速,您仍然可以在一个 后台线程。在最终必须实例化 GameObject 之前尽可能多地执行。

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

【讨论】:

  • 谢谢!我分析了我的游戏,发现实例化游戏对象部分占用了高达 90% 的时间。在实例化作业中,Mesh.Bake Scaled Mesh PhysX CollisionData 占用了 85.7% 的时间...
猜你喜欢
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 2019-06-30
  • 1970-01-01
相关资源
最近更新 更多