Я написал небольшой игровой движок на с ++, и он работает нормально, но это не самая лучшая производительность.Я также многому научился и хочу переделать это сейчас.Но в прошлый раз я интенсивно использовал shared_ptr для таких классов, как текстуры графического интерфейса и обертки моделей (которые содержат, например, 3d-позицию и opengl vao).Я слышал, что shared_ptr на самом деле не должен использоваться, но я действительно не знаю, как сделать это любым другим способом.Вот макет, подобный псевдокоду:
Этот код не завершен или не работает, но я хочу поделиться идеей моего макета
// d3 stands for 3d
class D3Model {
VAO vao;
bool useBloom;
unsigned int texture;
// ... and so on
static std::vector<std::shared_ptr<D3Model>> models; // current idea, approach 1
static std::vector<D3Model> models1; // different approach (2)
D3Model() {
models.push_back(shared_from_this()); // app.1
models1.push_back(*this);
}
}
// main file
int main() {
std::shared_ptr<D3Model> model = std::make_shared<D3Model>();
model->setTexture(0); // ignore the non sense content
D3Model model1;
model1.setTexture(0); // would not get updated in the vector
while(true) {
model->increaseRotation(1);
model1.increaseRotation(1);
Renderer::render();
}
}
// different file
class Renderer {
static void render() {
for(const auto& all : D3Model::models) {
// render model
}
for(const auto& all : D3Model::models1) {
// render model1, would not have increased rotation
}
}
}
Для более ясного представления представьте следующее использованиеДвижок: после нажатия кнопки воспроизведения на стартовом экране движок загружает из файлов несколько 3d-моделей и сохраняет их.Один из них вращается каждый кадр, и каждый из них отображается.Может быть, некоторые другие модели должны быть загружены после из-за изменения в игровом процессе (игрок присоединился ...).Затем все они удаляются, когда пользователь возвращается в главное меню.Моя проблема с подходом 2 состоит в том, что мне придется обновлять вектор каждый раз, когда вращение модели увеличивается, тогда как это будет автоматически обрабатываться при подходе 1. Однако я слышал, что shared_ptr плохо влияет на производительность.
Является ли shared_ptr для этого случая лучшим решением или я должен просто использовать обычные объекты?Но моя проблема в том, как бы я применил изменения к объекту (например, setTexture) без необходимости обновления векторного содержимого.И сырые указатели тоже не очень хороши.Как это сделать?Спасибо, нереально