мгновенно спящий стек динамических объектов - PullRequest
1 голос
/ 26 августа 2010

В моей сцене несколько стеков динамических объектов. Когда начинается симуляция, им требуется некоторое время, чтобы «рассосаться», прежде чем они станут спящими островами. Это существенно влияет на производительность в течение первых нескольких секунд.

Существуют ли способы расстановки стеков так, чтобы они сразу спали?

Я использую PhysX.

Ответы [ 2 ]

1 голос
/ 09 марта 2011

Вы можете использовать

NxActor::putToSleep();

при запуске. Это значительно повысит производительность сцены. Однако, если в вашем стеке есть неуместные объекты (то есть летающий куб), он не упадет, пока на него не попадут другие динамические объекты.

Этот подход, похоже, не работает на активно движущихся объектах. Например, если мой динамический объект движется со скоростью 5 м / с на моей сцене и если я пытаюсь перевести его в спящий режим, метод 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();
    }
}

Это отключит все для актера, столкновений, запросов сцены и т. Д. Я использую эту стратегию, чтобы предварительно загрузить всех актеров на сцену и скрыть неактивные объекты. Когда наступит их очередь, включите их, отключите других. Помните, что загрузка всех актеров одновременно может потреблять память.

0 голосов
/ 27 августа 2010

Я не знаком с PhysX, но могу высказать некоторые догадки о том, как он работает.Вот одна или две идеи, которые могут работать или не работать в зависимости, например, от того, как PhysX решает объявить объект «разрешенным»:

Если блоки на самом деле движутся, это, вероятно, из-за некоторой неточности в их начальномместо, которое дает им возможность поселиться.Может быть, есть способ уменьшить эту неточность, например, сохраняя разрешенную конфигурацию вместо того, чтобы полагаться на одну, разработанную на бумаге.Поскольку они в конечном итоге останавливаются, на работе должна присутствовать рассеивающая сила (например, трение), и она должна иметь параметр.Так что сначала поднимите его высоко, как будто блоки погружены в мед, а затем наберите его.

Независимо от того, движутся ли они на самом деле, блок наверху большой дрожащей башни блоков можетвозможно, не успокоятся, пока все блоки под ним не сделают этого, поэтому все расчеты, имитирующие его покачивание, полностью напрасны - не говоря уже о том, как его неопределенность может нарушить блоки ниже.Поэтому постарайтесь быть каменщиком, сначала разместите нижние объекты, дайте им разрешиться, а затем двигайтесь вверх (как говорится, в «курсах»).

Если вы не можете устранить это, закройте его;может быть, вы можете спрятать блоки в течение первых нескольких секунд, а затем поднять занавес, как только они будут решены.Это не делает вещи быстрее, но это может сделать вещи более презентабельными.

...