2015-02-24 26 views
1

我正在做一個Voxel遊戲,我的引擎正在使用Physics.raycasts和Mesh碰撞器來獲取您點擊的塊的座標,直到現在。我決定刪除網格對撞機,因爲在某些情況下它只是吃了太多的性能,我在幾秒鐘內將fps下拉到0.1fps(例如,你應該能夠在Y層上滾動),我只需要它用於光線投射。我不使用任何其他物理相關的東西。如果沒有網狀碰撞器,幀率穩定在60到100 fps,但是現在我發現很難找到另一種獲取關於我點擊哪個塊的信息的方法。沒有使用碰撞器的Raycast

有什麼建議嗎?

到目前爲止,我用這段代碼:

public Vector3? GetBlockCursor(){ 
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
    RaycastHit hit; 

    if(Physics.Raycast(ray, out hit)) { 
     hit.point += (hit.normal * -0.5f); 
     hit.point = new Vector3(Mathf.RoundToInt(hit.point.x), Mathf.RoundToInt(hit.point.y), 
           Mathf.RoundToInt(hit.point.z)); 
     return hit.point; 
    } 
    else return null; 
} 
+0

https://www.youtube.com/watch?v=qdwUkYrHosk這個人統一了我的世界。他表示,他用箱式對撞機表現出色。雖然我不知道箱子碰撞器是否適合您的需求,因爲體素引擎並不一定意味着完美的方塊。 – Michael 2015-02-24 21:24:28

+0

謝謝,我現在要檢查視頻!我只是在發佈後立即轉向Box Colliders,這是一個顯着的性能提升! – 2015-02-24 22:39:56

+0

不幸的是,它的速度有點快,我不是創建一個Minecraft遊戲,而是擁有一個Gnomoria或Towns引擎... – 2015-02-24 22:56:34

回答

2

很難說,因爲它總是取決於遊戲邏輯哪些地方的優化是有效的。基本上每幀一個或幾個光線投射對於PhysX來說應該不是什麼大問題,所以我認爲還有其他的罪魁禍首。一些建議(也許你已經考慮過了):

  • 使用複合對撞機,特別是盒子和球體。 Rigidbody manual
  • 始終通過調用它的每2或3只更新
  • 如果你需要一個以上的光線投射考慮使用附加的剛體到移動項目
  • 限制的呼籲GetBlockCursor一次每次更新或甚至更少Physics.RaycastAll
  • 如果物理引擎是造成顯著的幀速率下降,請檢查您是否可以使用優化計算
  • 使用Profiler(前提是你有專業執照)
+1

感謝您的回答!花費一些時間重新安排GetBlockCursor()函數後,它現在可以很好地處理Box Colliders,它比Mesh Colliders快得多。問題在於並非是光線投射,而是重新計算了我正在做的網格對撞機,這隻需要太多時間。即使沒有Mesh Collider,我現在也有一個精確的選擇,但是使用一些數學來代替。 – 2015-02-25 03:00:56