2010-08-26 21 views
1

我的場景有許多動態物體的堆棧。當模擬開始時,這些需要一段時間才能「解決」,然後才能成爲睡眠島。這在最初幾秒內會顯着影響性能。瞬間沉睡的動態物體堆棧

是否有技術安排堆棧,以便他們立即睡覺?

我正在使用PhysX。

+0

你能添加更多細節嗎? – 2010-08-26 13:53:39

+0

只是用一堆立方體來描繪場景。當模擬開始時,立方體都會彈起一點,直到最後達到靜止狀態。那麼由物理模擬器將立方體的集合標記爲「睡眠」,所以模擬成本顯着降低。我想知道是否有辦法讓立方體立即「解決」到他們的睡眠狀態。 – eed 2010-08-26 14:26:08

回答

0

我對PhysX並不熟悉,但我可以對它的工作方式進行一些教育性的猜測。這裏有一個或兩個想法可能會或可能不會工作取決於,例如,PhysX如何決定宣佈一個對象「已解決」:

如果塊實際上正在移動,這可能是因爲它們的初始位置存在一些不精確性,這給了他們解決的空間。也許有一種方法可以減少不精確性,例如通過保存已解決的配置而不是依靠紙上設計的配置。由於它們最終停止,所以在工作中必須有耗散力(例如摩擦力),並且它必須有一個參數。所以先把它翻起來,好像塊被浸入蜂蜜中,然後撥下來。

無論他們是否真的在移動,大塊不安的塔樓頂部的一個街區不可能安頓下來,直到它下面的所有街區都這樣做了,所以所有計算來模擬它的搖擺是完全是浪費 - 不要說它的不確定性可能會干擾下面的塊。因此,儘量成爲一名瓦工,先把底層物品放好,然後讓它們解決,然後按照你的方式(按照他們的說法,在「課程」中)。

如果你不能消除它,把它覆蓋;也許你可以在開始的幾秒鐘內隱藏塊,然後在解決問題後提升窗簾。這不會讓事情變得更快,但它可能會讓事情變得更加可觀。

1

您可以在啓動時使用

NxActor::putToSleep(); 

。這將大大提高場景表現。但是,如果堆棧中存在錯位的對象(即飛行立方體),它將不會掉下來,直到其他動態對象碰到它爲止。

這種方法似乎不適用於主動移動物體。例如,如果我的動態對象以5m/s的速度在我的場景中移動,並且如果我嘗試強制它進入睡眠狀態,putToSleep將不起作用(即使我先將對象的速度設置爲0,然後將其放到睡眠)

這是一種解決方法,如果您需要強制睡眠並禁用動態演員。

void setDynamicActorState(NxActor& actor, bool disabled) 
{ 
    if (nxActor.getNbShapes() > 1) 
    { 
     for (int i = 0; i < nxActor.getNbShapes(); i++) 
     {     
      nxActor.getShapes()[i]->setFlag(NX_SF_DISABLE_COLLISION, disabled); 
     }    
    } 
    else 
    { 
     if (disabled) 
      nxActor.raiseActorFlag(NX_AF_DISABLE_COLLISION); 
     else 
      nxActor.clearActorFlag(NX_AF_DISABLE_COLLISION); 
    } 

    for (int i = 0; i < nxActor.getNbShapes(); i++) 
    { 
     nxActor.getShapes()[i]->setFlag(NX_SF_DISABLE_SCENE_QUERIES, disabled); 
    } 

    if (disabled) 
    { 
     nxActor.raiseBodyFlag(NX_BF_KINEMATIC); 
     nxActor.putToSleep(); 
    } 
    else 
    { 
     nxActor.clearBodyFlag(NX_BF_KINEMATIC); 
     nxActor.wakeUp(); 
    } 
} 

這對於演員,碰撞,現場查詢等我用這個策略來下載所有演員到現場,並隱藏不活動的對象禁用一切。輪到他們時,啓用他們,禁用他人。請注意,一次加載所有演員可能會消耗內存。