Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: deefox от Сентябрь 19, 2016, 13:04



Название: работа с QGraphicsScene
Отправлено: deefox от Сентябрь 19, 2016, 13:04
Доброго времени суток!

Поделитесь опытом.
По сети приходят данные о пикселях, я их отрисовываю в QImage и посылаю сигналом Qimage в главный поток, где добавляю на сцену в виде QGraphicsPixmapItem.

Суть в том, что объектов много, и подлагивает гуи.

Но хотелось бы еще и удалять итемы например если их будет 65к. пытался посредством
Код:
    if(itemsPixmap.isEmpty()){
        itemsPixmap.enqueue(scene->addPixmap(QPixmap::fromImage(itemPixmap)));
        itemsPixmap.last()->setPos(0,0);
    }
    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() >= 30000){
        scene->removeItem(itemsPixmap.at(0));
        itemsPixmap.dequeue();
    }

но лаги неимоверные, да и отрисовка ужасная становится. Есть ли возможность работать со сценой в отдельном потоке? или как мне это оптимизировать эту работу?



Название: Re: работа с QGraphicsScene
Отправлено: Racheengel от Сентябрь 19, 2016, 15:04
Создать на сцене один QGraphicsPixmapItem и обновлять только его содержимое, например?


Название: Re: работа с QGraphicsScene
Отправлено: deefox от Сентябрь 19, 2016, 15:15
Создать на сцене один QGraphicsPixmapItem и обновлять только его содержимое, например?

размер элементов 1x4к   1x16к  1x32к, цельный итем программа не тянет.

По сети приходят пакеты размером 1318, самое оптимальное, это рисовать полные линии. + udp, часть может потеряться


Название: Re: работа с QGraphicsScene
Отправлено: Racheengel от Сентябрь 19, 2016, 16:40
32k точек? это картинка всего 320 на 100 пикселей...

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


Название: Re: работа с QGraphicsScene
Отправлено: deefox от Сентябрь 20, 2016, 12:32
32k точек? это картинка всего 320 на 100 пикселей...

Вообще, не совсем понятна вся картина.
Что приходит? Как часто? Как это должно выглядеть для пользователя?
Скриншот бы не помешал...
`

по udp приходит пиксели,  сама картинка градиента серого т.е. 1 пакет 1318
Код:
qRgb(data[i],data[i],data[i])
в отдельном потоке отрисовываю их в линию, в зависимости от режима отрисовки(линия может быть 1x4к   1x16к  1x32к  (w х h))

"Пытался для экономии сделать через undexed8, но работать стала хуже, поэтому использую формат QImage RGB32"

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

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

Тут и началась вся проблема. при удалении
Код:
    scene->removeItem(itemsPixmap.dequeue());
    mute.unlock();
//или
    scene->removeItem(itemsPixmap.at[0]);
itemsPixmap.dequeue()
    mute.unlock();
сцена становится мертвой


Название: Re: работа с QGraphicsScene
Отправлено: Racheengel от Сентябрь 20, 2016, 12:44
а зачем это вообще через сцену делать?
по линиям в принципе никто не делат, это не будет нормально работать никогда.
не проще завести один виджет и на нём рисовать пиксели через QImage?
или зум нужен? если так, то делаем только один QGraphicsPixmapItem и за раз обновляем только одну строку в нём.


Название: Re: работа с QGraphicsScene
Отправлено: deefox от Сентябрь 20, 2016, 13:10
а зачем это вообще через сцену делать?
по линиям в принципе никто не делат, это не будет нормально работать никогда.
не проще завести один виджет и на нём рисовать пиксели через QImage?
или зум нужен? если так, то делаем только один QGraphicsPixmapItem и за раз обновляем только одну строку в нём.

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

почему именно линии = мне приходит по сути линия, изначально я из сразу же и отрисовывал, для лучшей работы я начал рисовать  сразу конечные линии а не части как изначально, то есть - пришло 5 пакетов, из них собрал одну линиию и отрисовал - подсчитал потери и переключиллся на другую линию

была идея с тайтлами, но по производительность отрисовки меньше на слабеньком компе почти в 2.5 раза - тайтлы правдо были 4к на 4к

а вот на счет одного итема не пробывал: допустим у нас итем - на нем изначально как то размер задать нужно? приблизительно на экран при самом сильном уменьшении помещается 45к x 32к. Но не будет ли такой же эффект? передаем картинку в главное окно и там добавляем в итем?


Название: Re: работа с QGraphicsScene
Отправлено: Racheengel от Сентябрь 20, 2016, 14:42
должна быть одна картинка фиксированного размера (пустая изначально).
по мере прихода данных, картинка обновляется и пакуется на сцену.
картинку хранить в QImage, там есть метод scanLine, который дает поинтер на строку в памяти (туда пишем).
чтоб было еще быстрее, можно кастомный итем сделать, переопределить в нем paint и напрямую отрисовывать данные.


Название: Re: работа с QGraphicsScene
Отправлено: deefox от Сентябрь 20, 2016, 16:55
должна быть одна картинка фиксированного размера (пустая изначально).
по мере прихода данных, картинка обновляется и пакуется на сцену.
картинку хранить в QImage, там есть метод scanLine, который дает поинтер на строку в памяти (туда пишем).
чтоб было еще быстрее, можно кастомный итем сделать, переопределить в нем paint и напрямую отрисовывать данные.

ну вот линии и были QImage фиксированного размера(линии)

Код:
        curQImageMode1.fill(Qt::white);
        imagePixelMode1 = reinterpret_cast<uint *>(curQImageMode1.bits());

            for (int i = 0; i < 1318; ++i) {
                //                curQImage.setPixel(0,i,qRgb(data[i],data[i],data[i]));
                imagePixelMode1[i] = qRgb(data[i],data[i],data[i]);

            }

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


но вот по поводу удаления верен ли такой подход?

Код:
    if(itemsPixmap.count() >= 30000){
        scene->removeItem(itemsPixmap.at(0));
        itemsPixmap.dequeue();
    }




Название: Re: работа с QGraphicsScene
Отправлено: Racheengel от Сентябрь 20, 2016, 16:59
Я имею в виду, надо сделать один QImage и в нем рисовать 30000 или сколько там линий.

Удаление тоже не будет работать, надо как то так:

  while(itemsPixmap.count() >= 30000){
        scene->removeItem(itemsPixmap.first());
        delete itemsPixmap.takeFirst();
    }


Название: Re: работа с QGraphicsScene
Отправлено: deefox от Сентябрь 22, 2016, 09:43
Я имею в виду, надо сделать один QImage и в нем рисовать 30000 или сколько там линий.

Удаление тоже не будет работать, надо как то так:

  while(itemsPixmap.count() >= 30000){
        scene->removeItem(itemsPixmap.first());
        delete itemsPixmap.takeFirst();
    }

В целой картинкой я пытался, мой компьютер фактически не смог работать с  целой картинкой в 60к(может и больше) х 32к. рисование и так нормально вроде все вырисовывает, чуть подправил отрисовку в QImage и в принципе летает, но вот с удаление,  гуи виснет. Может можно ли поместить процесс удаления в отдельный поток?


Название: Re: работа с QGraphicsScene
Отправлено: Racheengel от Сентябрь 22, 2016, 11:15
хм... а зачем вообще что-либо тогда удалять?
пусть линии сидят себе на сцене.
пришла новая инфа - сдвинуть все линии (по координатам) вниз на 1,
последнюю переместить в позицию 0 и записать в нее пиксели.


Название: Re: работа с QGraphicsScene
Отправлено: deefox от Сентябрь 22, 2016, 15:12
хм... а зачем вообще что-либо тогда удалять?
пусть линии сидят себе на сцене.
пришла новая инфа - сдвинуть все линии (по координатам) вниз на 1,
последнюю переместить в позицию 0 и записать в нее пиксели.

Условно я говорю, что у нас картинка там больших размеров -  я назвал цифру, при том чтобы самая большая линии уместилась без скрола, а там дальше если нужно приблизить, в ширину поместится пикселей допустим 60 к... полностью такой объем сцены заполнится чуть больше минуты(смотря какая скорость ethernet) -  а если прием будет длится пол часа, мне нужно как то освободить место для будущей информации, я думал способом освободить место и сразу его заполнить.

просто по вашему способу я не умещу столько информации, да и не нужна она мне будет.

Я тестировал сколько смогу принять  без сдвигов, удаления и прочего - вышло в ширину около 65 к пикселей и программа крашилась (и то там 80 % занимали маленькие элементы из этого трио), причем оперативки было еще много свободной. так что по видимому сцена имеет свой придел тоже.


Название: Re: работа с QGraphicsScene
Отправлено: Racheengel от Сентябрь 22, 2016, 15:41
Для такой задачи, лучше всего делать собственную отрисовку.
Ведь больше, чем разрешение экрана, отрисовывать нет смысла.
Принимаем в буфер, а на виджет рисуем только то, что видимо в данный момент.


Название: Re: работа с QGraphicsScene
Отправлено: deefox от Сентябрь 22, 2016, 15:57
Для такой задачи, лучше всего делать собственную отрисовку.
Ведь больше, чем разрешение экрана, отрисовывать нет смысла.
Принимаем в буфер, а на виджет рисуем только то, что видимо в данный момент.

что вы имеете ввиду под собственной отрисовкой? у QGraphicsView вроде есть такая функция. что он отображает только видимую часть сцены. у меня идет уменьшение матрицы в 0,22хххх в принципе, все что за ее пределами я и хочу как то динамически удалять со сцены, сдигая все влево на 1 освобождая место для сл элемента, при этот самом размере (но нужно будет и увеличивать zoom).


Название: Re: работа с QGraphicsScene
Отправлено: Racheengel от Сентябрь 22, 2016, 16:54
Я имею в виду QWidget::paint().
У вас логика слишком специфичная - надо быстро обновлять данные, которые приходят с внешнего устройства.
Сцена тут не особо поможет, так как она для другого придумана (скорее, редакторы делать).
Поэтому я бы делал отдельный виджет, который бы, в зависимости от выставленного зума, отображал бы только часть данных. Все равно полный пакет 65к на 32к в видимую область не влезет)


Название: Re: работа с QGraphicsScene
Отправлено: deefox от Сентябрь 23, 2016, 09:20
Я имею в виду QWidget::paint().
У вас логика слишком специфичная - надо быстро обновлять данные, которые приходят с внешнего устройства.
Сцена тут не особо поможет, так как она для другого придумана (скорее, редакторы делать).
Поэтому я бы делал отдельный виджет, который бы, в зависимости от выставленного зума, отображал бы только часть данных. Все равно полный пакет 65к на 32кв видимую область не влезет)

вот  такой то пакет и влезает. в видмую часть(при минимальном зуме(он же по умолчанию))

Просто если использовать те же самые QImage,и точно так же добавлять по координатам Widget, я возможно столкнуть с той же бедой при удалении и смещении. Работа с гуями в основном потоке, что то делать в них может и не затратно, но грузит сам интерфейс.

Вырисовывать сразу в виджет уже пытался(с самого начала), гуя просто становился мертвым.

я уж не знаю, что еще можно приудумать.


Название: Re: работа с QGraphicsScene
Отправлено: Racheengel от Сентябрь 23, 2016, 10:48
Не надо ничего добавлять. Данные пакуем в один огромный QImage. Он создается 1 раз и так и остается жить.
Далее переносим в видимую область окна (виджета) только то, что в нее помещается.


Название: Re: работа с QGraphicsScene
Отправлено: deefox от Сентябрь 23, 2016, 12:19
Не надо ничего добавлять. Данные пакуем в один огромный QImage. Он создается 1 раз и так и остается жить.
Далее переносим в видимую область окна (виджета) только то, что в нее помещается.


Но новые данные то будут приходить и приходить, если видимой области будет не достаточно, вы хотите сказать чтобы там дальше была картика, даже если размером свыше 200 к пикселей?

данные приходят постояно, и мы постоянно пакуем их в QImage (не однократно).

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

видимая нами часть получается по умолчанию не как обычно 1 к 1, а 1 к 0.22xxx, то есть размер, при которой ось y помещается полностью а ось x уж как получится, и все это в градиенте серого(ну r g b  одного значения).

Смогу ли я вашим методом все это сделать?


Название: Re: работа с QGraphicsScene
Отправлено: Racheengel от Сентябрь 23, 2016, 16:16
Ну, какой длины быть картинке, это Вам решать, сколько данных Вы хотите видеть.
Всегда можно паковать новые данные в конец, а если их слишком много, удалять первую строку.
В принципе, тут можно и списком обойтись, QList<QByteArray> или что-то вроде этого - каждый элемент соответствует одной строке данных.
При отрисовке берете последние N строк (например) и рисуете на виджете.
Про камеру вообще ничего не понял. Строки как "идут"? вертикально или горизонтально?


Название: Re: работа с QGraphicsScene
Отправлено: Igors от Сентябрь 24, 2016, 03:38
"Пытался для экономии сделать через undexed8, но работать стала хуже, поэтому использую формат QImage RGB32"
Что-то не так делали, задумка сократить в 4 раза объем данных была хорошей

Про камеру вообще ничего не понял.
Аналогично. Тут бы картинками показать - может и больше бы людей ответило. А так трудно въехать, шо за "линии" ???


Название: Re: работа с QGraphicsScene
Отправлено: Bepec от Сентябрь 24, 2016, 10:17
Похоже на водопад.


Название: Re: работа с QGraphicsScene
Отправлено: Racheengel от Сентябрь 24, 2016, 13:46
ну я так понял, что это штука должна строить график по времени.
новые данные пришли - проскроллилось на 1 вертикальную линию - старые затерлись.
какой-нибудь сейсмологический логгер, или что то вроде этого.
но сцена тут точно не решение, только своя отрисовка...


Название: Re: работа с QGraphicsScene
Отправлено: deefox от Сентябрь 26, 2016, 09:39
ну я так понял, что это штука должна строить график по времени.
новые данные пришли - проскроллилось на 1 вертикальную линию - старые затерлись.
какой-нибудь сейсмологический логгер, или что то вроде этого.
но сцена тут точно не решение, только своя отрисовка...

ну что то похожее на график, но там картинка

сами линии, которые приходят по сети -  вертикальные. Но по сути камеру двигаем только вправо.
Просто режима 3, если под все 3 режима 1 картинка, то будет очень много не использованного простравнтсва, это первое, с чем я боюсь с толкнуться, 2 - это если нам нужно справо место под линию, то нужно сместить 2080000000 элементов в лево, каждый по 4 байта(попытаюсь все таки на 1 перейти).


Т.Е. каждая линия на данный момент это Qimage(вертикальная), но эта линия создается из нарезок приходящих по езернету в 1318 байт.

Похоже на водопад.

ага, только не вниз, а вправо

 Примерно так:
P.S. каждый квадратик 4096 x 4096
(http://i11.pixs.ru/storage/2/4/6/risunok1pn_2023419_23434246.png) (http://pixs.ru/showimage/risunok1pn_2023419_23434246.png)
(http://i11.pixs.ru/storage/2/4/9/risunok2pn_6422859_23434249.png) (http://pixs.ru/showimage/risunok2pn_6422859_23434249.png)




Название: Re: работа с QGraphicsScene
Отправлено: deefox от Сентябрь 26, 2016, 11:37
Что-то не так делали, задумка сократить в 4 раза объем данных была хорошей

скорее всего так и есть.
Я  немного не пойму суть использования QImage::bits.

Если его делать через:

Код:
imagePixelMode1 = reinterpret_cast<uint *>(curQImageMode1.bits());
То нормально, только заливка белая не работает, но получается что все равно один пиксель 4 байта

а если так: imagePixelMode1 представить как учар, то картинка становится как урезанная.
задаю цвет:
Код:
imagePixelMode1[i] = qGray(data[i],data[i],data[i]);



Название: Re: работа с QGraphicsScene
Отправлено: Igors от Сентябрь 26, 2016, 16:25
Пример (писал прямо здесь, возможны ошибки)
Код
C++ (Qt)
QImage CreateImage( const QVector<char> & src, int w, int h )
{
QImage img(w, h, QImage::Format_Indexed8);
 
static QVector<QRgb> colorTable;
if (!colorTable.size()) {
 colorTable.resize(256);
 for (int i = 0; i < 256; ++i)
  colorTable[i] = qRgba(i, i, i, 255);
}
img.setColorTable(colorTable);
 
for (int y = 0; y < h; ++y)
   memmove(img.scanLine(y), &src[0] + y * w, w);
 
return img;
}
При этом w * h <= src.size() или вставлять доп проверки


Название: Re: работа с QGraphicsScene
Отправлено: deefox от Сентябрь 27, 2016, 09:44
Пример (писал прямо здесь, возможны ошибки)

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


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

можно ли использовать не scanLine  а bits? на данный момент (хотя может изменится) в строке всего 1 пиксель.
не совсем разобрался. какой из этих методов лучше.
я так понял. что scanLine сделан для упрощения навигации по строкам. Верно?

по поводу присвоения. как использовать таблицу не через setPixel, а через прямой доступ (scanLine, bits)?
судя из

QImage also provide the scanLine() function which returns a pointer to the pixel data at the scanline with the given index, and the bits() function which returns a pointer to the first pixel data (this is equivalent to scanLine(0)).

я верно понимаю, что после присвоения таблицы, я просто в uchar кладу индекс, присвоенной таблицы?

Код:
uchar * dst = img.bits();
for(int i = 0; i < 4096; i++)
dst[i] = data(i); // data(i) - массив с данными пикселей. принятый по ethernet



Попробовал на практике.

результат -
(http://i11.pixs.ru/storage/4/2/1/SnimokPNG_1303438_23448421.png) (http://pixs.ru/showimage/SnimokPNG_1303438_23448421.png)

Код:
    curQImageMode1 = QImage(1,4098,QImage::Format_Indexed8);
    static QVector<QRgb> colorTable;
    if (!colorTable.size()) {
        colorTable.resize(256);
        for (int i = 0; i < 256; ++i)
            colorTable[i] = qRgb(i, i, i);
    }

    curQImageMode1.setColorTable(colorTable);

        imagePixelMode1 = curQImageMode1.bits();
        for(int i = 0; i < 4096; i++)
        {imagePixelMode1[i] = 255;
        }

      //Дальше каждому байту присвавиваем индекс
 imagePixelMode1[i] = data[i];





Название: Re: работа с QGraphicsScene
Отправлено: Racheengel от Сентябрь 27, 2016, 10:45
scanline(i) возвращает поинтер на строку i картинки, по сути на массив точек строки.
Строки не обязательно лежат в памяти подряд, поэтому надо так:

for (int i = 0; i < image.height(); i++)
{
  uchar* sptr = image.scanLine(i);
  ...
  sptr[0] = 0xff;  // пишем в первый пиксель строки ff
  ...
}


Название: Re: работа с QGraphicsScene
Отправлено: Old от Сентябрь 27, 2016, 10:53
Для чего это странное приведение к char? :)


Название: Re: работа с QGraphicsScene
Отправлено: Racheengel от Сентябрь 27, 2016, 11:03
Для чего это странное приведение к char? :)

по памяти писал.. подумал, что оно void* возвращает...


Название: Re: работа с QGraphicsScene
Отправлено: Igors от Сентябрь 27, 2016, 11:05
Не совсем понимаю значение этих строк(я не работал еще тесно с функциями памяти)?
Там я немного насвистел - второй цикл лишний. Исправил

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

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

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


Название: Re: работа с QGraphicsScene
Отправлено: deefox от Сентябрь 27, 2016, 12:23
Цитировать
Не понял в какой строке? Ширина имеджа (размер по горизонтали) w = 1, что ли? Все равно должно работать, пусть и неоптимально
Ну вот в том то и дело, нужен ли для этого цикл делать и каждый раз scanLine вызывать раз, если "неоптимально"

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

ну в принципе я так и сделал, и в посту выше выложил изображение, где черный фон это сам QImage
т.е. Изображение получается каким то уменьшенным.


Название: Re: работа с QGraphicsScene
Отправлено: Igors от Сентябрь 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");
Убедитесь что все работает, потом уже проверяйте в проекте


Название: Re: работа с QGraphicsScene
Отправлено: deefox от Сентябрь 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();
        }
    }

Но нормалное ли такое решение для скажем получасовго или часового приема? сцена увеличивается и увеличивается


Название: Re: работа с QGraphicsScene
Отправлено: Igors от Сентябрь 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 столбца


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


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

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




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

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


Название: Re: работа с QGraphicsScene
Отправлено: deefox от Октябрь 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() увеличивает не только видимую область сцены?





Название: Re: работа с QGraphicsScene
Отправлено: Igors от Октябрь 05, 2016, 10:39
есть небольшие тормоза при QMatrix::scale(), на сцене гдето 60 тыс итемов(линий),
Та откуда такое безумие? Покажите скриншот с выделенным одним айтемом

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


Название: Re: работа с QGraphicsScene
Отправлено: Racheengel от Октябрь 05, 2016, 10:41
Предела нету, сцена ничего автоматом не убирает.


Название: Re: работа с QGraphicsScene
Отправлено: deefox от Октябрь 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]

один к сожалению не могу, но вот старый скриншот в теме
(http://i11.pixs.ru/storage/2/4/6/risunok1pn_2023419_23434246.png)

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



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


Название: Re: работа с QGraphicsScene
Отправлено: deefox от Октябрь 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к - по размеру всего скрина).





Название: Re: работа с QGraphicsScene
Отправлено: Igors от Октябрь 10, 2016, 12:06
но для квадрата нужен жуткий код. исходя из того что приходят линии по вертикали. нужно было задействовать сразу несколько имеджов. по отрисовке 1 квадрат отриовывался 900 мс(с учетом приема). по 1 линии было быстро. но не практично(пакет пришел - пакет отрисовал, слишком часто происходила перерисовка.) поэтому сделал так. в итоге отрисовался за 300 мс -  я думаю разница ощутима. было все идеально .но эти пакеты(как мне говорят). могут приходить и час и два, поэтому мне нужно сделать динамически очищаемую сцену, и чтобы можно было бы приблизить (во время приема и отрисовки) рассмотреть  что нибудь. а возможно еще сверху че нибудь нарисовать(ну это пока только в планах)
Я бы делал примерно так: один айтем - один квадрат. Данные к нему добавляются по мере поступления, а перерисовка вызывается только когда истек заданный интервал времени