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

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #30 : Сентябрь 27, 2016, 11:05 »

Не совсем понимаю значение этих строк(я не работал еще тесно с функциями памяти)?
Там я немного насвистел - второй цикл лишний. Исправил

можно ли использовать не scanLine  а bits?
scanLine аккуратнее, по крайней мере теоретически QImage может иметь неиспользуемые концы строк

на данный момент (хотя может изменится) в строке всего 1 пиксель.
Не понял в какой строке? Ширина имеджа (размер по горизонтали) w = 1, что ли? Все равно должно работать, пусть и неоптимально

я верно понимаю, что после присвоения таблицы, я просто в uchar кладу индекс, присвоенной таблицы?
После того как назначили таблицу 1: 1 забываете о ней. Получаете uchar * на данные имеджа и в этот массив просто пишете что пришло (без всяких конверсий qRgbа и др)
« Последнее редактирование: Сентябрь 27, 2016, 11:07 от Igors » Записан
deefox
Гость
« Ответ #31 : Сентябрь 27, 2016, 12:23 »

Цитировать
Не понял в какой строке? Ширина имеджа (размер по горизонтали) w = 1, что ли? Все равно должно работать, пусть и неоптимально
Ну вот в том то и дело, нужен ли для этого цикл делать и каждый раз scanLine вызывать раз, если "неоптимально"

я верно понимаю, что после присвоения таблицы, я просто в uchar кладу индекс, присвоенной таблицы?
После того как назначили таблицу 1: 1 забываете о ней. Получаете uchar * на данные имеджа и в этот массив просто пишете что пришло (без всяких конверсий qRgbа и др)
[/quote]

ну в принципе я так и сделал, и в посту выше выложил изображение, где черный фон это сам QImage
т.е. Изображение получается каким то уменьшенным.
« Последнее редактирование: Сентябрь 27, 2016, 12:24 от deefox » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #32 : Сентябрь 27, 2016, 12:45 »

Ну вот в том то и дело, нужен ли для этого цикл делать и каждый раз scanLine вызывать раз, если "неоптимально"
Не беда, вызов scanLine не затратный. Я имел ввиду что может неоптимально хранить целый QImage если пикселей с гулькин "нос" - но это уже др вопрос

ну в принципе я так и сделал, и в посту выше выложил изображение, где черный фон это сам QImage
т.е. Изображение получается каким то уменьшенным.
Используйте принцип "тише едешь - дальше будешь". Создайте новый тестовый проект, в нем заполните имедж каким-нибудь градиентом, напр так
Код
C++ (Qt)
int w = 256, h = 100;
QVector<uchar> vec(w * h);
for (int i = 0; i < vec.size(); ++i)
vec[i] = i % w;
 
Qimage img = CreateImage(vec, w, h);
img.save("C:\\test1.png");
Убедитесь что все работает, потом уже проверяйте в проекте
Записан
deefox
Гость
« Ответ #33 : Сентябрь 30, 2016, 11:07 »

Ну вот в том то и дело, нужен ли для этого цикл делать и каждый раз scanLine вызывать раз, если "неоптимально"
Не беда, вызов scanLine не затратный. Я имел ввиду что может неоптимально хранить целый QImage если пикселей с гулькин "нос" - но это уже др вопрос

ну в принципе я так и сделал, и в посту выше выложил изображение, где черный фон это сам QImage
т.е. Изображение получается каким то уменьшенным.
Используйте принцип "тише едешь - дальше будешь". Создайте новый тестовый проект, в нем заполните имедж каким-нибудь градиентом, напр так
Код
C++ (Qt)
int w = 256, h = 100;
QVector<uchar> vec(w * h);
for (int i = 0; i < vec.size(); ++i)
vec[i] = i % w;
 
Qimage img = CreateImage(vec, w, h);
img.save("C:\\test1.png");
Убедитесь что все работает, потом уже проверяйте в проекте

Такое чувство что, что через bits он возвращает 4 байта, но использует всего 1.
все получилось через
Код:
            for (int i = 0; i < 1318; ++i) {
                imagePixelMode1 = curQImageMode1.scanLine(i);
                imagePixelMode1[0] = data[i];

            }

в теме про форматы вы написали. что для отрисовки лучше использовать 32. но мне в принципе и нужна отрисовка, с памятью проблем нету пока что, все же лучше использовать Format_32?

и хотелось бы узнать у вас по поводу

Код:
 for (int y = 0; y < h; ++y) 
    memmove(img.scanLine(y), &src[0] + y * w, w);

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

по поводу сцены решилось удаление множества элементов 4096


Код:
    if(itemsPixmap.isEmpty()){
        itemsPixmap.enqueue(scene->addPixmap(QPixmap::fromImage(itemPixmap)));
    }
    else
    {
        QPointF tempPoint = itemsPixmap.last()->pos();
        tempPoint.setX(tempPoint.x() + 1.0);
        itemsPixmap.enqueue(scene->addPixmap(QPixmap::fromImage(itemPixmap)));
        itemsPixmap.last()->setPos(tempPoint);
    }
    if(itemsPixmap.count() >= currWidthMaxScale){
        scene->setSceneRect(scene->sceneRect().x() + 4096,0,scene->width(),scene->height());
        for (int i = 0; i < 4096; i++){
            scene->removeItem(itemsPixmap.at(0));
            delete itemsPixmap.dequeue();
        }
    }

Но нормалное ли такое решение для скажем получасовго или часового приема? сцена увеличивается и увеличивается
« Последнее редактирование: Сентябрь 30, 2016, 11:09 от deefox » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #34 : Сентябрь 30, 2016, 15:43 »

в теме про форматы вы написали. что для отрисовки лучше использовать 32. но мне в принципе и нужна отрисовка, с памятью проблем нету пока что, все же лучше использовать Format_32?
Поскольку мы видим 32 бита то любой формат для отрисовки так или иначе будет засылать на видео 4 байта на пиксель получая их из исходных данных. Но опасаться этого не следует, эти расходы незначительны (если вообще заметны). А вот "объем данных в 4 раза меньше" - аргумент очень весомый. Поэтому использовать 8 бит - правильное решение

и хотелось бы узнать у вас по поводу
Код:
 for (int y = 0; y < h; ++y) 
    memmove(img.scanLine(y), &src[0] + y * w, w);

для чего эта часть нужна? как бы и без нее все работало(вроде бы), но я не думаю чтобы вы просто так это написали Улыбающийся
memmove (копирование память-память) работает также как и присваивание  imagePixelMode1[0] = data, но для всей строки сразу, в общем случае w может быть > 1

Но нормалное ли такое решение для скажем получасовго или часового приема? сцена увеличивается и увеличивается
Тут я "потерял нить". Пока мне ясно что Вы получаете по сети какие-то странные имеджи-столбцы из 1318 строк. Но дальше ничего не понял. Как это связано со сценой и картинками что Вы приводили - они же вроде "квадратики"? Если речь идет от том что из имеджа сделать pixmap айтем и добавить его в сцену - налицо неоптимальность, 1318 байт слишком мало чтобы тратиться на QImage (или QPixmap) да еще и на айтем. Надо паковать в "пачки" напр по 32 столбца
« Последнее редактирование: Сентябрь 30, 2016, 15:45 от Igors » Записан
deefox
Гость
« Ответ #35 : Октябрь 05, 2016, 09:24 »

Тут я "потерял нить". Пока мне ясно что Вы получаете по сети какие-то странные имеджи-столбцы из 1318 строк. Но дальше ничего не понял. Как это связано со сценой и картинками что Вы приводили - они же вроде "квадратики"? Если речь идет от том что из имеджа сделать pixmap айтем и добавить его в сцену - налицо неоптимальность, 1318 байт слишком мало чтобы тратиться на QImage (или QPixmap) да еще и на айтем. Надо паковать в "пачки" напр по 32 столбца


ну получается имеджи 4к 16к и 32к - представляющие из себя вертикальную линию, по сети приходит 1318, из нескольких делаю 1. и на отрисовку посылаю только полностью зарисованный имедж. это самое оптимальное практическое решение. но эти линии постоянно приходят. и 60 тыс линий перемещать выходит накладно. поэтому я обрезаю сцену и удаляю скрытые итемы.

я имею ввиду, что обрезая сцену ее видимая область по сути не изменяется. но координаты по x все увеличиваются и увеличиваются. изначально размещаю (0, 0), через пару минут уже (70000,0) и т.д.


« Последнее редактирование: Октябрь 05, 2016, 09:51 от deefox » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #36 : Октябрь 05, 2016, 09:48 »

ну получается имеджи 4к 16к и 32к - представляющие из себя горизонтальную линию,
По сети приходит вертикальная линия (один столбец, 1318 строк), теперь Вы говорите о горизонтальной. Трудновато понять откуда она взялась
 
по сети приходит 1318, из нескольких делаю 1. и на отрисовку посылаю только полностью зарисованный имедж. это самое оптимальное практическое решение. но эти линии постоянно приходят. и 60 тыс линий перемещать выходит накладно. поэтому я обрезаю сцену и удаляю скрытые итемы.

я имею ввиду, что обрезая сцену ее видимая область по сути не изменяется. но координаты по x все увеличиваются и увеличиваются. изначально размещаю (0, 0), через пару минут уже (70000,0) и т.д.
Т.е. каким-то образом Вы пакуете в пачки/имеджи/айтемы. Ну и хорошо, тогда в чем проблема? Да, старые данные придется удалять, т.к. новые приходят и приходят. Но не вижу откуда здесь возьмутся "жуткие тормоза"? Сколько айтемов Вам надо держать в сцене? Ну может неск сотен. В общем. не въезжаю   
Записан
deefox
Гость
« Ответ #37 : Октябрь 05, 2016, 09:59 »

ну получается имеджи 4к 16к и 32к - представляющие из себя горизонтальную линию,
По сети приходит вертикальная линия (один столбец, 1318 строк), теперь Вы говорите о горизонтальной. Трудновато понять откуда она взялась
 
по сети приходит 1318, из нескольких делаю 1. и на отрисовку посылаю только полностью зарисованный имедж. это самое оптимальное практическое решение. но эти линии постоянно приходят. и 60 тыс линий перемещать выходит накладно. поэтому я обрезаю сцену и удаляю скрытые итемы.

я имею ввиду, что обрезая сцену ее видимая область по сути не изменяется. но координаты по x все увеличиваются и увеличиваются. изначально размещаю (0, 0), через пару минут уже (70000,0) и т.д.
Т.е. каким-то образом Вы пакуете в пачки/имеджи/айтемы. Ну и хорошо, тогда в чем проблема? Да, старые данные придется удалять, т.к. новые приходят и приходят. Но не вижу откуда здесь возьмутся "жуткие тормоза"? Сколько айтемов Вам надо держать в сцене? Ну может неск сотен. В общем. не въезжаю   

исправил. вертикальная полоса. сам себя уже путаю.   есть небольшие тормоза при QMatrix::scale(), на сцене гдето 60 тыс итемов(линий), конечно хотелось бы без них. но я имею ввиду немного другое.  есть ли придел сцены? по горизонтали добавляются итемы и добавляются

Код:
scene->setSceneRect(scene->sceneRect().x() + 4096,0,scene->width(),scene->height());

может ли быть такое, что QMatrix::scale() увеличивает не только видимую область сцены?



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

Сообщений: 11445


Просмотр профиля
« Ответ #38 : Октябрь 05, 2016, 10:39 »

есть небольшие тормоза при QMatrix::scale(), на сцене гдето 60 тыс итемов(линий),
Та откуда такое безумие? Покажите скриншот с выделенным одним айтемом

Код:
scene->setSceneRect(scene->sceneRect().x() + 4096,0,scene->width(),scene->height());
может ли быть такое, что QMatrix::scale() увеличивает не только видимую область сцены?
[/quote]Нет, это увеличение "для отрисовки". Напр увеличили - значит меньший кусок данных будет рисоваться на весь экран. Да, потребуется какое-то время на рисование увеличенной части имеджа, но не смертельно
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #39 : Октябрь 05, 2016, 10:41 »

Предела нету, сцена ничего автоматом не убирает.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
deefox
Гость
« Ответ #40 : Октябрь 05, 2016, 11:08 »

Предела нету, сцена ничего автоматом не убирает.

т.е. если образно сказать, что ее видимая часть через 20 минут будет начинаться с (555555555555,0)(и будет увеличиваться) размер сцены примерно 50000 x 32768(размер сцены всегда один) на работу это никак не повлияет?

есть небольшие тормоза при QMatrix::scale(), на сцене гдето 60 тыс итемов(линий),
Та откуда такое безумие? Покажите скриншот с выделенным одним айтемом

Код:
scene->setSceneRect(scene->sceneRect().x() + 4096,0,scene->width(),scene->height());
может ли быть такое, что QMatrix::scale() увеличивает не только видимую область сцены?
Нет, это увеличение "для отрисовки". Напр увеличили - значит меньший кусок данных будет рисоваться на весь экран. Да, потребуется какое-то время на рисование увеличенной части имеджа, но не смертельно
[/quote]

один к сожалению не могу, но вот старый скриншот в теме


одна вертикальная линия 1 итем, размер (1 x 16 384) размер квадрата на рисунке 4 096 x 4 096(для понимания машаба изображения)   

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

Сообщений: 11445


Просмотр профиля
« Ответ #41 : Октябрь 05, 2016, 12:28 »

одна вертикальная линия 1 итем, размер (1 x 16 384) размер квадрата на рисунке 4 096 x 4 096(для понимания машаба изображения)   
Ага, теперь чуть яснее. Ну если Вы взялись паковать - то что Вы хотите от одного айтема? Он предназначен для того чтобы с ним можно было работать отдельно (двигать, вращать и др). Если это Вам это не надо - делайте "чемоданы" побольше, напр почему бы не 1 айтем = 1 квадрат (по-моему логично)
Записан
deefox
Гость
« Ответ #42 : Октябрь 10, 2016, 09:57 »

одна вертикальная линия 1 итем, размер (1 x 16 384) размер квадрата на рисунке 4 096 x 4 096(для понимания машаба изображения)  
Ага, теперь чуть яснее. Ну если Вы взялись паковать - то что Вы хотите от одного айтема? Он предназначен для того чтобы с ним можно было работать отдельно (двигать, вращать и др). Если это Вам это не надо - делайте "чемоданы" побольше, напр почему бы не 1 айтем = 1 квадрат (по-моему логично)

извините долговато отвечать получается)

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

по практическим тестам у меня было 2 варианта. либо рисовать линию как сейчас. либо квадрат(с чего начинал)

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


ps на сцене режим номер 2(как пока я их называю). а их всего 3( 1 - 4к( самый быстрый и жуткий) 2 -16 к(такой как на скирине) 3 - 32к - по размеру всего скрина).



« Последнее редактирование: Октябрь 10, 2016, 10:02 от deefox » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #43 : Октябрь 10, 2016, 12:06 »

но для квадрата нужен жуткий код. исходя из того что приходят линии по вертикали. нужно было задействовать сразу несколько имеджов. по отрисовке 1 квадрат отриовывался 900 мс(с учетом приема). по 1 линии было быстро. но не практично(пакет пришел - пакет отрисовал, слишком часто происходила перерисовка.) поэтому сделал так. в итоге отрисовался за 300 мс -  я думаю разница ощутима. было все идеально .но эти пакеты(как мне говорят). могут приходить и час и два, поэтому мне нужно сделать динамически очищаемую сцену, и чтобы можно было бы приблизить (во время приема и отрисовки) рассмотреть  что нибудь. а возможно еще сверху че нибудь нарисовать(ну это пока только в планах)
Я бы делал примерно так: один айтем - один квадрат. Данные к нему добавляются по мере поступления, а перерисовка вызывается только когда истек заданный интервал времени
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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