Я пытаюсь найти рабочий шаблон для интерфейса.
Некоторая информация о том, что я делаю. Я реализую движок рендеринга в dx11. Моя цель состоит в том, чтобы предоставить простой и высокоинтерфейсный движок, где клиент не должен иметь никаких знаний о dx11 или передовых методах рендеринга.
У меня есть свой Двигатель, и эти двигатели предоставляют функции для установки и создания любых объектов, рельефа, солнца, освещения, воды, горизонта и / и.
Теперь я подхожу к своему вопросу. Мой так называемый MeshController движка предоставляет эти 3 метода (код упрощен):
//check if that description already exists (if not create it) and return that id
UINT addDesc(const MESH_ENTITY_DESC& desc);
//create an instance of the given object
MeshEntity* createInstance(const UINT descID);
//destroy the instance
void destroyInstance(MeshEntity* entity);
Чтобы клиенты не имели дело с указателями, я пытаюсь упаковать их в класс-обертку, который будет выполнять проверки nullptr, проверять, уничтожена ли сущность или уже создана, и так далее.
Упаковочный:
class MeshObject
{
private:
UINT g_Desc;
MeshEntity* g_Entity;
}
Теперь я хочу, чтобы объект всегда был в допустимом состоянии. Если экземпляр не будет уничтожен до потери объекта-оболочки, это создаст утечку памяти (не совсем, но мой контроллер будет отображать его до закрытия сцены или заблокирует слот экземпляра, в целом клиент потеряет контроль над экземпляр). Итак, моя первая мысль была такая:
//constructor
MeshObject(const MESH_ENTITY_DESC& desc)
{
g_Desc = Controller::addDesc(desc);
g_Entity = Controller::createInstance(g_Desc);
}
//copy constructor
MeshObject(const MeshObject& mo)
{
g_Desc = mo.g_Desc; //no need of adding desc, already exists
g_Entity = g_Entity; // no need of recreation? or should i also create a copy of the rendered object in the controller, so duplicate it?
}
MeshObject& operator=(const MeshObject& mo)
{
g_Desc = mo.g_Desc; //no need of adding desc, already exists
g_Entity = g_Entity; // definitly no need of recreation
}
~MeshObject()
{
Controller::destroyInstance(g_Entity);
}
Из-за правила трех, мне нужны операторы копирования и присваивания. Но есть проблема. Методы createInstance и destroyInstance имеют много накладных расходов из-за добавления / удаления в / из сцены, возможно, воссоздания буферов рендеринга …
Поэтому теперь я пытаюсь найти какой-либо способ предотвратить уничтожение объекта, если он был скопирован ранее, или если на него есть действительная ссылка (указатель). Это не типичное динамическое распределение памяти, а какое-то распределение в моем контроллере.
Типичный вариант использования клиента:
std::vector<MeshObject> moVector;
for(int i = 0; i < blabla; i++)
{
MeshObject mo(someDescription); // created object in controller
//do lot of init stuff, like position, rotation, ...
mo.pushback(mo); // here mo will be copied, try to avoid double creation
} // here mo will lose scope and will be destroyed, stop destroying because there is a valid wrapper object
Вот изображение для мотивации ^^
Спасибо за любую помощь!
Задача ещё не решена.
Других решений пока нет …