2013-07-02 74 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