Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,204
Записей в блоге: 2

Загрузка текстур

04.04.2026, 23:42. Показов 3626. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день

Приложение грузит текстуры (файлы картинок) и создает из них QOpenGLTexture для рисованиях в окнах. Вполне возможно что одна и та же QOpenGLTexture потребуется в 2 и более местах, напр на разных моделях. Конечно в этом случае мы хотим использовать одну копию QOpenGLTexture, не создавая несколько раз одни и те же данные. Напрашивается использовать std::shared_ptr или QSharedPointer, но как конкретно это сделать? Пример структур
C++
1
2
3
4
struct Texture {
...
 QOpenGLTexture * m_texture;  // shared? 
};
Спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.04.2026, 23:42
Ответы с готовыми решениями:

SDL : Неадекватная загрузка текстур
Есть следующее приложение: Programm.h #include <windows.h> #include <SDL.h> #include <iostream>...

Удаление текстур OpenGL
Ребята подскажите как удалить текстуру? Через метод glDeleteTextures, если да то какие параметры...

Неправильная отрисовка текстур в OpenGL
Всем доброго дня, недавно начал изучать как работать с графикой и решил повторить пример из урока,...

24
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
10.04.2026, 10:05
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Igor3D Посмотреть сообщение
выполняет команду "replace image"
так просто реализуйте в классе текстура метод релоад который будет загружать новую текстуру из файла и вызывайте его по кнопке, да и автоматом в Qt это элементарно можно сделать.
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,204
Записей в блоге: 2
10.04.2026, 22:28  [ТС]
Цитата Сообщение от Annemesski Посмотреть сообщение
так просто реализуйте в классе текстура метод релоад который будет загружать новую текстуру из файла
А что должен делать Texture::Reload ? И к каким последствиям это может привести?
Возможен (?) случай когда в мапе и в клиенте сидят разные указатели/данные по одному ключу.
Выходит "возможен"? Или как?

Добавлено через 3 часа 6 минут
На всякий случай уточню: в общем случае нет возможности изменить данные существующей QOpenGLTexture оставляя ее по тому же адресу. Можно только создать новую (из данного файла)
0
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
13.04.2026, 10:22
Цитата Сообщение от Igor3D Посмотреть сообщение
А что должен делать Texture::Reload ?
он должен перезагрузить файл текстуры, да QOpenGLTexture неперемещаемый и не копируеммый, но
Цитата Сообщение от Igor3D Посмотреть сообщение
На всякий случай уточню: в общем случае нет возможности изменить данные существующей QOpenGLTexture оставляя ее по тому же адресу. Можно только создать новую (из данного файла)
посмотрите что делает одна из перегрузок setData, не даром у него параметры как у одного из конструкторов.
Цитата Сообщение от Igor3D Посмотреть сообщение
Выходит "возможен"? Или как?
или как: если Вы специально это сделаете, то возможно. Я бы как-то так исполнил.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class TextureCache
{
    TextureCache(void) {}
 
    static std::unordered_map<std::string, std::weak_ptr<QOpenGLTexture>> m_cache;
    
public:
    TextureCache(const TextureCache &other) = delete;
    TextureCache(TextureCache &&other) = delete;
    TextureCache & operator=(const TextureCache &other) = delete;
    TextureCache & operator=(TextureCache &&other) = delete;
 
    static TextureCache & getInstance(void) { static TextureCache instance; return instance; }
    
    std::shared_ptr<QOpenGLTexture> getTexture(const std::string &path)
    {
        auto ptr = m_cache[path].lock();
        if (!ptr) {
            ptr = std::make_shared<QOpenGLTexture>(QImage(path.c_str()));
            m_cache[path] = ptr;
        }
        
        return ptr;
    }
    
    void reload(const std::string &path)
    {
        if (auto ptr = m_cache[path].lock()) {
            ptr->setData(QImage(path.c_str()));
        };
    }
};
Цитата Сообщение от Igor3D Посмотреть сообщение
к каким последствиям это может привести?
если объекты работают в разных потоках, то возможна гонка данных или даже UB, тогда модификация должна быть защищена мьютексом.
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,204
Записей в блоге: 2
13.04.2026, 20:48  [ТС]
Цитата Сообщение от Annemesski Посмотреть сообщение
посмотрите что делает одна из перегрузок setData,
Согласен, для QOpenGLTexture можно перегрузить "только данные" (кстати, сразу не увидел), но этот случай не общий, напр объект может быть наследником QObject - и с приветом
Цитата Сообщение от Annemesski Посмотреть сообщение
Я бы как-то так исполнил.
Конкретно клиент - класс Texture. Какие члены он должен иметь, как юзать TextureCache? Будет ли это удобно?
0
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
14.04.2026, 09:56
Igor3D, если разделяемый объект не оставляет вариантов кроме как обязательное создание нового можно использовать класс обертку реализующий перезагрузку что-то типа фасада:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Texture
{
    const std::string m_path;
    std::unique_ptr<QOpenGLTexture> m_gltex;
 
public:
    Texture(const std::string &path) : m_path(path), m_gltex(std::make_unique<QOpenGLTexture>(QImage(path.c_str()))) { }
 
    void reload(void) { m_gltex.reset(new QOpenGLTexture(QImage(m_path.c_str()))); }
 
// проброс интерфейсов к opengl текстуре
};
 
class TextureCache
{
    TextureCache(void) {}
    static std::unordered_map<std::string, std::weak_ptr<Texture>> m_cache;
 
public:
    static TextureCache & getInstance(void) { static TextureCache instance; return instance; }
 
    std::shared_ptr<Texture> getTexture(const std::string &path)
    {
        auto ptr = m_cache[path].lock();
        if (!ptr) {
            ptr = std::make_shared<Texture>(QImage(path.c_str()));
            m_cache[path] = ptr;
        }
 
        return ptr;
    }
 
    void reload(const std::string &path)
    {
        if (auto ptr = m_cache[path].lock()) {
            ptr->reload();
        };
    }
};
Цитата Сообщение от Igor3D Посмотреть сообщение
Конкретно клиент - класс Texture. Какие члены он должен иметь, как юзать TextureCache? Будет ли это удобно?
По мне вполне удобно - это синглтон, подключил заголовок там где хочешь использовать кэш, взял инстанс (объект будет один на всю программу) и работаешь, типа

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <TextureCache.hpp>
 
class MyTexture
{
    std::shared_ptr<Texture> m_tex;
 
public:
    void load(const std::string &path)
    {
        m_tex = TextureCache::getInstance().getTexture(path);
    }
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.04.2026, 09:56

Генератор текстур( с чего начать)
Всем привет, решил для своего 3д проекта написать генератор текстур, пока что необходима текстура...

Вопрос о загрузке страницы
Подскажите, пожалуйста, как сделать так, чтобы в Buildere 6 при нажатиии кнопки (Button) на обычной...

Определение завершения загрузки страницы в CppWebBrowser
Проблема в следующем: есть страница, содержащая в себе несколько фреймов и ява-скриптов. Как...

Загрузка данных из файла
подскажите пожалуста как сделать так чтобы: К примеру на форма 5 штук Label (label1, Label2,...

Загрузка иконок в меню используя MFC
Подскажите, как добавить в пункт меню иконку? Работаю на в MFC проект на диалоге. Заранее спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru