![]() |
Описатели (Descriptors)
в своем движке применяю такую технику - объекты (движОк, текстура, окно, шрифт) создаются не через параметры, например:
Код:
Texture *tex = eng->LoadTexture("somefile.jpg",TF_ANISOTROPIC,TBM_ADD) Код:
Font *fnt = eng->LoadFont("Times New Roman",14,FF_BOLD,FM_TEXCASH) Код:
Texture * tex = eng->LoadTexture(TextureDesc("somefile.jpg").blend(TBM_ADD)); Код:
Font *fnt = eng->LoadFont(FontDesc("Times New Roman").bold(1)); * обычно - больше букаф * дополнительный класс на объект плюсы техники: * в сочетании с патерном мост облегчает несколько сопровождение кода при добавлении нового параметра (не нужно менять список параметров конструктора(ов) в IObject.h, CObject.h и CObject.cpp) * можно хранить дескриптор в объекте и пользоваться фишками типа: Код:
Font *newfont = eng->LoadFont(oldfont->GetDescriptor().bold(0)); * можно пользоваться чем-то вроде именованных параметров, при грамотном определении умолчаний можно существенно сократить количество вводимых параметров. * можно использовать "специальные" конструкторы. например для текстуры size(int) будет задавать одновременно и ширину и высоту (и глубину, если текса трехмерная) * инвариант параметров. например ширина окна не может быть больше ширины дисплея, если только окно не фейковое. Правда его прийдется в конструкторе класса один фиг проверять снова, так как члены данных придется делать открытыми, чтобы конструкторы объектов имели к ним доступ. ненадежно. |
Ответ: Описатели (Descriptors)
А можно попробовать объединить Описатель и класс IObject. Если к CObject применить умные указатели (которые считают количество ссылок на объект), то CObject достаточно создать один раз а IObject будет и как Описатель и как Указатель - то есть можно работать с CObject через разные Описатели. Если у Object много общих ресурсов но по разному параметризированных то это сильно сократит расходы памяти. К тому же Object будет всегда гарантировано удаляться если даже заранее не известна последовательность вызовов delete из разных потоков.
Цитата:
|
Ответ: Описатели (Descriptors)
Samodelkin
Цитата:
правда если происходит создание основных структур данных, к которым критично время доступа, нужно заранее побеспокоится о фрагментации данных, кеш промахах и выравнивании Цитата:
|
Ответ: Описатели (Descriptors)
Вот вобщем попробовал совместить умный указатель с описателем. Конечно тут еще много чего не реализовано, но я буду продолжать.
Цитата:
Цитата:
Еще хочу обратить внимание на важную вещь - кеширование данных в том смысле что например если несколько указателей-описателей запрашивают одну и туже функцию с одинаковыми параметрами (например нахождение пути в одних и тех же точках) то можно же запомнить результат и не считать его каждый раз. Тут вообще много места для динамического программирования. DescTest.cpp Код:
Код:
|
Ответ: Описатели (Descriptors)
Samodelkin, интересная идея,но я их задумывал несколько для других целей.
состоянее объекта определяется описателем в момент конструирование. само конструирование весьма дорого, я пожалуй перейду к шрифтам, маслить абстрактно не хватает вычислительной мощи))) вобщем допустим у нас есть некий описатель шрифта для гуй Цитата:
Цитата:
то, что ты предлагаешь, кстати, напоминает паттерн Приспособленец (Flyweight) http://www.citforum.ru/SE/project/pattern/#3.1.8 |
Часовой пояс GMT +4, время: 13:40. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot