Преимущества и недостатки классов stati c в c ++ - PullRequest
3 голосов
/ 24 апреля 2020

Я делаю небольшую игру на своем маленьком игровом движке, созданном на OpenGL и C ++. Я использую в своей игре класс stati c под названием ResourceManager, который отвечает за загрузку и возврат текстур, шейдеров, aud ios, et c. Это состояние c, поэтому я могу получить текстуры, шейдеры, Aud ios и др. c. в любом классе, например, игрок без инициализации, и его очень легко оценить. Но что, если мне нужны разные текстуры и aud ios для разных уровней, я должен перенести все загруженные текстуры и звуки предыдущего уровня на следующий уровень и продолжать добавлять их. И я думаю, что это не очень хорошая практика. Я должен загрузить необходимые текстуры и Aud ios для этого уровня и при переходе на следующий уровень удалить все текстуры и Aud ios и загрузить новые текстуры и Aud ios для этого уровня. Это сохранит мою память маленькой. Но я не могу сделать это с классами stati c, потому что у них нет деструктора конструктора.

Должен ли я использовать класс non-stati c для обработки ресурсов другого уровня.

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

Извините за очень плохой английский sh. Спасибо за чтение.

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

Шаблон Singleton кажется подходящим для того, чего вы пытаетесь достичь.

Он имеет гибкость обычного класса, но "глобальную" легкость доступа к данным * 1006. * -Только класс, который вы предложили.

1 голос
/ 24 апреля 2020

Я не разработчик игр, поэтому я не знаю каких-либо распространенных методов решения этих проблем специально для игр, но вот что я хотел бы сделать.

  1. Создание конвейера без сохранения состояния для загрузки ваши активы из постоянного хранилища (диска). Это может быть класс stati c или просто набор функций пространства имен. Этот конвейер предназначен только для загрузки ваших активов. Это не требует никакого владения или управления временем жизни этих активов.
  2. Создание кэша ресурсов с состоянием. Это может быть std::vector<MyTextures> или пользовательский тип, который содержит все ресурсы / ресурсы, необходимые для определенного уровня.
  3. Добавьте экземпляр этого кэша ресурсов в класс, который представляет ваш уровень, и загрузите ресурсы ( используя конвейер из шага 1) в кеш при инициализации вашего уровня (может быть в конструкторе или любой функции initialize или setup).
  4. Создать stati c (возможно, глобальный) экземпляр этот тип кэша ресурса. В этом объекте вы можете хранить все, что не связано с уровнем и переживает ваши уровни (например, текстуры игрока, звуковые эффекты, общие активы, ...).

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

...