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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Отрисовка большого числа объектов  (Прочитано 11808 раз)
NickSin
Гость
« : Март 03, 2014, 16:59 »

Суть проблемы такова.
Нужно создать сцены с отрисовкой большого количества квадратой , там их больше миллиона. Отрисовываются они сверху вниз.
Использую QGraphicScene  и QGraphicView.  Проблема в том, что если их отрисовываю больше 10 тысяч, программа виснет вся.

Хотелось бы узнать, в какую сторону мне стоит двигаться, чтобы решить проблему рисования такого числа объектов.

У меня пока что есть 2 варианта:
1) Динамическая подгрузка по мере пролистывания
2) использовать какой-то 2ой буффер для рисования.

Заранее спасибо.
Записан
Bepec
Гость
« Ответ #1 : Март 03, 2014, 17:43 »

Виснет или вылетает или кончается память?
Записан
OKTA
Гость
« Ответ #2 : Март 03, 2014, 19:03 »

знать бы еще что за квадраты и как рисуются подробнее  Улыбающийся
Записан
NickSin
Гость
« Ответ #3 : Март 05, 2014, 10:42 »

Виснет или вылетает или кончается память?
Зависает, видимо идет за подкачкой, а это процесс медленные
знать бы еще что за квадраты и как рисуются подробнее  Улыбающийся
Рисуются просто - по вертикали , сверху вниз. Квадрат обычный, только его отрисовка. Размер каждого из них 80х80.
Что-то вроде такого:
[]
[]
[]
[]
[]

ну и так 10000 штук.
Записан
Bepec
Гость
« Ответ #4 : Март 05, 2014, 10:46 »

И тут вопрос уже конкретнее - память он всю выбирает (2Гб)?
Просто если вы делаете всё правильно, GraphicsView сама решает вопрос "скрытия" ненужных элементов.

PS мне кажется что у вас банально памяти не хватает Улыбающийся
Записан
OKTA
Гость
« Ответ #5 : Март 05, 2014, 10:58 »

Точняк что-то в алгоритме не то. Я тут ради интереса нарисовал 10000 квадратов 100x80 в QML и все ок - съело 50 мегабайт всего.
Хоть и QML, но он все равно использует все те же QGraphicScene и QGraphicView.
Поправьте if i'm wrong.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Март 05, 2014, 11:20 »

Поправьте if i'm wrong.
У QML2 свой движек, не основанный на QGraphicsXXX.
Записан
NickSin
Гость
« Ответ #7 : Март 05, 2014, 11:40 »

И тут вопрос уже конкретнее - память он всю выбирает (2Гб)?
Просто если вы делаете всё правильно, GraphicsView сама решает вопрос "скрытия" ненужных элементов.

PS мне кажется что у вас банально памяти не хватает Улыбающийся
кушает 150 метров.
Тогда раз уж она такая умная, при скроле, жутко тормозит в половине обьектов, вторая половина обьектов скролится быстро!
Точняк что-то в алгоритме не то. Я тут ради интереса нарисовал 10000 квадратов 100x80 в QML и все ок - съело 50 мегабайт всего.
Хоть и QML, но он все равно использует все те же QGraphicScene и QGraphicView.
Поправьте if i'm wrong.
жаль я с ним не знаком как и с тем как он интегрируется в QT  приложение.
Поправьте if i'm wrong.
У QML2 свой движек, не основанный на QGraphicsXXX.
Об я точно не знал.

В общем суть в том, что когда начинаю 100000 или даже 1000000 он тупо не выводит и виснит.
на 100 тысячах сьедает около  1 гига, а вот на миллионе я подозреваю что ему захочется 10 гигов оперативы.
Вот я и думаю, может можно как то подгружать изображение по мере появления его в сцене, дабы убрать подвисания.
Или искать какую-то альтернативу, до которой я пока не додумался .
Записан
OKTA
Гость
« Ответ #8 : Март 05, 2014, 11:49 »

Поправьте if i'm wrong.
У QML2 свой движек, не основанный на QGraphicsXXX.

Я про 1.1. Он, на сколько я знаю, как раз использует! Поправьте, если опять не прав))
Записан
NickSin
Гость
« Ответ #9 : Март 05, 2014, 11:50 »

Поправьте if i'm wrong.
У QML2 свой движек, не основанный на QGraphicsXXX.

Я про 1.1. Он, на сколько я знаю, как раз использует! Поправьте, если опять не прав))

забыл уточнить использую 5.2 qt
Записан
OKTA
Гость
« Ответ #10 : Март 05, 2014, 11:51 »

Может пора код показать?
Записан
Bepec
Гость
« Ответ #11 : Март 05, 2014, 12:03 »

10к объектов тем более однотипных для него не нагрузка. Если правильный код. Так что выкладывайте лучше всего проект минимально компилируемый, бум разбираться.
Записан
NickSin
Гость
« Ответ #12 : Март 05, 2014, 12:12 »

Может пора код показать?
10к объектов тем более однотипных для него не нагрузка. Если правильный код. Так что выкладывайте лучше всего проект минимально компилируемый, бум разбираться.

ок для вывода создал диалог в нем QGraphicView
Код:
#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);

}

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


void Dialog::paintEvent(QPaintEvent *)
{

    QGraphicsScene* scene;
    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 = 10000;

    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);

        scene->addRect(QRectF(150.0, 100.0 + i*100, 80.0, 80.0),pen, br);
        if(i != numbers - 1)
            scene->addLine(QLineF(190.0, w + (i+1)*100, 190.0, w + (i+1)*100 + 20),pen);

        scene->addRect(QRectF(300.0, 100.0 + i*100, 80.0, 80.0),pen, br);
        if(i != numbers - 1)
            scene->addLine(QLineF(340.0, w + (i+1)*100, 340.0, w + (i+1)*100 + 20),pen);

        scene->addRect(QRectF(450.0, 100.0 + i*100, 80.0, 80.0),pen, br);
        if(i != numbers - 1)
            scene->addLine(QLineF(490.0, w + (i+1)*100, 490.0, w + (i+1)*100 + 20),pen);
    }



    ui->graphicsView->setScene(scene);


}

ну и тут пускаю 4 линии квадратов - получается 40 тысяч обьектов + линии связи между ними
« Последнее редактирование: Март 05, 2014, 12:14 от NickSin » Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


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

Код
C++ (Qt)
void Dialog::paintEvent(QPaintEvent *)
{
 
   QGraphicsScene* scene;
   scene = new QGraphicsScene(this);
без комментариев  Плачущий
Записан
NickSin
Гость
« Ответ #14 : Март 05, 2014, 12:50 »

Код
C++ (Qt)
void Dialog::paintEvent(QPaintEvent *)
{
 
   QGraphicsScene* scene;
   scene = new QGraphicsScene(this);
без комментариев  Плачущий
Я конечно понимаю, что все можно записать одной строкой или просто стат. обьект создать, но на тот момент когда я писал, я сильно не заморачивался )
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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