为什么动态 qml 对象的创建如此缓慢,有哪些合理的替代方案?

2024-06-19

我想要实现的目标类似于棋盘游戏。有一个100*100的网格,放在一个Item它驻留在一个Flickable.

“游戏板”的各个矩形都是 svg 图像,目前大约有 20 种,可能会增加到数百种。

作为基准测试,我只是尝试用元素填充“世界”:

Component.onCompleted:
{
    var i,j;
    for (i=0; i<100; ++i) 
        for (j=0; j<100; ++j)
        {
            var type = (i+j) % 20;

            Qt.createQmlObject('import QtQuick 2.0; Image {source:"qrc:///icons/img/symbol'+type+'.svg";
                width: 32*scaling.factor;
                height: 32*scaling.factor;
                x:'+i*32+'*scaling.factor;
                y:'+j*32+'*scaling.factor}',
                mainScreen);
        }
}

这需要超过5秒在一台性能较好的电脑上。

但是,加载所有内容后,它可以顺利运行,滚动和缩放(scaling.factor是由滑块或旋转框设置的浮动值)。

svg 图像非常简单,仅包含一些基本形状。如果我尝试只加载一个简单的矩形而不是 svg 图像

Qt.createQmlObject('import QtQuick 2.0; Rectangle {color
     : "red"; width: 32; height: 32; x:'+i*32+'; y:'+j*32+'}',
     mainScreen);

仍然需要大约 3 秒。即使没有图像,也没有动态缩放。

我记得20年前,有一些策略游戏运行在单核、低于400 MHz CPU的计算机上,这些游戏有更大的地图、更复杂的图块、动画、寻路等。我们甚至没有谈论3d.

现代电脑怎么会因为显示几千个非常基本的形状而感到窒息呢?它不应该是从磁盘加载的时间,因为元素位于资源文件中,甚至使用矩形而不是图像进行的测试也非常慢。

不保持所有显示,并且只加载可见屏幕边界附近的元素显然是一种可行的方法,或者如果我有一张 10000*10000 的地图,那就是这样。我期望 100*100 个项目应该能够同时显示,特别是在具有良好分辨率的屏幕上,其中大多数项目都是可见的。

我是否错过了一些明显的事情,或者我应该完全忘记 Qt Quick,我应该在 OpenGL 或某些 2d 引擎中手动完成所有操作吗?

Edit:

正如评论所建议的,Qt.createQmlObject非常慢。

因此我尝试了

var component = Qt.createComponent("field.qml");
component.createObject(mainScreen, {"x": i*32, "y": j*32 });

Where field.qml仅包含一个Rectangle{},或者,在第二个测试中,只是一个空的Item{}。在这两种情况下,10000 次迭代都花费了超过 3 秒的时间。将 svg 添加到field.qml只增加了0.8秒的时间。

顺便问一下,图像不应该被缓存吗?即使我重复使用相同的简单 svg(仅包含 3 个简单的矩形),也会花费很多时间。

Using a Repeater{}使一切变得更快。空的Rectangles 的渲染时间大约为 0.2 到 0.3 秒,svg 图像的渲染时间为 1 秒。 (但是,这种方法还有其他缺点。当我测试完不同的方法后,我会发布答案)


(Although it doesn't solve my specific problem perfectly, I'll post this as an answer because it fits the scope of the question and might be useful for others.)

尽管官方示例使用动态创建对象,但该方法仅在对象数量相当少时才有用。对于大量的物品,ListView or a TableView具有仅渲染实际位于视图边界内的项目的优点。

TableView
{
    anchors.fill: parent
    model: ListModel {}
    itemDelegate: MyField{}
    Component.onCompleted:
    {
        var i;
        for (i=0; i<10000; ++i)
        {
            model.append({});
        }
}

Qt.createQmlObject or Component.createObject,并且比Repeater

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么动态 qml 对象的创建如此缓慢,有哪些合理的替代方案? 的相关文章

  • 在 Windows 10 家庭版上运行性能配置文件

    我正在尝试在 Windows 10 上运行 IIS Express 的 Visual Studio 2017 探查器 但我遇到了一些麻烦 当我尝试安装所有必需的 IIS 组件时 我注意到我缺少一些组件 因为我运行的是 Windows 10
  • 这是使用嵌入式 SQL 相对于存储过程的有效优势吗?

    这是我没有听说过的 SP 论据 火焰喷射器 温柔对待羽绒虱 由于每次访问数据库服务器都会产生相关开销 因此我建议将 SQL 放在 SP 中而不是嵌入代码中的一个可能原因是 您可以更容易地进行更改 而不会影响性能 例如 假设您需要执行返回标量
  • 从 QWebEngineView 或 QWebEnginePage 中删除滚动条

    有没有办法删除滚动条QWebEngineView或者我可以以某种方式访问 它的 ScrollArea 吗 使用 webkit 就这么简单 WebView gt page gt setScrollBarPolicy Qt Vertical Q
  • 在 Snow Leopard 上的 64 位 Cocoa 应用程序中快速提取电影帧

    我在 Snow Leopard 上编写了一个 64 位 Cocoa 应用程序 用于提取单个帧 来自使用 QuickTime API 的电影 它使用 QTMovie currentFrameImage 不幸的是 这非常慢 正如这里指出的 ht
  • 为什么在 Python 中创建类比实例化类慢得多?

    我发现类的创建比类的实例化慢得多 gt gt gt from timeit import Timer as T gt gt gt def calc n return T class Haha object pass timeit n lt
  • 如何使用 Qt/C++ 创建/读取/写入文件并将设置存储在程序本地

    我是一个不幸的 C 初学者 使用 Qt GUI 设计器程序似乎非常适合我的需求 但我在尝试编写所需的代码时遇到了问题 我可以使用 QSettings 字符串在硬盘驱动器上存储本地设置 但我个人讨厌程序执行某些程序所做的 HOME LOCAL
  • QImage 转换为 QML

    我的应用程序通过网络接收 JPEG 实时流 每秒 16 帧 直播流应使用 QML 显示 接收部分是用C 编写的 所有UI都是用QML编写的 如何将图像数据输入 QML 窗口 我已经研究过如何显示 QImage 但还没有找到解决方案 实现 Q
  • 如何释放Qthread对象的内存?

    我做过这样的事情 in the mainwindow s constructor QThread thr new QThread soundWorker work new soundWorker connect this SIGNAL pl
  • 从 QTableView 读取和写入文件

    如何读取和写入输入 QTableView 的文本文件日期 这就是我所拥有的 但我想在将数据添加到表中时保存数据 当然能够在重新打开应用程序时读回它 有什么教程可以参考吗 MainWindow MainWindow QWidget paren
  • 纹理大小的限制?安卓 Open GL ES 2.0

    我想知道可用于任何 Android Opengl Es 2 0 项目的纹理大小是否有任何限制 据我所知 尺寸为 4096x4096 的巨大纹理意义不大 因为它是在小屏幕上渲染的 但是 如果要求是在运行时在许多纹理之间切换怎么办 如果我想要一
  • 如何使我的网站获得更好的性能

    嘿那里 我在 Windows 2008 服务器上运行 IIS7 在高峰时段 我们有以下行为 CPU负载接近空闲 请求排队 使用资源监视器进行监控 执行时间超过10秒 1 4 请参阅以前的版本和编辑 5 异步做事 按照建议 我创建了一个简单的
  • QNetworkAccessManager 的替代方案

    我正在BB10中绘制地图 地图被划分为图块 开始时 用户给出经度 纬度和缩放级别 地图将显示在该坐标处 我通过使用 QNetworkAccessManager 执行 http 请求来获得单个图块 首先下载 7x5 块 但问题是 当用户开始在
  • 当数据大小超过 500 万时,在 mongoDb 中从 java 调用 find() 查询会变慢

    我的应用程序在从 java 的 mongoDb 中执行 find 操作时遇到性能问题 当数据大小超过 500 万时 需要花费大量时间 有时搜索单个文档需要数千毫秒 任何意见都将受到赞赏 java查找查询 db test find flag
  • 使用带有不匹配索引的 pandas .loc 时内存爆炸+分配导致重复轴错误

    这是一个观察将 pandas 单元格与条件连接起来的最 Pythonic 方法 https stackoverflow com questions 69313521 most pythonic way to concatenate pand
  • 具有曼哈顿距离启发式的 A* 算法

    我一直在用 C 语言开发一个 15 个谜题求解器 我的代码使用的大量内存给我带来了一些问题 我不会发布我的代码 因为它太长了 我已经实现了我正在使用的大部分库 它可能会给您带来困惑 让我们从基础开始 我现在正在使用的东西是 全部用C实现 斐
  • 控制台应用程序比 GUI 应用程序运行得更快吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我对编程世界比较陌生 我有几个性能问
  • Qt 中的智能指针[重复]

    这个问题在这里已经有答案了 就像已经写过一样here http blog qt digia com 2009 08 25 count with me how many smart pointer classes does qt have Q
  • 如何使用带有 Scripts.Render 的 ASP MVC 4 捆绑包的脚本延迟属性

    我浏览了 Google 和 Stackoverflow 但没有找到答案 是否有任何内置方法可以使捆绑包按延迟执行 或者有人知道有人为此编写的扩展帮助器方法吗 尝试将 Web Optimization 升级到版本 1 1 0Codeplex
  • “d = dict()”和“d = {}”之间的区别

    python2 7 m timeit d 10000000 loops best of 3 0 0331 usec per loop python2 7 m timeit d dict 1000000 loops best of 3 0 1
  • Java:输入/使用“try-catch”块的开销?

    这个问题说明了一切 尽管命中率不是很高 我测得速度慢了 1 5 倍到 2 倍 但使用 try catch 的字节码和不使用 try catch 的字节码之间没有区别 那么是什么让它通常变慢呢 PL 请注意 问题不是抛出异常的开销 而是进入

随机推荐

  • 使用 C++ 访问 Azure blob 存储 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 AbstractTableModel 获取 JTable 中选定的行

    我有一个JTable using AbstractTableModel我在哪里有一个JCheckBox在第一列中用于选择行 现在 我需要从已检查的表中获取选定的行 现在 我按顺序从第一行遍历到最后一行并获取所有选择的行 如下所示 List
  • 我应该在 Promise.all 中使用 wait 吗?

    我正在构建快速中间件 以对数据库进行两次异步调用 以检查用户名或电子邮件是否已在使用中 这些函数返回的承诺没有捕获 因为我想将数据库逻辑与 req res next 逻辑分开 并且我有集中的错误处理 需要next作为一个论点 在我对本地环境
  • 我想自动生成这种格式的账单编号 (INV1/23) 并且它必须以 1 递增

    我想以这种格式 INV1 23 自动生成帐单号码 而不使用oracle apex中的序列 请在plsql中编写查询 我在此过程中使用了序列 但它对此不起作用 它必须以表格形式显示在交互式报告上 就像当我输入有关账单的数据 例如订单号 订单日
  • 将 std::make_unique 与自定义删除器一起使用

    在使用std unique ptr带有我想要使用的自定义删除器std make unique而不是全新的 我用的是VC 2013 在我看来 没有办法使用std unique ptr如果您使用自定义删除器 我错过了什么还是事实确实如此 附加信
  • Angularjs 范围之外的服务功能

    我在 angularJS 中创建了一个服务 它使用 btford socket io 模块与服务器交互 由于在服务中我已经实现了一些目前在 Angular 内部使用的 API 但为了以后扩展应用程序 我还需要在 Angular 范围之外提供
  • 在 woocommerce 管理订单页面中单击自定义按钮运行函数

    基于 在 woocommerce 中的管理订单列表顶部添加一个按钮 https stackoverflow com questions 49437781 add a button on top of admin orders list in
  • 无法理解寄存器和变量之间的汇编mov指令

    我在 64 位 Linux 上使用 NASM 汇编器 有一些关于变量和寄存器的东西我无法理解 我创建一个名为 msg 的变量 msg db hello world 现在 当我想写入标准输出时 我移动msg to rsi注册 但我不明白mov
  • 为什么 strcpy 的这种使用被认为是不好的?

    我发现了下面的一段C代码 标记为 BAD 又名缓冲区溢出错误 问题是我不太明白为什么 输入字符串长度在分配等之前被捕获 char my strdup const char s size t len strlen s 1 char c mal
  • Erlang:到 Python 实例的端口没有响应

    我正在尝试通过 Erlang 端口与外部 python 进程进行通信 首先 打开一个端口 然后通过 stdin 将消息发送到外部进程 我期待在进程的标准输出上得到相应的答复 我的尝试如下所示 open a port Port open po
  • Python Pandas 滚动聚合一列列表

    我有一个简单的数据框 df 和一列列表lists 我想根据以下内容生成一个附加列lists The df好像 import pandas as pd lists 1 1 2 1 2 3 3 2 9 7 9 4 2 7 3 5 create
  • 熊猫按 n 最大总和分组

    我正在尝试使用groupby nlargest and sum在 Pandas 中一起运行 但在运行时遇到困难 State County Population Alabama a 100 Alabama b 50 Alabama c 40
  • RxJ 从 observable 中获取价值

    在组件中 singleEvent Observable
  • Ember-cli 夹具加载

    我确信我错过了一些小而愚蠢的东西 但似乎无法加载我的装置 这是我有 应用程序 模型 todos js import DS from ember data var Todo DS Model extend title DS attr stri
  • 在 Windows 中使用 PHP 创建受密码保护的 Zip 文件

    我正在 PHP 中创建给定文件的 zip 文件 下面是函数 function create zip file file name zip new ZipArchive zip name file name zip Zip name zip
  • SVN 提交后挂钩在提交后不会运行

    我的服务器上设置了 SVN 存储库 并且遇到提交后问题 我在 iMac 上使用 SmartSVN 作为客户端 我通过 SmartSVN 的 ssh svn 连接 我能够成功连接到 SVN 并对其进行更改 但从 SVN 客户端提交后 我的提交
  • 将 url 参数获取到 asp.net 标签中

    我试图自动将 asp label 的文本设置为 url 参数 但它似乎不起作用 这是我的代码
  • 响应式 CSS 图像锚点标签 - 图像地图样式

    我一直在开发一个响应式网站 并且在图像映射方面遇到了一些问题 图像映射似乎不适用于基于百分比的坐标 经过一番谷歌搜索后 我发现了一个 JS 解决方法 http mattstow com experiment responsive image
  • 枚举类型在打字稿中给出双数组

    我想从枚举数据类型创建一个下拉列表 但是当我尝试将枚举更改为具有名称和值的对象时 枚举数组返回枚举成员的两倍 使用函数这个帖子 https stackoverflow com questions 18111657 how does one
  • 为什么动态 qml 对象的创建如此缓慢,有哪些合理的替代方案?

    我想要实现的目标类似于棋盘游戏 有一个100 100的网格 放在一个Item它驻留在一个Flickable 游戏板 的各个矩形都是 svg 图像 目前大约有 20 种 可能会增加到数百种 作为基准测试 我只是尝试用元素填充 世界 Compo