#c #memory-management
#c #управление памятью
Вопрос:
Для управления различными ресурсами в моей игре (шрифты, растровые изображения и т.д.) Я хочу создать менеджеры, которые сопоставляют строки с любым ресурсом. И этот объект, когда выходит за пределы области видимости, освобождает всю память, используемую ресурсами.
Итак, в принципе, если вам нужен шрифт, вы должны либо добавить его, либо запросить со строкой, указывающей его имя, и он вернет указатель на него. Таким образом, пользователю никогда не придется управлять какой-либо памятью.
Хороший ли это дизайн для небольшой видеоигры?
Спасибо
Ответ №1:
То, что вы описываете, является шаблоном Factory в сочетании с интеллектуальным указателем / указателем с ограниченной областью действия.
Это довольно разумно. Просто подумайте, действительно ли вам нужно использовать строку для идентификации ресурса. Перечисления может быть достаточно.
Комментарии:
1. Действительно, очистка памяти должна быть быстрой, сравнение строк в лучшем случае происходит медленно по сравнению с перечислениями.
2. Такой подход был бы довольно разумным, но это не совсем то, что описано. Похоже, что ресурсы освобождаются только тогда, когда весь объект manager уничтожен, а не когда отдельный ресурс больше не нужен. Таким образом, отдельные ресурсы не управляются с помощью интеллектуального указателя.
3. @Wyzard Хм, я думаю, это можно прочитать обоими способами, но я думал, что этот OP означал, что каждый ресурс будет освобожден, когда он выйдет за пределы области видимости.
Ответ №2:
Здесь возникает проблема, если ваш менеджер возвращает обычные указатели — ресурсы будут зависать до тех пор, пока сам менеджер не будет уничтожен (что неэффективно, особенно для ресурсов, таких как растровые изображения), или пока вы не сделаете явный вызов диспетчеру, чтобы избавиться от них, чего может и не произойти, если генерируются исключения. Для менеджера было бы лучше возвращать какие-либо интеллектуальные указатели, которые могут информировать менеджера о завершении работы с ресурсом.
Комментарии:
1. 1 это напоминает мне реализацию «кэша», которая будет только заполняться, вплоть до того момента, когда память вообще не будет доступна. Хотя это и не утечка памяти (технически), это все равно означает, что потребление памяти было полностью несвязанным кхм …
2. @Matthieu Это также распространенная проблема с пользовательскими распределителями памяти, которые «решают» утечки памяти, скрывая их. И ранних реализаций LISP, я полагаю.
Ответ №3:
Это звучит как интеллектуальный указатель, если он автоматически освобождает себя, когда выходит за пределы области видимости.
Ответ №4:
Возможно, вы захотите рассмотреть boost::intrusive_ptr, чтобы все ваши объекты учитывали ссылки. Затем вы можете выполнить ручное удаление их из диспетчера, если вам нужно.
Конечно, вы можете написать свои собственные классы интеллектуальных указателей, или вы можете просто взять это у кого-то, у кого уже есть:
http://www.boost.org/doc/libs/1_46_1/libs/smart_ptr/smart_ptr.htm