Шаблоны проектирования в игровой физике

В рамках ряда хрустящих совместимых языков программирования (скажем, C ++), что было бы изящным решением для добавления обновления объекта для самозахвата, внешнего столкновения и интеграции (Euler и т. д.)? (скажем, уже оскорбленная система массовых весов).

Скажите, что класс объекта:

class DeformableObject
{
    public:
    DeformableObject();
    virtual ~DeformableObject();
    protected:
    vector <vec3<Real> > pos;
    vec3<real> fEval(int idx); // - the internal force due to ellasticity at the idx-th node
    friend class Integrator;
}

Например, в случае метода интеграции я думал о том, что у меня есть абстрактный класс Integrator и извлекается из него для добавления определенных методов (Euler, Verlet, Midpoint, вы его называете).:

class Integrator
{
    public:
    Integrator();
    virtual ~Integrator();
    vec3<Real> Step(Real DTime, DeformableObject * dObject, int idx); 
}

Теперь, поскольку я хотел бы переключиться или, возможно, позволить различным экземплярам одного и того же деформируемого объекта использовать метод интеграции A, а другой использовать метод интеграции B (для целей «бенчмаркинга»), безопасно ли «думать внутри коробки» "и обратитесь к шаблону Мост или Стратегия ? Что более подходит и менее двусмысленно, особенно с точки зрения производительности?

Как насчет подхода к управлению самоконтролем? Должен ли я просто добавить метод self collision в класс DeformableObject или «подружиться» с классом Collider? А как насчет внешних столкновений с разными объектами - как к этому аспекту следует подходить, по крайней мере, на концептуальном уровне: рассматривая наивные, грубые пары-парные запросы на столкновение, если сталкиваются два объекта, их точки должны обновляться в смысле что скорости и силы добавляются к собственным динамическим величинам точек (например, силы реституции, силы наказания, силы трения, отраженные скорости, изменения скорости сохранения импульса и т. д.). Я знаю, что это широкая тема, но я не знаю, какая книга справляется с этими естественными проблемами для начинающего программиста. Спасибо за ваше терпение в чтении этого вопроса!

3 голоса | спросил teodron 24 Maypm12 2012, 17:16:52

1 ответ


3

Если вы ищете скорость и элегантность, рассмотрите возможность перехода от объектно-ориентированного дизайна к более ориентированному на данные решению. В вашем дизайне есть несколько серьезных проблем с производительностью. Первый - это использование виртуального деструктора (что хорошо для большинства объектно-ориентированных дизайнов и лучшей практики C ++, но абсолютного убийцы производительности на небольших объектах). Второй большой - использование std: vector (то есть динамического распределителя памяти) в вашем деформируемом объекте. Это убивает когерентность кеша.

Я бы рассмотрел следующие источники: хорошие прыжки с очков:

http://gamesfromwithin.com/data-oriented-design

http: //solid- angle.blogspot.com.au/2010/02/musings-on-data-oriented-design.html

http://macton.smugmug.com/gallery/8936708_T6zQX#593426709_ZX4pZ ( Это немного больше связано с физикой).

Во всяком случае, если вы придумали хороший объектно-ориентированный дизайн, вам понравится, во что бы то ни стало его использовать. Но помните, что ориентированный на данные дизайн почти наверняка превзойдет его в производительности.

ответил Darcy Rayner 24 Maypm12 2012, 18:28:19

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132