2013-07-02 46 views
1

我在Mac上制作使用Unity3D版本3.x的联网电脑游戏。我有一个游戏客户端和一个游戏服务器。无论何时数据从服务器到达客户端,客户端都会冻结一点点(〜0.5秒),呈现新数据,然后继续。有什么方法可以优化我的游戏,以便传入的数据不会影响用户与游戏客户端的交互?Unity3D:通过网络加载资产时的平滑交互?

这里是我现在在做什么:

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

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

+0

您应该使用WWW类检索的事情了统一的范围内的网络,它会帮助你优化然后。 – AlexanderBrevig

+0

嗨@AlexanderBrevig,不幸的是'WWW'类不适合我。对于这个项目的研究目的,我必须自己完成网络部分,而不是依赖Unity提供的内容。 – CherryQu

回答

1

最好先初步了解冻结的来源,即是否由于等待锁定?由于解析?由于GameObject实例?三个全部?

Unity Profiler (Pro only)

通用的解决方案:

  • 如果暂停是由于锁,试试你的缓冲拆分成 不同的垃圾箱,使主线程可以访问下一个非空 bin而不必获取锁,或者至少是这样一个粗粒度的锁。

  • 如果解析是放缓,您仍然可以在 后台线程中执行所有操作。在你最终必须实例化GameObjects之前尽可能地执行。

  • 如果它是实例GameObjects的最后一步,那么你 可以尝试preinstantiate你期待的对象,只是在新的网络数据重新配置 他们。或将瞬时过程划分为单独的递增阶段,并且不明显地小的暂停(例如,暂停)。首先是一个根节点,然后是下一个阶段,等等,直到完全重建。

+0

谢谢!我对我的游戏进行了描述,发现实例化的游戏对象部分占用了90%的时间。在实例化作业中,“Mesh.Bake Scaled Mesh PhysX CollisionData”占用了85.7%的时间...... – CherryQu