Russian Qt Forum
Ноябрь 23, 2024, 16:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4 5   Вниз
  Печать  
Автор Тема: Пример проектирования  (Прочитано 25262 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #30 : Декабрь 18, 2010, 15:12 »

Ну так значит эту коллекцию ресурсов нужно держать в классе редактора.
Пользователь ткнул меню - загрузили картинку, положили в коллекцию, она осталась в кэше.
Ткнул в другом окне загрузить эту картинку, посмотрели - она есть в кэше, положили в коллекцию.
В двух коллекциях находятся только указатели на сами данные картинки.
Дальше пользователь ткнул выгрузить картинку из первого окна, она удалилась из его коллекции, но осталась в памяти для второго окна. Ткнул пользователь выгрузку этой картинки и из второго окна, она удалилась из коллекции и т.к. ее использовало только это окно - выгрузятся сами данные с вычеркиванием из кеша менеджера ресурсов.
То да, но как отслеживать все многочисленные изменения? Напр.

Дальше пользователь ткнул выгрузить картинку из первого окна,
Он не может так ткнуть. Вот проект пользователя который я использую для тестирования: пирамида (212) банок Pepsi-Cola. Все банки имеют одинаковую текстуру (наклейка Pepsi). Но в любой момент он может сменить текстуру на любой из банок. Или только на тех банках что он выбрал. Или на всех сразу (используя "мастер" текстуры). Или вообще выкинуть все/часть банок. А все открытые окна должны отобразить его действия.
Записан
ufna
Гость
« Ответ #31 : Декабрь 18, 2010, 15:22 »

Игорь, а как у Вас храниться текстура для модели? Обычной практикой является использование ссылку на объект, за жизнь которого отвечает менеджер ресурсов. И запрос "загрузи мне текстуру" отдает ему грубо говоря указатель, а не копию.
Записан
BRE
Гость
« Ответ #32 : Декабрь 18, 2010, 15:35 »

Он не может так ткнуть. Вот проект пользователя который я использую для тестирования: пирамида (212) банок Pepsi-Cola. Все банки имеют одинаковую текстуру (наклейка Pepsi). Но в любой момент он может сменить текстуру на любой из банок. Или только на тех банках что он выбрал. Или на всех сразу (используя "мастер" текстуры). Или вообще выкинуть все/часть банок. А все открытые окна должны отобразить его действия.
Соответственно, используем model/view.
В каждой модели есть менеджер текстур (все тоже о чем я и писал). 212 банок используют 1 текстуру. В кеше менеджера находится одна ссылка, текстура в памяти. Счетчик использования этой текстуры 212. Пользователь изменил текстуру на одной банке. Обратились в кэш, там ее еще нет, сгенерировали ее в памяти, поместили в кэш, назначили ее объекту "банке". shared_ptr на текстуру, которая была установлена для этой конкретной банки заменяется на новую. Соответственно, счетчик использования первой текстуры уменьшается на 1 и становится == 211, счетчик использования второй текстуры == 1.
Код
C++ (Qt)
typedef std::tr1::shared_ptr<Texture> TexturePtr;
class Banka ...
{
Banka()
{
m_tex = TexMan::load( "pepsi" );
}
 
void changeTex()
{
m_tex = TexMan::load( "coca" );
}
 
private:
TexturePtr m_tex;
};
 

Разрушили несколько объектов банок, разрушаться их объекты m_tex, уменьшив счетчик использования и при достижения 0 - данные о текстуре тоже разрушаться.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #33 : Декабрь 18, 2010, 15:47 »

Игорь, а как у Вас храниться текстура для модели? Обычной практикой является использование ссылку на объект, за жизнь которого отвечает менеджер ресурсов. И запрос "загрузи мне текстуру" отдает ему грубо говоря указатель, а не копию.
Ну вот так не надо  Обеспокоенный. Это все равно что я басиста спросил "а ты можешь сыграть "The Lemon Song" из второго альбома?". Разумеется менеджер есть, обсуждается как его довести до ума 
Записан
ufna
Гость
« Ответ #34 : Декабрь 18, 2010, 15:51 »

Ответ - могу ))

Просто по просмотру темы я совершенно не увидел как функционирует текущий менеджер ресурсов. Дали бы хоты бы хедеры для названных классов и в особенности менеджера.

Загрузка ресурсов в draw() - это конечно "О_о". И как раз стоит отталкиваться от того, что происходит у Вас, когда пользователь меняет текстуру. Что делается на данный момент?

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #35 : Декабрь 18, 2010, 17:21 »

В каждой модели есть менеджер текстур (все тоже о чем я и писал). 212 банок используют 1 текстуру. В кеше менеджера находится одна ссылка, текстура в памяти. Счетчик использования этой текстуры 212. Пользователь изменил текстуру на одной банке. Обратились в кэш, там ее еще нет, сгенерировали ее в памяти, поместили в кэш, назначили ее объекту "банке". shared_ptr на текстуру, которая была установлена для этой конкретной банки заменяется на новую. Соответственно, счетчик использования первой текстуры уменьшается на 1 и становится == 211, счетчик использования второй текстуры == 1.
Это именно то что нужно. Но как этого достичь? Где/как обновлять счетчик(и)? Мое мнение надо регистрировать текстуру (именно текстуру, а не картинку) для каждой машины. Что Вы об этом думаете? 

Загрузка ресурсов в draw() - это конечно "О_о". И как раз стоит отталкиваться от того, что происходит у Вас, когда пользователь меняет текстуру. Что делается на данный момент?
Ну в ситуации где собачья будка больше всего "движка" - нужно искать др. решения, цепляться за традиционный подход бесперспективно
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #36 : Декабрь 18, 2010, 18:30 »

Моральная поддержка (чтоб легче думалось) - вот банки  Улыбающийся
Записан
BRE
Гость
« Ответ #37 : Декабрь 19, 2010, 15:25 »

Это именно то что нужно. Но как этого достичь? Где/как обновлять счетчик(и)?
Учет счетчиков и удаление неиспользуемых объектов обеспечивает shared-указатели, а контроль единичной загрузки данных обеспечивает кэш.
Мой пример, который я выкладывал выше, это демонстрирует

Мое мнение надо регистрировать текстуру (именно текстуру, а не картинку) для каждой машины.
IMHO, лучше хранить и картинки и текстуры.
Каждая текстура должна содержит в себе shared-указатель на картинку, из которой она сгенерирована.
Каждый объект сцены должен содержать в себе shared-указатель (или указатели) на текстуры.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #38 : Декабрь 19, 2010, 15:37 »

Учет счетчиков и удаление неиспользуемых объектов обеспечивает shared-указатели, а контроль единичной загрузки данных обеспечивает кэш.
Мой пример, который я выкладывал выше, это демонстрирует
Если Вы имеете ввиду этот пример
Код:
class Banka ...
{
Banka()
{
m_tex = TexMan::load( "pepsi" );
}
то нет, не обеспечивает. Нет никаких оснований загружать ресурс если неизвестно будет ли он использован. Будем думать или догматуху гнать?  Улыбающийся
Записан
BRE
Гость
« Ответ #39 : Декабрь 19, 2010, 15:42 »

то нет, не обеспечивает. Нет никаких оснований загружать ресурс если неизвестно будет ли он использован. Будем думать или догматуху гнать?  Улыбающийся
Почему он не будет использоваться?  Улыбающийся
Мы создаем объект сцены "Банка", на которой есть текстура "Пепси колы". Что здесь не известно, будет ли сцене объект банка или что на банке будет текстура?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #40 : Декабрь 19, 2010, 15:58 »

Почему он не будет использоваться?  Улыбающийся
Мы создаем объект сцены "Банка", на которой есть текстура "Пепси колы". Что здесь не известно, будет ли сцене объект банка или что на банке будет текстура?
Неизвсестны все подробности машин(ы). Напр. может вообще не быть машин которые показывают этот 3D объект. Или они есть но переключены в режим(ы) где текстуры не нужны (напр wireframe и др) . Взаимодействие классов - самое сложное (я так думаю  Улыбающийся)
Записан
BRE
Гость
« Ответ #41 : Декабрь 19, 2010, 17:08 »

Неизвсестны все подробности машин(ы). Напр. может вообще не быть машин которые показывают этот 3D объект. Или они есть но переключены в режим(ы) где текстуры не нужны (напр wireframe и др) . Взаимодействие классов - самое сложное (я так думаю  Улыбающийся)
Ну если никто этот объект не показывает, то он и создан не будет и соответственно текстура тоже не загрузиться.
Движок работает с объектом сцены, сцена это коллекция объектов, каждый объект содержит в качестве одного из параметров shared-указатель на текстуру. Если там 0, то и текстуры для этого объекта не загружено.
Пользователь может меняет количество объектов на сцена и свойства этих объектов. Захотел он изменить текстуру, спросили у менеджера ресурсов, он вернет на нее ссылку, при необходимости загрузив, присвоили ее переменной. Захотел убрать текстуру - делаем reset() shared-указателю, если текстура больше никому не нужна, она выгрузится.
В чем проблема?  Строит глазки


« Последнее редактирование: Декабрь 19, 2010, 17:10 от BRE » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #42 : Декабрь 19, 2010, 17:15 »

Первое что приходит в голову - зарядить такой метод

Код
C++ (Qt)
bool Engine3D::IsTextureUsed( const Texture * ) const;
 

Ну или так

Код
C++ (Qt)
bool Engine3D::IsImageUsed( const Image * ) const;
 

Но так не катит. Машина не владеет ни объектами, ни их текстурами - а значит и конечными ресурсами. Машина просто рисует то что ей дали (учитывая свои опции установленные пользователем). Реально метод Draw выглядит так

Код
C++ (Qt)
void Engine3D::Draw( container <Object3D *> & iObject );
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #43 : Декабрь 19, 2010, 17:31 »

Ну если никто этот объект не показывает, то он и создан не будет и соответственно текстура тоже не загрузиться
Ну привет, объекты (Object3D) "первичны", они существуют всегда. Просто что и как отображать - дело пользователя.

текстура тоже не загрузиться
Текстура "что сделает?" - значит здесь мягкого знака нет. А вот напр. "почему бы текстуре не загрузиться?" - текстуре "что сделать?", значит мягкий знак есть (хотя слово то же самое). Пожалуйста не сочтите за нравоучение (как Вы говорите "без обид"). Просто не у всех мама была учителем русского языка  Улыбающийся
Записан
BRE
Гость
« Ответ #44 : Декабрь 19, 2010, 19:24 »

Ну привет, объекты (Object3D) "первичны", они существуют всегда. Просто что и как отображать - дело пользователя.
И что?  Улыбающийся
На сцене есть 212 объектов (банок), у каждого объекта есть поле текстуры. Если для этого объекта она установлена, значит эта текстура загружена в память. А при рендеринге, если пользователь выбрал режим без наложения текстур, эти текстуры не накладываются.

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

Это все можно посмотреть в том коде, который я приводил выше.
Записан
Страниц: 1 2 [3] 4 5   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.14 секунд. Запросов: 23.