Я бы предложил вам использовать boost::shared_ptr
для этих структур позиций.Таким образом, вам не нужно беспокоиться об удалении, и вы можете использовать его как указатель, который используется совместно с объектом игрового движка, или как автономный указатель.
Так как для этого есть служебные данные,Вы могли бы хотеть ограничить отношение данных к указателю.Другими словами, не сохраняйте shared_ptr
для каждой координаты, но shared_ptr
для вектора положения и shared_ptr
для поворота, или shared_ptr
для однородного преобразования или фрейма (координата).система, кинетический кадр или кинетостатический кадр).
Например, вы можете получить следующее:
class object {
public:
typedef boost::shared_ptr<Vector3D> pVector3D;
private:
pVector3D position;
public:
object(pVector3D aPos = pVector3D(new Vector3D(0.0,0.0,0.0))) : position(aPos) { };
};
Свойство автоматического подсчета и подсчета ссылок для shared_ptr сделает его таким, чтобы вы выиграли 'Не нужно беспокоиться о том, чтобы поместить оператор удаления (автоматически), и нет опасности исчезновения объекта из игрового движка, в то время как физическому движку все еще нужны эти переменные (подсчет ссылок гарантирует, что они будут удалены только тогда, когда все объекты, которые в них нуждаются, являютсятакже удаляется).
РЕДАКТИРОВАТЬ
Я бы предпочел не использовать повышение.Однако я не против решения, которое требует шаблона.Кроме того, из-за того, что это частично является оптимизацией производительности, boost :: shared_ptr, кажется, не является правильным решением.
Ну, shared_ptr
/ shared_array
также можно найти в стандартной библиотекетехнический отчет 1 (TR1) (поэтому вместо него std::tr1::shared_ptr
, поэтому вам не нужно использовать Boost для их использования).Что касается оптимизации производительности, поэтому я рекомендую довольно высокое соотношение данных к указателю.Накладные расходы на shared_ptr - это, в основном, накладные расходы памяти и некоторая косвенность при удалении и копировании (это две операции, которые выполняются не так часто), я не думаю, что при доступе к данным, на которые он указывает, слишком много накладных расходов по сравнению с обычнымиуказатель или ссылка.Вы должны признать, что даже используя ссылки, вы торгуете накладными расходами на копирование данных с накладными расходами на косвенный доступ к данным (вы также жертвуете локальностью памяти, что очень важно!).Я бы сказал, что падение производительности, связанное с нарушением локальности памяти, будет намного хуже, чем просто косвенное обращение.Таким образом, когда дело доходит до доступа к элементам, IMO, shared_ptr, необработанные указатели и ссылки будут иметь очень небольшую разницу в производительности.Во многих алгоритмах, которые используют эти общие переменные, вам, вероятно, было бы лучше скопировать данные, на которые указывает указатель / ссылка на локальные переменные, вычислить с этими локальными переменными и на них, а затем скопировать их обратно в память, указанную указателем/reference.
Я рекомендую вам провести некоторые собственные тесты производительности при использовании любого из решений (с использованием shared_ptr, с использованием ссылок или необработанных указателей и копированием данных между игровым движком и физическим движком) и посмотретьдля себя вы можете быть удивлены тем, что найдете.
EDIT2
Рассматривали ли вы использование схемы множественного наследования.Эта проблема, вероятно, может быть очень хорошо решена с помощью схемы наследования алмазов:
class PositionedObject {
protected:
float Position[3];
public:
PositionedObject(float x,float y, float z) { Position[0] = x; ... };
virtual ~PositionedObject() { };
};
class VisibleObject : virtual public PositionedObject { //note that the "virtual" keyword is critical here.
... rendering-related code ... i.e. the game-engine side of the implementation
};
class RigidBody : virtual public PositionedObject { //again "virtual" is very important.
... physics code here ...
};
class MyObject : public VisibleObject, public RigidBody {
... code specific to MyObject ...
};
Приведенные выше схемы заставляют физический объект и объект игрового движка совместно использовать одни и те же данные позиции (с небольшим косвенным обращением, небольшим объемом памятии небольшие проблемы с памятью).Я почти уверен, что это будет более эффективно, чем любая другая схема, но на аргументы о производительности можно ответить только результатами теста, которые вам придется сделать самостоятельно, если производительность действительно является вашей главной задачей (убедитесь, что вы не делаетепреждевременная оптимизация!).