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

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

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

Сообщений: 11445


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

Если для этого объекта она установлена, значит эта текстура загружена в память.
Ну так было бы жить легко и приятно. Но увы - не получается. Object3D может иметь текстуру, но совсем необязательно что она роялит - это зависит и от др. классов тоже (машин). Не расстраивайтесь, это (долбаное взаимодействие) реально сложно  Улыбающийся
Записан
BRE
Гость
« Ответ #46 : Декабрь 19, 2010, 20:11 »

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

Не расстраивайтесь, это (долбаное взаимодействие) реально сложно  Улыбающийся
А я и не расстраиваюсь.  Смеющийся
Сложным это взаимодействие делает разработчик. Спроектировал фигню - получай головную  боль. Так и должно быть, все нормально, привыкай.  Подмигивающий
« Последнее редактирование: Декабрь 19, 2010, 20:24 от BRE » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Какое отношение имеет загрузка/выгрузка ресурсов к "рояленью" текстуры для отрисовки?
Да то самое: если ресурс не роялит (никому не нужен) - зачем его грузить?

Сложным это взаимодействие делает разработчик. Спроектировал фигню - получай головную  боль.
Кто ж спорит? Давайте спроектируем "не фигню".Что Вы предлагаете? Грузить "всех подряд" - ну так это уже было "до меня" (детали не важны), заказчика это не устраивает (по памяти и скорости), вот  и он обратился ко мне.

Так и должно быть, все нормально, привыкай.  Подмигивающий
Чем раньше Вы оставите менторский тон - тем лучше, и в первую очередь для Вас. То Вы для студенческих лаб будете демонстрировать виртуозную технику, а здесь надо напрягаться и выкладываться. Умеете ли? Или вся силенка ушла в дуст?  Улыбающийся
Записан
BRE
Гость
« Ответ #48 : Декабрь 19, 2010, 21:29 »

Да то самое: если ресурс не роялит (никому не нужен) - зачем его грузить?
Ну это выясняется только сейчас, да и то без конкретики. Извиняюсь, не протелепатировал.  Улыбающийся

заказчика это не устраивает (по памяти и скорости), вот  и он обратился ко мне.
А ты за решением обратился на форум и даже не потрудился сформулировать вопрос полностью.

Чем раньше Вы оставите менторский тон - тем лучше, и в первую очередь для Вас.
Тоже могу пожелать и тебе.

То Вы для студенческих лаб будете демонстрировать виртуозную технику
Ой, я бы с удовольствием делал.  Улыбающийся

а здесь надо напрягаться и выкладываться. Умеете ли? Или вся силенка ушла в дуст?  Улыбающийся
Точно. Напрягаться и выкладываться, а в первую очередь думать, а не искать решения на форумах.
Я изложил свою идею, теперь ты изложи свою. И посмотрим.

Умеете ли?
Кое что умею.  Подмигивающий
Записан
ufna
Гость
« Ответ #49 : Декабрь 20, 2010, 00:06 »

Irogs, Вы смешной Улыбающийся) Описанная проблема - это просто азы в области, в которой Вы еще пытаетесь кого-то учить. На самом деле забавляет.

Задача должна решаться комплексно. Лень разбираться в том как у Вас работаю классы и какие косяки.

Загрузка ресурса должна происходить в тот момент, когда модели назначается этот ресурс. Выгрузка (и/или проверка на "удаление") - когда модель удаляется или ей меняется текстура. Вопрос - где сложность Непонимающий

Если у Вас кастрированный менеджер ресурсов - пишите нормальный. Я еще раз спрашиваю - как у Вас происходит назначение текстуры для модели? Редактор, ок, хорошо, но есть момент когда происходит смена. Вот именно в тот самый момент из тех самых моментов должны происходить все действия менеджера ресурсов. Но ни в коем случае не в draw и т.п.

Вам дали уже несколько путей решения. И это - азы, это - основа любых 3д движков претендующих на что-то большее, чем демка для QtDemo.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

как у Вас происходит назначение текстуры для модели? Редактор, ок, хорошо, но есть момент когда происходит смена. Вот именно в тот самый момент из тех самых моментов должны происходить все действия менеджера ресурсов. Но ни в коем случае не в draw и т.п.
Максимально упрощенно: пользователь выбрал модель. Открыл стандартное окно "файл" и выбрал картинку. Создался объект Texture, который принадлежит Object3D. Этот объект Texture замещает имеющийся.

Простой способ: вот когда текстура назначена, тогда и загрузим ее картинку. Понятно картинки кэшируются и  одна и та же не грузится дважды. Это по существу так как сделано сейчас (неважно из какого метода). Работает плохо: часто память забита картинками которые нигде не отображаются. Паузы на загрузке проекта - тоже загрузка многочисленных ненужных имеджей. Задача иметь в памяти только те что отображаются хотя бы в 1 открытом окне.

Irogs, Вы смешной Улыбающийся)
Сначала разберитесь, а там видно будет кто смешной  Улыбающийся

2BRE: не злитесь  Улыбающийся
Записан
BRE
Гость
« Ответ #51 : Декабрь 20, 2010, 18:25 »

Простой способ: вот когда текстура назначена, тогда и загрузим ее картинку. Понятно картинки кэшируются и  одна и та же не грузится дважды. Это по существу так как сделано сейчас (неважно из какого метода). Работает плохо: часто память забита картинками которые нигде не отображаются. Паузы на загрузке проекта - тоже загрузка многочисленных ненужных имеджей. Задача иметь в памяти только те что отображаются хотя бы в 1 открытом окне.
Забавно. Ты описал то, что делает вышеприведенный пример.  Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Забавно. Ты описал то, что делает вышеприведенный пример.  Улыбающийся
Я уже раза 3 отвечал что нет  Улыбающийся Ведь Вы сказали загрузить имедж не сделав никаких проверок что он в использовании. А если даже предположить что Ваш load не грузит (пока) имеджа - не видно как Вы управляете счетчиком ссылок.
Записан
BRE
Гость
« Ответ #53 : Декабрь 20, 2010, 18:42 »

Я уже раза 3 отвечал что нет  Улыбающийся
Я вижу только одно объяснение - ты с ним не разобрался.

Ведь Вы сказали загрузить имедж не сделав никаких проверок что он в использовании.
Картинка будет грузиться в тот момент, когда в этом будет необходимость разработчику.
Покажи, какие нужны проверки и где именно, а уж их добавить не проблема. 

не видно как Вы управляете счетчиком ссылок.
Это не видно, потому что ты не знаешь как работает shared_ptr. Скажу по секрету - они спрятаны у него внутри.  Подмигивающий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Картинка будет грузиться в тот момент, когда в этом будет необходимость разработчику.
Покажи, какие нужны проверки и где именно, а уж их добавить не проблема. 
Картинка нужна/используется когда хотя бы одна из машин рисует текстуру на объекте. Поэтому мне кажется что и грузить (или брать из кэша) ее лучше там же, в Engine3D::Draw. Нет надежного способа предвычислить "а какие картинки будут использоваться", как я писал выше.
Записан
BRE
Гость
« Ответ #55 : Декабрь 20, 2010, 19:19 »

Картинка нужна/используется когда хотя бы одна из машин рисует текстуру на объекте. Поэтому мне кажется что и грузить (или брать из кэша) ее лучше там же, в Engine3D::Draw. Нет надежного способа предвычислить "а какие картинки будут использоваться", как я писал выше.
Не знаю насколько это будет эффективно загружать картинки при рисовании...

Например, в каждом объекте сцена можно добавить переменную типа TextureInfo.
В ней сохраняются все данные для генерации текстуры (имя файла картинки, размер, ...), сами данные не подгружается.
При начале рисования, в методе Draw, пробегаемся по всем объектам сцены и определяем нужно ли генерировать текстуру для этого объекта, если да, то используя данные из TextureInfo загружаем файл и генерируем текстуру.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Не знаю насколько это будет эффективно загружать картинки при рисовании...
Нормально, Draw рисует в offscreen буфер

Например, в каждом объекте сцена можно добавить переменную типа TextureInfo.
В ней сохраняются все данные для генерации текстуры (имя файла картинки, размер, ...), сами данные не подгружается.
При начале рисования, в методе Draw, пробегаемся по всем объектам сцены и определяем нужно ли генерировать текстуру для этого объекта, если да, то используя данные из TextureInfo загружаем файл и генерируем текстуру.
Большие проблемы с "пробежкой". Машины самые разнообразные, могут содержать самые разные наборы объектов (которые им просто даются для рисования). Не выходит поставить какое-то управление в начало Draw - это всего одна машина, есть и другие. Поэтому надо крутить со счетчиком ссылок записанным, конечно, в самом ресурсе, но обновляемым по-умному.

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

Могу рассказать как я сделал (если не будете на меня кричать, обвинять в неграмотности и.т.п  Улыбающийся)
С удовольствием посмотрю.
А свое субъективное мнение озвучить можно будет?  Улыбающийся Может что-то полезное ляпну...  Строит глазки
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Ясно что Texture должна использовать shared Image, но не загружать их без необходимости. Загрузка (и увеличение счетчика ссылок на картинку) выполняется в момент "подключения" текстуры (а не самой картинки) к машине.

Код
C++ (Qt)
void DrawEngine3D::Draw( void )
{
 ...
 Texture * txtr = it->GetTexture();   // есть текстура, ее надо рисовать
 ...
 if (!this->TextureAdded(txtr))       // машине уже известна такая текстура ?
   this->AddTexture(txtr);             // если нет, регистрируем текстуру
 
 Image * img = txtr->Image();    // получили картинку для рисования БЕЗ увеличения счетчика ссылок на нее
...  
// используем картинку
}
 
bool DrawEngine3D::AddTexture( Texture * txtr )
{
 if (mTextures.find(txtr) != mTextures.end()) return false;  // такая уже есть
 mTextures.insert(txtr);                     // запомнили
 txtr->AddToEngine(this);                   // говорим текстуре "подключиться" к машине
 return true;
}
 
bool Texture::AddToEngine( DrawEngine3D * engine )
{
 if (mEngines.find(engine) != mEngines.end()) return false;  // такая уже есть ?
 mEngines.insert(engine);                               // запомнили
 this->LoadImage();                                        // загружаем имедж, +1 к счетчику
 return true;
}
 


"Отключение" текстуры от машины аналогично, просто действия обратные. Деструктор DrawEngine3D зовет все (известные ему) текстуры чтобы они уменьшили свои счетчики на картинки. Особо расписывать здесь нечего, может стоит только упомянуть

Код
C++ (Qt)
Texture::~Texture( void )
{
 ..
 RemoveFromAllEngines();  
// теперь текстура отключена от всех машин, счетчик ссылок на картинку Ok
 ..
}
 
void Texture::RemoveFromAllEngines( void )
{
 typedef std::set <DrawEngine3D *> TEngineSet;
 TEngineSet temp = mEngines; // нужна копия
 
 for (TEngineSet::iterator it = temp.begin(); it != temp.end(); ++it)
  (*it)->RemoveTexture(this);
 
 mEngines.clear();
}
 
« Последнее редактирование: Декабрь 21, 2010, 11:45 от Igors » Записан
BRE
Гость
« Ответ #59 : Декабрь 21, 2010, 13:45 »

Я правильно понял, что метод DrawEngine3D::Draw может вызываться несколько раз и при каждом вызове он может загружать текстуру?
То есть:
Код
C++ (Qt)
DrawEngine3D eng( ... );
...
eng.draw(); // Загрузили одну текстуру
...
eng.draw(); // а здесь другую
 

А отключение текстур происходит только при разрушении объекта eng?
Записан
Страниц: 1 2 3 [4] 5   Вверх
  Печать  
 
Перейти в:  


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