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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Отрисовка большого числа объектов  (Прочитано 11802 раз)
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #15 : Март 05, 2014, 13:01 »

При чем здесь одна строка?Непонимающий? paintEvent может вызываться сотни, а то и тысячи раз в секунду. Если и дальше мысль непонятна, то может стоит начать с каких-нибудь книг, а не морочить людям голову?
Записан
Bepec
Гость
« Ответ #16 : Март 05, 2014, 13:07 »

Начать стоит с главы "Рисование в Qt".
Там описывается алгоритм работы и зачем нужна функция paintEvent.

Вкратце - у вас при каждом перерисовке окна создаетcя QGraphicsScene.
Записан
NickSin
Гость
« Ответ #17 : Март 05, 2014, 13:14 »

Начать стоит с главы "Рисование в Qt".
Там описывается алгоритм работы и зачем нужна функция paintEvent.

Вкратце - у вас при каждом перерисовке окна создаетcя QGraphicsScene.
вот блин, а на это я как-то внимания и не обратил, спасибо.
Про паинтевент уже прочел, косяк с памятью теперь понял.

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


И если можно, то еще один вопрос. Я хочу на свои квадраты "нанести" текст.  Через методы класса rect, сцены  я это не увидел, точнее добавление текста есть в сцене, но не понял как задать позицию его размещения.
« Последнее редактирование: Март 05, 2014, 13:25 от NickSin » Записан
NickSin
Гость
« Ответ #18 : Март 05, 2014, 13:24 »

При чем здесь одна строка?Непонимающий? paintEvent может вызываться сотни, а то и тысячи раз в секунду. Если и дальше мысль непонятна, то может стоит начать с каких-нибудь книг, а не морочить людям голову?
Извиняюсь за неточность своих суждений
Записан
Bepec
Гость
« Ответ #19 : Март 05, 2014, 14:17 »

/offtop пишите update: и дальше своё сообщение. 2 сообщения подряд не комильфо.

А вы код приведите нормальный и именно с вашими тормозами.
Не тот, который не работает.
Не тот, который не запускается.
Не тот, который вы даже запускать не пробовали.
А тот, который вы запускали и который у вас тормозит и компилируется.
Записан
NickSin
Гость
« Ответ #20 : Март 05, 2014, 15:42 »

/offtop пишите update: и дальше своё сообщение. 2 сообщения подряд не комильфо.

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

Код почти тот же, только убрал его из евента ( как было выяснено выше).
Сцена отрисовывется сразу в конструкторе диалога ( если что, прошу сильно не бить, хотел сделать для тестирования графики отдельное окно).
Обьекты на сцене всегда статичны и изменяться не будут.

Так вот я рисую  10000 обьектов  в памяти они занимают около 40 мб, запуск идет примерно секунды 3.  Проблема в том, что скролинг  первой половины квадратов идет с тормозами, а вторая прокручивается нормально.

Запуск кода с 100000 квадратами мне не удается ввиду того, что на машине, которой я пишу, памяти всего 2гб.
Update: код с 100000 квадратами запустился, но компилился 8 минут , в памяти занял 400 мб

П.С. и хотел бы узнать можно ли как то на квадраты добавить текст не наследую класс прямоугольника и не переопределяю методы. В просто добавлении текста в сцену, нельзя как я понял сменить ему координаты, ну или я просто не понял еще как это делается, так как Qt изучаю только 3тий месяц.

Сам код:
dialog.cpp
Код:
#include "../../headers/test_headers/dialog.h"
#include "ui_dialog.h"
#include <QtCore>
#include <QtGui>

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    QGraphicsScene* scene = new QGraphicsScene(this);
    scene->setBackgroundBrush( Qt::white );

    QPen pen( Qt::black );
    pen.setWidth( 1 );
    QBrush br( Qt::white );


    qreal w = 80.0;
    int numbers = 100000;

    for(int i = 0; i < numbers; i++){
        scene->addRect(QRectF(0.0, 100.0 + i*100, 80.0, 80.0),pen, br);
        if(i != numbers - 1)
            scene->addLine(QLineF(40.0, w + (i+1)*100, 40.0, w + (i+1)*100 + 20),pen);

    }



    ui->graphicsView->setScene(scene);
}

Dialog::~Dialog()
{
    delete ui;
}

dialog.h
Код:
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsItem>
#include <QStyleOptionGraphicsItem>
#include <QPainter>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;

};

#endif // DIALOG_H

main.cpp
Код:
#include "../headers/test_headers/dialog.h"
#include <QApplication>



int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    Dialog testgraph;
    testgraph.show();


    return app.exec();
}
« Последнее редактирование: Март 05, 2014, 16:25 от NickSin » Записан
Bepec
Гость
« Ответ #21 : Март 05, 2014, 17:00 »

/offtop и выбрасывать проект не в виде
Код:
bla bla
а в виде архива с файлами и pro файлом внутри Показает язык
Записан
NickSin
Гость
« Ответ #22 : Март 07, 2014, 09:59 »

/offtop и выбрасывать проект не в виде
Код:
bla bla
а в виде архива с файлами и pro файлом внутри Показает язык
Хорошо, я вас понял, спасибо за замечание.

Вот проект:http://sendfile.su/950202
Записан
Bepec
Гость
« Ответ #23 : Март 07, 2014, 13:19 »

/offtop вы можете принять мои замечания за придирки, но это правила поведения на форуме ) Негласные ^.^

Посмотрел. На 10к не тормозит, на 20к не тормозит, на 40к не тормозит. Вот на 100к у меня начинается та же байда что и у вас - первая половина с тормозами, вторая нормально.

Но в любом случае стоит подумать, нужны ли вам эти миллионы квадратов. К тому же я так понимаю вы хотите в них ещё и текст засунуть, а потом ещё что нибудь прикрутить Показает язык
PS цель у вас какая? Не то, чего вы хотите добиться сейчас, а что в конце вы хотите получить Показает язык
Записан
NickSin
Гость
« Ответ #24 : Март 07, 2014, 13:38 »

/offtop вы можете принять мои замечания за придирки, но это правила поведения на форуме ) Негласные ^.^
Да все норм)

Посмотрел. На 10к не тормозит, на 20к не тормозит, на 40к не тормозит. Вот на 100к у меня начинается та же байда что и у вас - первая половина с тормозами, вторая нормально.

Но в любом случае стоит подумать, нужны ли вам эти миллионы квадратов. К тому же я так понимаю вы хотите в них ещё и текст засунуть, а потом ещё что нибудь прикрутить Показает язык
PS цель у вас какая? Не то, чего вы хотите добиться сейчас, а что в конце вы хотите получить Показает язык
Я пытался экспериментировать с флагами ViewportUpdateMode и OptimizationFlags но успехов не добился. Где-то видел, что писали о наличии так называемого 2ного буфера для загрузки, но не знаю.... к месту он тут или нет?

Цель такова, что пишу графическое представление логов из файла. В файле может быть множество состояний, которые мне нужно вывести  в виде  таких квадратов( пока квадраты потом буду юзать полигон).
Правда пока не знаю как туда текст вбить, но хочу этого добиться.
Стараюсь рассмотреть все случаи отрисовки, точнее максимально возможный вариант,  чтобы потом  не мучится .
Записан
Bepec
Гость
« Ответ #25 : Март 07, 2014, 14:04 »

Совет. Большой и доброжелательный - плюньте на вариант ""визуализация всего лога одновременно". Ничего кроме головной боли он вам не добавит Улыбающийся Ибо 100 квадратов ~ 160Кб, 1к ~ 3,06 Мб, 1кк ~ 1,6 Гб, 2кк ~ 3,2 Гб. В логе может быть и больше Веселый ( примечание - квадратов без линий!!! )
Разбивайте по частям и уже их скармливайте во View. Размер части уже сами подбирайте в зависимости от количества событий (ну или строчек лога).

update: тем более если лог в текстовом формате, тогда и "леталку" по файлу надо делать. Было у меня одно время когда собирался подобное сделать, но другие дела похоронили проект Улыбающийся
« Последнее редактирование: Март 07, 2014, 14:41 от Bepec » Записан
NickSin
Гость
« Ответ #26 : Март 12, 2014, 10:05 »

Совет. Большой и доброжелательный - плюньте на вариант ""визуализация всего лога одновременно". Ничего кроме головной боли он вам не добавит Улыбающийся Ибо 100 квадратов ~ 160Кб, 1к ~ 3,06 Мб, 1кк ~ 1,6 Гб, 2кк ~ 3,2 Гб. В логе может быть и больше Веселый ( примечание - квадратов без линий!!! )
Разбивайте по частям и уже их скармливайте во View. Размер части уже сами подбирайте в зависимости от количества событий (ну или строчек лога).

update: тем более если лог в текстовом формате, тогда и "леталку" по файлу надо делать. Было у меня одно время когда собирался подобное сделать, но другие дела похоронили проект Улыбающийся
а можно по подробней как вы это реализовали или немного бы расписали идею, чтобы я уже делал в своем направлении) ?
Записан
Bepec
Гость
« Ответ #27 : Март 12, 2014, 11:04 »

Ну смотрим. Допустим как у меня было - общение по оптоволокну с контроллером, который на себе держит много устройств. В секунду идёт примерно ммм... мб 10 информации Веселый строчек в логе в общем от 1 до 10к получается.
Примеряемся как хотим реализовать рисование -  я выбрал график состояний "--^-^-^". Поясняю - ровная линия всё ок, всплески - тревоги.
Отмеряем сколько нам нужно для "одновременного" показа на экране. У меня умешалось примерно 600 состояний.
Потом просто читаем первые 600, отдаём отрисовывать.
Пользователь тыкнул вниз - считываем ещё 1 (или к примеру ещё 600) от текущей позиции и отдаём на отрисовку.
scrollBar делаем свой, минимум - 0, максимум - содержимое файла лога / 600.
В принципе всё. Далее если пользун крутит scrollBar, просто читаем текущее положение скролла*600 из файла и отрисовываем.

Можно было конечно измудриться и сделать ещё кеширование +-600 для скорости, но мне скорости хватало.
Ещё дальше появился диапазон. Т.е. не разбиваем на части, а отдаём X записей = допустимая память / память занимаемая одной записью.

PS но дальше уже не развивалось, ибо я ушёл с того места работы.
Записан
NickSin
Гость
« Ответ #28 : Март 12, 2014, 11:20 »

Ну смотрим. Допустим как у меня было - общение по оптоволокну с контроллером, который на себе держит много устройств. В секунду идёт примерно ммм... мб 10 информации Веселый строчек в логе в общем от 1 до 10к получается.
Примеряемся как хотим реализовать рисование -  я выбрал график состояний "--^-^-^". Поясняю - ровная линия всё ок, всплески - тревоги.
Отмеряем сколько нам нужно для "одновременного" показа на экране. У меня умешалось примерно 600 состояний.
Потом просто читаем первые 600, отдаём отрисовывать.
Пользователь тыкнул вниз - считываем ещё 1 (или к примеру ещё 600) от текущей позиции и отдаём на отрисовку.
scrollBar делаем свой, минимум - 0, максимум - содержимое файла лога / 600.
В принципе всё. Далее если пользун крутит scrollBar, просто читаем текущее положение скролла*600 из файла и отрисовываем.

Можно было конечно измудриться и сделать ещё кеширование +-600 для скорости, но мне скорости хватало.
Ещё дальше появился диапазон. Т.е. не разбиваем на части, а отдаём X записей = допустимая память / память занимаемая одной записью.

PS но дальше уже не развивалось, ибо я ушёл с того места работы.

хм если честно просто и изящно выходит)  По сути, если задать значение сролл бару, а потом при скроллинге считывать строчки из файла, с позиции указанной нашим скроллом + то количество обьектов, которые мы видим на сцене = получает интервал строчек, которые мы считываем.
Тогда у меня вопрос,  перерисовка в таком случае быстро происходит?  Ибо как я понял, при перемещение скроллбара мы почти что покадрово "рисуем" лог из файла? 
Записан
Bepec
Гость
« Ответ #29 : Март 12, 2014, 11:24 »

Отрисовка быстрая, но у меня не было никаких "раздутых" реализаций. Просто график.
По секрету скажу - все все view перерисовывают содержимое покадрово.

Подход простой, но не особо удобный - это была первая версия. Там нельзя подвинуть на  4-604, а можно было только 0-600 или 600-1200. Второй подход был удобнее для пользователей.

PS если заморочиться с перерисовкой, можно вообще типовые блоки сделать и их ляпать в виде pixmap. Кто-то писал что так оно ещё быстрее будет.
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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