Лекция #2: Ресурс менеджеры [Лектор - Zeux]
Автор: Арсений Капулкин
[23:35] <Zeux> короче так
[23:35] <Zeux> сначала я скажу о том, что такое ресурс и что должны будут уметь делать ресурсные менеджеры
[23:36] <Zeux> ресурс - это некие данные, загруженные/созданные с некими параметрами. Уточнения бессмысленны и бесполезны :)
[23:36] <Zeux> пример - текстура, загруженная с генерацией мип-уровней box фильтром
[23:36] <Zeux> пример - шейдер, загруженный с установкой определенных дефайнов
[23:37] <Zeux> пример - меш, загруженный в некоторый пул с правами доступа
[23:37] <Zeux> пример 2 - текстура, загруженная с генерацией мип-уровней другим фильтром (mitchell)
[23:37] <Zeux> итак, главное
[23:38] <Zeux> ресурсы считаются идентичными, если совпадают и источники данных, и параметры, но не произведено никакой последующей модификации пользователем системы
[23:38] <Zeux> две текстуры, загруженные с одними параметрами из одного файла, считаются идентичными, если им не поменяли пиксели
[23:39] <Zeux> итак, это была преамбула
[23:39] <Zeux> амбула: ресурсный менеджер должен уметь:
[23:40] <Zeux> 1) создавать ресурсы. Сюда входит как создание динамических ресурсов (т.е. без источника данных, но с параметрами), так и загрузка ресурсов из файла/из других источников (процедурные текстуры - источник не файл, но некоторый алгоритм генерации; об этом позже)
[23:41] <Zeux> 2) осуществлять механизм кэширования. То есть, при загрузке ресурса с теми же параметрами и из того же источника менеджер должен взять ресурс из кэша - если не отключено кэширование глобально/локально
[23:41] <Zeux> 3) осуществлять механизм перезагрузки/пересоздания - об этом позже немного, когда про параметры будет
[23:41] <Zeux> 4) осуществлять грамотную реакцию на lost device scenarios
[23:41] <Zeux> то есть:
[23:41] <Zeux> сохранять или перезагружать все ресурсы, для которых это возможно
[23:42] <Zeux> все изменения, внесенные пользователем после загрузки, теряются или нет в зависимости от параметров (обычно - пул)
[23:42] <Zeux> т.е. если загрузил в дефолтовый пул без локальной копии и поменял там пиксели, а потом девайс ресетнулся - сам дурак, пиксели вернутся в прежнее состояние
[23:43] <Zeux> ну и наконец 5) добавление новых типов ресурсов/форматов ресурсов не должно требовать переделки всей ресурсной системы :) и в идеале не должно вообще менять существующий код
[23:43] <Zeux> последнее - 6) дисклаймер: это все реализовано и работает :)
[23:44] <Zeux> вот, теперь подробнее. Начну с параметров, потому что это один из ключевых моментов
[23:45] <Zeux> Сначала я скажу про параметры. Потом скажу, какими должны быть на мой взгляд менеджеры (какие и какими). Потом - детали.
[23:46] <Zeux> Итак, параметры. Можно привести несколько стандартных параметров для, скажем, текстур. Это - pool, сжатие, количество мип-уровней, фильтрация мип-уровней, эффект, применяемый к изображению - чуть ниже об этом :) сорри за отсылки вниз
[23:46] <Zeux> при этом удобно говорить о стандартных значениях параметров, причем - ! - в контексте не всех ресурсов одного типа сразу, а в контексте некоторой логически объединенной группы
[23:50] <Zeux> пример: у нас до фига памяти жрется на уровень. Надо default pool для уровня установить в default, а не в managed.
[23:50] <Zeux> пример еще: для шрифтов вырубаем мип-фильтрацию, для всех остальных - нет
[23:51] <Zeux> пример глобальных параметров, когда они нужны: например, ставим pin-ы для шейдеров (define-ы) в зависимости от карточки (это можно делать не через рес. систему)
[23:51] <Zeux> еще хороший пример параметров будет в связи с эффектами текстур, опять же - be patient :)
[23:52] <Zeux> вот, или наоборот - текстур у нас немного, но надо сделать очень быстрое восстановление из lost device
[23:52] <Zeux> в этом случае managed ресурсы рулят по скорости, есть смысл установить их глобально как pool
[23:53] <Zeux> последний пример: для процедурных текстур managed достаточно бессмысленен, если алгоритм генерации достаточно быстрый - он только ест память.
[23:53] <Zeux> Итак, налицо некоторые группы. Группы, различающиеся как принадлежностью к конкретному подтипу ресурсов (процедурные текстуры, etc.)
[23:54] <Zeux> так и различающиеся логикой применения, т.е. уровень, GUI-текстуры (шрифты, etc.), etc.
[23:54] <XperienS> ага, то есть для текстур можно выделить проц, шрифты и азерс
[23:54] <Zeux> например
[23:54] <Zeux> конкретное разбиение, безусловно, зависит от приложения
[23:55] <Zeux> Едем дальше. Пока что мы видим для типа ресурса разбиение на группы. При этом набор параметров для разных типов ресурсов различается (текстуры, шейдеры), набор групп - тоже
[23:56] <Zeux> Набор типов ресурсов может быть захардкоден, группы - непонятно. Тут YMMV, в зависимости от того, что больше надо - расширяемость или наоборот цельность
[23:57] <Zeux> итак, отсюда следует постулат номер 1 - ресурсные менеджеры для разных типов ресурсов - это разные сущности
[23:57] <Zeux> и постулат 2 - в каждом ресурсном менеджере должны хранится параметры по-умолчанию для групп
[23:58] <Zeux> давайте break на 5 минут, потом дальше. Пока можно вопросы :)
[00:07] <Zeux> Итак, еще раз - НАБОР параметров фиксирован для ТИПА ресурса, т.е. для КОНКРЕТНОГО ресурсного менеджера. Т.е. говорится "текстура может иметь только мип-фильтрацию и цвет" (нет параметра цвет, нет, это я так :))
[00:07] <Zeux> это говорится на стадии дизайна системы
[00:07] <Zeux> дальше - сейчас скажу.
[00:08] <Zeux> Чтобы понять, где, как и почему хранятся параметры, нужно разобраться - а зачем нам их вообще хранить? :)
[00:08] <Zeux> случай 1: device loss. Если удалось просто тупо восстановить данные из памяти - очень хорошо
[00:08] <Zeux> не надо ничего делать, более того - d3d сделает все за нас.
[00:09] <Zeux> Если нет, то ресурс должен сохранить свои данные полностью, т.е. ресурс после device loss должен быть идентичен ресурсу до device loss (см. определение в начале, за исключением замен юзера)
[00:09] <Zeux> соответственно, для каждого ресурса надо хранить набор параметров, с которыми он был загружен
[00:09] <Zeux> где его надо хранить - вопрос отдельный.
[00:10] <Zeux> Но при загрузке параметры загрузки должны куда-то сохраниться, а не быть выкинутыми на ветер
[00:10] <xmvlad> да пусть ресурс их и помнит ? %)
[00:11] <Zeux> Это неважно, обсудим потом :)
[00:11] <Zeux> Главное, где-то они должны быть
[00:11] <Zeux> Итак, случай 2
[00:12] <Zeux> разрекламированная мной перезагрузка ресурсов. Чтобы в него врубиться, надо вкратце описать загрузку ресурсов
[00:12] <Zeux> Итак, пойнт очень простой - есть параметры по-умолчанию
[00:12] <Zeux> значит должна быть возможность загрузить ресурс с ними в качестве параметров
[00:13] <Zeux> или загрузить ресурс со своими параметрами (т.е. часть из параметров по-умолчанию переопределить)
[00:13] <Zeux> пример: вообще-то для текстур уровня у нас поставлен default pool, но вот на этой текстуре чел будет рисовать граффити
[00:13] <Zeux> ее надо сделать managed
[00:14] <Zeux> пример: вообще-то весь наш GUI погано выглядит с мипмаппингом, но вот эту текстурку мы будем растягивать, поэтому она без мипмаппинга выглядит еще хуже, чем с ним
[00:15] <Zeux> Пока в детали не вдаюсь, оставляю это на конец лекции
[00:16] <Zeux> итак, а теперь feature.
[00:16] <Zeux> Собственно, этой feature не было бы, если бы не было настроек игры :) в самой игре
[00:16] <Zeux> то есть когда меняешь всякую ерунду, жмешь ok и оно применяется. Разные игры здесь следуют разными путями
[00:17] <Zeux> в принципе, в каких-то случаях (про это говорил, кажется, Руслан) вполне допустимо для игры просто делать чистый старт
[00:17] <Zeux> т.е. все поубивали, загрузили по новой с новыми параметрами
[00:18] <Zeux> это не наш метод :) потому что у нас тут mega-advanced-lecture. Ну и вообще, такой подход оправдан далеко не всегда, т.к. нужна тогда очень быстрая загрузка
[00:18] <Zeux> а это - отдельная история
[00:19] <xmvlad> изменени настроек one-time процедура, поэтому можно все и перезагрузить
[00:19] <Zeux> можно, я не спорю. Другое дело, что все-таки часто это долго и не нужно. НО - повторюсь - это ВПОЛНЕ приемлемое решение.
[00:20] <Zeux> Просто я описываю другой вариант. О достоинствах и недостатках полной перезагрузки можно поговорить в конце.
[00:21] <Zeux> вообще, стоп, поговорим сейчас. Ты играл в HL2? Quake4? Видел, сколько там грузится все? :)
[00:21] <Zeux> если мне пришлось бы при изменении настроек столько ждать, я бы лично умер
[00:21] <MiF> я уже умер
[00:21] <MiF> в hl-2
[00:22] <MiF> да, там полный релоад при изменении настроек рендера
[00:22] <xmvlad> и ? в начале ставишь что тебе надо и все
[00:22] <MiF> поставил relfect all
[00:23] <MiF> посмтрел - нафиг не надо, а тормозит
[00:23] <xmvlad> ну поэкспереминтировал немного
[00:23] <MiF> и опять 5 минут ждешь сидишь
[00:23] <MiF> ужас
[00:23] <MiF> на нервы действует нереально
[00:23] <xmvlad> да прям 2 мин
[00:23] <Zeux> короче, это не наш метод :)
[00:23] <MiF> 3-5 минут один лоад
[00:23] <MiF> после каждого изменения
[00:23] <xmvlad> не знаю у меня максимум 20 минут ушло :))
[00:24] <Zeux> это же кошмар - 20 минут на настройку рендера
17 января 2006 (Обновление: 20 янв 2006)