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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: QML, нужно ли?  (Прочитано 22779 раз)
RSATom
Гость
« Ответ #30 : Октябрь 22, 2014, 13:29 »

На всякий случай: под винду существует сборка Qt5 с Angle Lib, с которой нет необходимости в OpenGL - т.к. в runtime осуществляется трансляция вызовов в DirectX. Но по накладным расходам такого решения ничего сказать не могу...
Записан
Отражение луны
Гость
« Ответ #31 : Октябрь 22, 2014, 16:55 »

В моём проекте, например, ползают муравьи. Над каждым из них прямоугольник с текстовой информацией, которая может меняться несколько раз в секунду. Прямоугольники с текстом полупрозрачные. Муравьёв пускай будет тысяч пять. При таких условиях QtQuick не будет тормозить? Проблем с поддержкой OpenGL на машине нет.

И да, я хочу на экране видеть всех муравьёв одновременно. И прямоугольники с актуальной информацией над каждым. Ибо каждый муравьишка дорог моему сердцу, и я не хочу никого обделять своим вниманием Улыбающийся.
Это не сложно проверить.
Код:
import QtQuick 2.2

Rectangle {
    id: root
    width: 800
    height: 800

    Component {
        id: termitClass
        Rectangle {
            id: termit
            height: 10
            width: 30
            color: "green"
            opacity: 0.5
            property bool textFlag: true
            property real dx: 0
            property real dy: 0
            property int interval: 400

            Text {
                anchors.centerIn: parent
                text: (textFlag) ? "Муравей" : "Я бегу"
                font.pixelSize: 6
                color: "white"
            }

            Timer {
                interval: termit.interval
                onTriggered: termit.move();
                running: true
                repeat: true
            }

            Timer {
                interval: 5000
                onTriggered: termit.check();
                running: true
                repeat: true
            }

            function move() {
                termit.x = termit.x+dx;
                termit.y = termit.y+dy;
                textFlag = !textFlag;
            }

            function check() {
                termit.dx = termit.dx*-1;
                termit.dy = termit.dy*-1;
            }
        }
    }

    Component.onCompleted: {
        for (var i=0; i<5000; i++) {
            var nx = Math.random()*root.width;
            var ny = Math.random()*root.height;
            var interval = Math.random()*400+200;
            termitClass.createObject(root, {"x": nx, "y": ny, "dx": Math.random()*4-2, "dy": Math.random()*4-2, "interval": interval});

        }
    }
}
Вообщем-то, лагать у меня начинает начиная с 20003000 штук, на 5 тысячах снижается фпс, но картинка остаётся вполне себе интерактивной. Да, текст перерисовывается раз в несколько секунд, как и просили, и именно на его отрисовку уходит большая часть ресурсов. И это на интегрированной видеокарте, производительность которой оставляет желать лучшего.
Моё мнение - qml с задачей вполне справился.
« Последнее редактирование: Октябрь 22, 2014, 17:03 от Отражение луны » Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #32 : Октябрь 22, 2014, 18:57 »

Хотя бы координаты муравьишки выводите Улыбающийся. И интерактивности немного добавить. Так, например:
Код:
import QtQuick 2.3
import QtQuick.Controls 1.2

ApplicationWindow {
    visible: true
    width: 800
    height: 800
    title: qsTr("Hello World")

    menuBar: MenuBar {
        Menu {
            title: qsTr("File")
            MenuItem {
                text: qsTr("&Open")
                onTriggered: console.log("Open action triggered");
            }
            MenuItem {
                text: qsTr("Exit")
                onTriggered: Qt.quit();
            }
        }
    }

    Rectangle {
        id: root
        width: 800
        height: 800
        anchors.centerIn: parent
        color: "grey"

        Component {
            id: termitClass
            Rectangle {
                id: termit
                height: 20
                width: 80
                color: "green"
                border.color: "black"
                clip: true
                opacity: 0.5
                property bool textFlag: true
                property real dx: 0
                property real dy: 0
                property int interval: 400

                Text {
                    id: termitInfo
                    anchors.centerIn: parent
                    //text: (textFlag) ? "Муравей" : "Я бегу"
                    font.pixelSize: 10
                    color: "white"
                }

                Timer {
                    interval: termit.interval
                    onTriggered: termit.move();
                    running: true
                    repeat: true
                }

                Timer {
                    interval: 5000
                    onTriggered: termit.check();
                    running: true
                    repeat: true
                }

                function move() {
                    termit.x = termit.x+dx;
                    termit.y = termit.y+dy;
                    textFlag = !textFlag;
                    termitInfo.text = "x:" + x.toFixed(2) + " y:" + y.toFixed(2);
                }

                function check() {
                    termit.dx = termit.dx*-1;
                    termit.dy = termit.dy*-1;
                }
            }
        }

        Component.onCompleted: {
            for (var i=0; i<5000; i++) {
                var nx = Math.random()*root.width;
                var ny = Math.random()*root.height;
                var interval = Math.random()*400+200;
                termitClass.createObject(root, {"x": nx, "y": ny, "dx": Math.random()*4-2, "dy": Math.random()*4-2, "interval": interval});

            }
        }

    }

    MouseArea {
        anchors.fill: parent
        onWheel: {
            if (wheel.angleDelta.y > 0)
            {
                root.width += 10;
                root.height += 10;
            }
            else
            {
                root.width -= 10;
                root.height -= 10;
            }
        }
    }
}

Насколько быстро такой вариант работает? Для непритязательных может и пойдёт, но для меня задержка в 1 секунду на действие пользователя неприемлема. Надеюсь Вы понимаете, что в реальном проекте намного больше требований по функциональности, а не просто прямоугольники с текстом. Там много чего ещё должно делаться, и помимо графики. И чтобы 1000 муравьёв в готовом приложении бегали с приемлемой скоростью, 5000 из наших примеров должны просто летать Улыбающийся.
Записан

Пока сам не сделаешь...
Отражение луны
Гость
« Ответ #33 : Октябрь 22, 2014, 20:20 »

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

Цитировать
Там много чего ещё должно делаться, и помимо графики. И чтобы 1000 муравьёв в готовом приложении бегали с приемлемой скоростью, 5000 из наших примеров должны просто летать Улыбающийся.
Это уже другой вопрос, тут речь идет именно о производительности графики. Поскольку графику тут отрисовывает видеокарта - заботиться о том, что реализация функционала сильно повлияет на производительность этой самой графики не приходится.
« Последнее редактирование: Октябрь 22, 2014, 20:25 от Отражение луны » Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #34 : Октябрь 27, 2014, 10:42 »

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

Надо попробовать сравнить FPS у QML с QPainter.
Сделал на QPainter:
Код:
painEvent...{
    QPainter p(this);
    p.setOpacity(0.5);
    p.setBrush(Qt::green);
    for(int i=0; i<800; i++) {
        p.drawRect(0,0,80,20);
        p.drawText(QRect(0,0,80,20),"FPS: 100500"); }
    fpsCounter++;
    p.drawText(50,50,QString::number(fps));}

итого: fps 22(cpu 30%) - да прямоугольник неподвижный но это не критично
Поставил в вашем примере с муравьями 800 объектов с аналогичным текстом: fps 35(cpu 46%)
таймеры в обоих случаях поставил 10ms
« Последнее редактирование: Октябрь 27, 2014, 11:41 от deMax » Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #35 : Октябрь 27, 2014, 12:11 »

Наоборот, требования к отрисовке такого количества объектов с таким количеством обновлений в секунду чуть более чем избыточны, их вполне можно считать нагрузочным тестированием. В реальном проекте Вы нигде такого не встретите.
Впрочем, пожалуй просто предложу вкинуть сюда пример, в котором другая технология/фреймворк/что либо еще справится с этой задачей лучше, да еще и будет способна построить полноценный интерфейс при этом без задействования для этих целей огромного штата сотрудников (т.е. ассемблер не предлагать).
Если Вы такие проекты не встречали, это не значит, что их нет Улыбающийся. Я, кстати, изначально как раз и говорил о том, что QML можно использовать с такими проектами. Только нужно понимать, для чего предназначен QML, его возможности и тонкости работы, для эффективного использования. В примере моей задачки использовать QML "в лоб"  для отображения 5000 элементов будет тяжеловато, но можно встроить собственный рендеринг этих элементов в существующий интерфейс на QML.

В качестве "тонкостей работы" можно, например, отметить такую вещь: если в моём примере убрать "clip: true", то всё начинает работать шустрее. В QML есть ещё такая очень удобная штука как Property Binding, но её следует использовать с осторожностью в случае большого числа элементов и их связей. QQuickItem сам по себе достаточно объёмный в плане памяти объект, большое их количество будет прилично кушать эту память. И ещё много всякого подобного.

Цитировать
Там много чего ещё должно делаться, и помимо графики. И чтобы 1000 муравьёв в готовом приложении бегали с приемлемой скоростью, 5000 из наших примеров должны просто летать Улыбающийся.
Это уже другой вопрос, тут речь идет именно о производительности графики. Поскольку графику тут отрисовывает видеокарта - заботиться о том, что реализация функционала сильно повлияет на производительность этой самой графики не приходится.
Видеокарта, конечно, штука мощная и со свой задачей справляется на все 100%, но данные для неё готовит CPU. Так что и загруженный функционал будет влиять на частоту отрисовки, и тормозной рендеринг сцены будет влиять на функционал.
Записан

Пока сам не сделаешь...
Отражение луны
Гость
« Ответ #36 : Октябрь 27, 2014, 12:32 »

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

Цитировать
В качестве "тонкостей работы" можно, например, отметить такую вещь: если в моём примере убрать "clip: true", то всё начинает работать шустрее.
На мой взгляд документированный атрибут класса не относится к тонкостям работы. В документации вполне явно указано, где его стоит использовать, а где - нет. http://qt-project.org/doc/qt-5/qtquick-performance.html#clipping
Вообщем-то с биндингами то же самое.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #37 : Октябрь 27, 2014, 13:16 »

Если подойти к этой проблеме с другой стороны - человеческий мозг не способен обрабатывать такое количество обновлений, построение такого рода интерфейса является плохим решением, поскольку такое количество информации, очевидно, нуждается в автоматизированной её обработке и более структурированном отображении)
Я с этим тоже согласен, но если в ТЗ требуется отображение тысяч муравьёв с информацией одновременно, значит их надо выполнять Улыбающийся. Автоматизированная обработка может сочетаться с визуальным отображением всей этой какофонии: неинтересных муравьёв можно отображать менее заметно, интересных - выделять. Можно детализировать выводимую информацию в зависимости от различных условий и настроек. Но предельный случай должен работать с заданными требованиями по быстродействию. QML, в данном случае, с этим не справляется. Но он для этого и не предназначен. Вот воспользоваться плюшками QML и встроить в его интерфейс свой рендеринг - привлекательная возможность Улыбающийся.

На мой взгляд документированный атрибут класса не относится к тонкостям работы. В документации вполне явно указано, где его стоит использовать, а где - нет. http://qt-project.org/doc/qt-5/qtquick-performance.html#clipping
Вообщем-то с биндингами то же самое.
Я, в общем-то, тоже об этом Улыбающийся. Не все сразу на такие разделы документации попадают, тем подобные темы и ценны.

итого: fps 22(cpu 30%) - да прямоугольник неподвижный но это не критично
Поставил в вашем примере с муравьями 800 объектов с аналогичным текстом: fps 35(cpu 46%)
таймеры в обоих случаях поставил 10ms
В приведённой выше ссылке, в начале, заявлены цели для быстродействия графики, так что есть к чему стремиться Улыбающийся.
Записан

Пока сам не сделаешь...
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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