Делаю свою UI библиотеку. И тут возник вопрос как лучше хранить/управлять изображениями. На данный момент все реализовано следующим образом:
В классе Window присутсвует хранилище - ассоциативный массив, где ключ путь до изображения а значение - класс Texture. Сами изображения загружаются и хранятся непосредственно в GPU, поэтому хранить их выше окна не получится. В классе Renderable метод SetBackground(Brush) - устанавливает фон элемента. Brush соотвенно может принимать цвет и путь до изображения. В методе Render того же класса лениво создается текстура для установленного изображения. Создание ее происходит через обращение к окну, т.е с начало идет проверка загружено уже оно, и если нет то загружается и добавляется в хранилище и потом передается обратно и кешируется в объекте. Время жизни текстуры определяется интрузивным подсчётом ссылок.
Рассмотрим следующий пример:
Для элемента CheckBox нужны два изображения для двух состояний. Допустим мы сменили состояния и теперь обе текстуры, хоть и не большие хранятся в хранилище окна. Что удобно если нам нужен еще такой элемент то будет использывать тот же объект текстуры. Но может и нет и таких текстур который бездействуют может быть много. И как тогда управлять их временем жизни? Сделать таймер который условно будет проверять а не используется ли текстура? Не уверен в этом. Что пожете подсказать?
Dyikot, так говорю же — определитесь с требованиями сначала. Вы какую именно проблему хотите решить? Какой результат вы хотите получить? Сформулируйте проблему, требования к решению, определите ограничения, проведите исследования и испытания. И уже потом разработайте конкретный алгоритм для решения конкретной задачи, протестируйте его, испытайте, доработайте или переработайте. Что именно из всего этого не получается? На каком этапе сложности?
у меня в движке аналогичная штука — решилось LRU кешем. если рефкаунт текстуры упал до 1 (только хранилище её держит, никто не рисует), помечаешь как кандидата на выброс. чистишь при аллокации новой текстуры или по лимиту видеопамяти. таймер не нужен, давление на vram само подскажет когда удалять