使用“cached:true”时,具有静态源的 DropShadow 更快

Posted

技术标签:

【中文标题】使用“cached:true”时,具有静态源的 DropShadow 更快【英文标题】:DropShadow with static source is faster when using "cached:true" 【发布时间】:2016-10-13 18:26:56 【问题描述】:

我将从我的测试用例开始。它创建了 21 个不变的带阴影的蓝色矩形。它还创建了一个不断重绘的 1x1px Canvas3D,所以我可以检查它在所有其他事情发生的情况下重绘的频率(Canvas3D 有一个内置的fps 属性)。在 DropShadow 项目上设置 cached: true 时,我得到 60 FPS。如果没有,我会得到 30 FPS。但我希望在这两种情况下都能获得相同的 FPS,因为考虑到源矩形永远不会更新,我不希望重新计算阴影的模糊。

main.cpp:(琐碎)

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();

main.qml

import QtQuick 2.5
import QtQuick.Window 2.2
import QtCanvas3D 1.1

Window 
    visible: true
    width: 800
    height: 600
    id: window

    Column 
        Text 
            text: canvas3d.fps + " FPS"
            font.pointSize: 18
        
        Flow 
            width: window.width
            spacing: 10
            Repeater 
                model: 21

                ShadowedItem 
                
            
        
        Canvas3D 
            id: canvas3d
            width: 1; height: 1 // nonzero size so it can be redrawn
            property var gl;

            onInitializeGL: 
                // should get and save context, otherwise FPS isn't measured for some reason
                gl = canvas3d.getContext("canvas3d", depth:true, antialias:true, alpha:true);
            
        
    

ShadowedItem.qml:

import QtQuick 2.0
import QtGraphicalEffects 1.0

Item 
    width: 100
    height: 100

    Rectangle 
        anchors.fill: parent
        id: rect
        visible: false
        color: "blue"
    

    DropShadow 
        source: rect
        anchors.fill: rect
        cached: true // !
        radius: 8
    

对性能差异有什么想法吗?

【问题讨论】:

【参考方案1】:

我为此发布了follow-up question。在对它的 cmets 中,我了解到当场景中的 1 个项目(例如本例中的 Canvas3D)需要重绘时,整个场景都会被重绘。这意味着每次我的 Canvas3D 被重绘(不断地)时,所有的阴影都会被重绘。如果cachedfalse,这意味着重新计算模糊,因此会减速。

【讨论】:

以上是关于使用“cached:true”时,具有静态源的 DropShadow 更快的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VBA 中创建具有动态行源的列表框

使用 Chrome 扩展修改具有本地源的 iframe 的元素

阻止具有源的框架访问跨域框架 使用相同的域

具有动态查询的 Jdbc 消息源的 Spring 集成流

结构化流式传输:具有流式传输源的查询必须使用 writeStream.start() 执行

在具有 S3 源的 CloudFront 中启用 HTTP/2 不起作用