使用任意 QML 项目作为缓存图像源

2023-12-05

编辑:原来的问题仍然包含在下面,但我决定重新命名为一个表单,该表单在各种情况下对开发人员更有用,其中一些在我的回答中描述,因为原始问题的解决方案变成了提供更广泛的应用领域。


我有一组应用程序的灰度图标,并且要求用户可以更改图标颜色。

因此,显而易见的解决方案是使用库存Colorize元素来自QtGraphicalEffects.

效果本身有一个cached属性 - 缓存该特定效果的结果,以便不会连续计算。但是,这仅适用于该效果的特定实例,这意味着如果有多个图标实例,并且每个实例都有着色效果,则该缓存不会在不同实例之间共享。

显然,考虑到所有图标都具有相同的大小和颜色,并且可以重用 VRAM 中的数据,从而节省 VRAM 和 GPU 时间,单个缓存就足够了。

因此,最大的问题是如何重用该单一效果的单一缓存并多次显示它而不产生任何开销。

另外,上一个问题是关于我当前学习的图标着色课程。但是,我可能缺少另一种方法。

当然,效率是关键,但简单性也是需要的,我的意思是我可以想到几种低级方法来非常有效地做到这一点,但它们都需要更复杂的低级实现,它们在 QML 中不可能做到。


结果发现解决方案出乎意料地简单。

在这种情况下,特定于OP - 即着色图标,最有效的方法是简单地使用自定义ShaderEffect with a trivial片段着色器 - 设置gl_FragColor到所需的颜色,作为vec4以及源图像的 alpha 值。实际上不需要缓存任何东西,因为着色器非常简单且快速,尽可能快。

只有一件事需要考虑 - QML 场景图可能会在纹理图集中分配原始图像,默认实现会将纹理从图集中复制到另一个纹理。我们不想要这个因为它违背了目的 - VRAM 使用量将会上升,因为这将为每个“实例”完成,并且新分配的纹理也有可能比它们需要的更大,因为在某些平台上存在限制纹理可以有多小,在这种情况下我们谈论的是图标,所以它们不会那么大。

解决方案是显式设置supportsAtlasTextures为真。这意味着您还必须传递图集中纹理的偏移量并计算偏移量 - 开销仍然很小。这将确保效率,来自图集的纹理不会在内存中重复,此外,渲染引擎实际上允许使用来自同一图集的不同纹理在一次调用中批量处理不同的着色器效果。


类似的方法可用于缓存几乎所有内容,并使用该缓存来显示“图像” - 使用ShaderEffectSource“捕获”所需的图像,然后使用ShaderEffect使用更简单的片段着色器 - 只需从源采样器输出数据。我立即想到了几个非常有用的用例:

  • 它可用于“实例化”图像,这是计算密集型着色器的结果,请记住ShaderEffectSources and ShaderEffects 可以按任意顺序链接
  • 它可以用来实例化程序生成的图像,再次使用着色器,这样可以用作平铺纹理,甚至可以非常有效地进行动画处理
  • 它可以与 QML Canvas 一起使用,以使用复杂的画布绘图作为多个“图像”的缓存和源
  • 它可以用作图像,由复杂的 QML 组合而成Items - 这些实际上对 RAM 的占用相当大,想象一下这样一个场景,您有 1000 个对象,每个对象都由 20 个不同的 QML 项目组成 - 矩形、文本、图像、上帝保佑动画,内存中有 20000 个对象 - 这就是根据我的测试,例如 500 MB 的 RAM 使用量,但如果它们相同,则可以使用单个对象来提供缓存,而所有其他对象只能使用单个着色器效果来显示该缓存。它对 CPU 时间也有影响 - 假设你的设计必然会改变值 - 这是一个非常常见的场景,如果内存中有 20000 个对象,那就是 20000 个评估的绑定 - 即使对于简单的表达式,这在移动设备上也可能需要几秒钟,在此期间冻结屏幕。缓存将冻结时间减少 1000 倍,几乎不存在。

  • 它还可以用于缓存和实例化动画,显着减少所需的 CPU 时间,并且还可以处理视频

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

使用任意 QML 项目作为缓存图像源 的相关文章

  • 图像随机损坏(但刷新后加载)并显示“资源解释为图像但使用 MIME 类型 text/html 传输”

    我目前正在开发一个简单的 php 网站 问题是 我的整个网站中的图像 发生在所有 php 文件中 随机损坏并显示错误资源解释为图像 但以 MIME 类型 text html 传输但是 如果我尝试多次刷新页面 可以再次加载图像并且错误消失 我
  • 将 SVG 文件转换为多个不同大小的 PNG 文件

    我有一个 SVG 格式的徽标图像 我想知道是否有办法生成多个不同大小的 png 文件 例如 我设置了 20 个不同的宽度和高度 它会生成 20 个 PNG 文件 如果我必须一次处理 5 张图像也没关系 我已经安装了 illustrator
  • 如何在wpf中翻转图像

    我最近学习了如何使用 TransformedBitmap 和 RotateTransformed 类旋转 BitmapImage 现在我可以对图像进行顺时针旋转 但如何翻转图像呢 我找不到执行 BitmapImage 水平和垂直翻转的类 请
  • 如何在MATLAB中显示由三个矩阵表示的图像?

    我有 3 个相同大小的 2D 矩阵 假设 200 行和 300 列 每个矩阵代表三种 基本 颜色 红色 绿色和蓝色 之一的值 矩阵的值可以在 0 到 255 之间 现在我想组合这些矩阵以将它们显示为彩色图像 200 x 300 像素 我怎样
  • 判断位图是否全黑的有效方法是什么?

    我想知道是否有一种超级有效的方法来确认 Image 对象引用全黑图像 因此位图中的每个像素都是 ARGB 255 0 0 0 你会推荐什么 大多数位图的尺寸为 1024 x 6000 像素 尽管假设它们始终是该尺寸并不安全 我需要这个 因为
  • 如何将 QFile 与 std::iostream 一起使用?

    是否可以像 std iostream 一样使用 QFile 我很确定那里一定有一个包装纸 问题是在哪里 我有另一个库 它需要 std istream 作为输入参数 但在我的程序中 此时我只有一个 QFile 我使用以下代码提出了自己的解决方
  • Qt:更改 Mac OS X 上的应用程序 QMenuBar 内容

    我的应用程序对多个 页面 使用 QTabWidget 其中顶级菜单根据用户所在的页面而变化 我的问题是 尝试重新创建菜单栏的内容会导致严重的显示问题 它在除 Mac OS X 之外的所有平台上按预期使用第一种和第三种样式 尚未测试第二种 但
  • QFileDialog::getOpenFileName 调试时崩溃,显然是由项目名称引起的?

    我遇到了一个让我非常困惑的问题 我在 Windows 7 上使用 Qt Creator 3 1 2 和 Qt 5 3 使用 MSVC 10 0 编译器和 Windows 8 1 调试工具中的 CDB 不确定我是否应该寻找特定于 Window
  • 在 Chrome 中,应用于包含图像的锚点的轮廓高度不正确

    对于我正在开发的网站 我希望当链接聚焦 悬停 活动时 链接周围会出现虚线轮廓 我希望文本和图像链接发生这种情况 我遇到的问题是 虽然我的代码在 Firefox 和 IE 中运行良好 但在 Chrome 7 0 517 41 中 虚线轮廓与我
  • 在 Primefaces 中以编程方式创建命令按钮

    我正在尝试创建一个带有输入文本和命令按钮的动态表单 一切正常 但是当我单击命令按钮时 永远不会调用操作侦听器 请提出我做错了什么或者这是否是 PF 或 Mojarra 的错误 代码如下 panel new Panel panel setHe
  • python中的StringIO实际用途是什么?

    StringIO到底是用来做什么的 我一直在互联网上寻找一些例子 然而 几乎所有的例子都非常抽象 他们只是展示 如何 使用它 但它们都没有表明 为什么 和 在什么情况下 应该 将使用它 附注不要与 stackoverflow 上的这个问题混
  • 为什么动态 qml 对象的创建如此缓慢,有哪些合理的替代方案?

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

    这个问题具体是关于Qt libraries 5 0 0 for Windows VS 2010 406 MB at http qt project org downloads http qt project org downloads 但我
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • QML MouseArea 将事件传播到按钮

    我正在开发一个应用程序 其菜单类似于 Android 版 Gmail 收件箱应用程序菜单 基本上 当您按下按钮打开菜单时 它就会滑入视图 用户可以将其滑开或按菜单上的按钮 对于滑动我使用了代码SwipeArea from kovrov ht
  • 如何将图像放入此 UIPickerView 中?

    我不知道如何创建一个在文本一侧带有图像的自定义 UIPickerView 我一直在寻找一种方法 我刚刚发现了这个 UIView pickerView UIPickerView pickerView viewForRow NSInteger
  • 从 Firefox 33.0.2 中的 javascript 清除 ssl 客户端证书状态(已删除专有 window.crypto)

    我正在寻找一种方法来清除 Firefox 中的 SSL 客户端证书缓存 作为一种 注销 功能 以便服务器在我下次连接到服务器时不再通过客户端证书识别我 解决方案来自从 JavaScript 清除 ssl 客户端证书状态 https stac
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • VBA将二进制图像转换为网页的base64编码字符串

    我正在尝试读取 JPG 文件并将该文件转换为 base64 编码的字符串 该字符串可用作网页上的嵌入 jpeg 我在网上发现了两个在 VBA 中进行 Base64 编码 解码的函数 它们似乎被广泛接受 编码 解码过程产生了我的原始二进制字符

随机推荐

  • 我如何在heroku上使用标签“legacy-peer-deps”进行安装

    我正在尝试将我的应用程序部署到 heroku 上 但收到构建错误 无法使用 npm install 安装依赖项 无论如何 我可以使用 legacy peer deps 进行安装吗 太感谢了 我尝试编辑我的 procifile 文件 其中包含
  • 使用蒙特卡罗方法绘制 Pi

    I can evaluate the value of pi using different data points by Python But for each repeat I want to plot the scatter plot
  • 使用 Devise 进行 OmniAuth 单点登录,invalid_credentials

    我有 3 个 Web 应用程序 A B 和 C 应用程序 A 包含用户数据库 如果访问应用程序 B 和应用程序 C 我希望用户被重定向到应用程序 A 进行身份验证 然后返回到他们尝试访问的任何应用程序 同时 他们应该登录所有应用程序 除非有
  • 如何保护 Web 服务 URL 的安全?

    我有一个带有网络服务网址的 Android 应用程序 如果有人解密我的 apk 文件 Web 服务 url 将变得可见 我正在使用 HTTP POST 来调用 Web 服务 任何人都可以通过反编译 apk 文件来读取代码这个网站 我的注册页
  • 在按钮单击事件中打开设备联系人列表

    如何在按钮单击事件中打开 Android 设备联系人列表 试试这个代码 yourButton setOnClickListener new YouButtonEvent class YouButtonEventimplements OnCl
  • 如何从imageView的url设置图像

    我想使用 Url 在 ImageView 中设置图像 例如我有这个 url 但是没有设置url的选项 EDIT 创建一个扩展类异步任务 public class ImageLoadTask extends AsyncTask
  • java (log4j) 按对象类型记录过滤器

    我目前有一个使用 log4j 实现的日志记录语句 log info Failed to create message for CustomerData 这将记录一些敏感数据CustomerData 有没有办法阻止记录任何实例Customer
  • 无法在 Jboss AS 7 上定义 oracle 数据源

    我正在使用 Jboss AS 7 1 1 final 并且我正在尝试添加 oracle 数据源
  • 使用 LINQtoSQL 获取随机行

    有没有办法使用 LINQToSQL 从表中返回随机行 是的 在表的计数范围内生成一个随机数 然后 Skip 该数字 Take 1 然后返回结果序列的第一个元素 就像是 var R new Random var ToSkip R Next 0
  • 从 Python 运行 shell 命令并实时打印输出

    我想编写一个函数 一次执行多个 shell 命令并实时打印 shell 返回的内容 我目前有以下不打印 shell 的代码 我使用的是 Windows 10 和 python 3 6 2 commands foo foofoo p subp
  • ReferenceError:描述未定义 NodeJs

    我正在尝试定义一些端点并使用进行测试nodejs In server js I have var express require express var func1 require func1 js var port 8080 var se
  • 将具有多个 from 的 linq 查询表达式转换为扩展方法语法 [重复]

    这个问题在这里已经有答案了 我无法将此代码转换为扩展方法语法 var query from c in context Customers from o in c Orders where o DateSent null select new
  • Sql Server 2008 地理 LineString 大小限制

    今天我遇到了地理类型可能的大小限制Linestrings在 Sql Server 2008 中 当我创建一个线串时STGeomFromText 包含 567 个点 其中包含长 纬度和 Z 坐标 一切正常 但是 如果我向线串再添加一个点 我会
  • 命名管道上的 WriteFile 有时会返回 ERROR_NO_DATA

    我有一个 C 程序 它正在创建一个命名管道来写入数据 有客户反映了客户端连接命名管道但服务器端写入数据失败的情况 用ERROR NO DATA 我能找到的任何 MSDN 页面都没有真正解释此错误代码 有人对如何解决这个问题有任何想法吗 或者
  • Spring Security 更新身份验证成功后的上次登录日期

    如何在身份验证成功时触发我的方法 我想更新我的数据库列 上次登录日期 在谷歌上查了一下 但仍然不明白应该如何完成 这是我的 spring security xml
  • 在.NET中使用PEM编码的RSA私钥

    我有一个私钥 如下所示 开始 RSA 私钥 一些私钥数据 结束 RSA PRIVA 我需要在我的 C 项目中使用此密钥 但我找不到任何如何使用此格式的密钥的示例 谢谢 步骤 1 获取 一些私钥数据 content remove BEGIN
  • 验证 ADF 移动应用程序中的用户名和密码

    我正在 adf 移动应用程序中开发一个简单的登录页面 以下是现在登录 amx 页面中的一段代码
  • SQL trunc/group/order by 日期(日/月/季度/年),总和跳过日期,没有数据

    我参与了一个需要按日期构建直方图的项目 在我之前 这是通过 Java 代码对每个矩形 日期子区域 对数据库进行大量 SQL 查询来完成的 我尝试另一种方法 select sum CNT trunc DATE MM from DATA whe
  • 在 Windows 上,mkbundle 因链接器错误而失败

    我正在尝试构建一个需要在可能未安装 NET 的环境中运行的控制台实用程序 Mono 的 mkbundle 似乎是解决这个问题的一个很好的解决方案 但是当在 Windows 10 上通过 cygwin 在一个简单的项目上运行 mkbundle
  • 使用任意 QML 项目作为缓存图像源

    编辑 原来的问题仍然包含在下面 但我决定重新命名为一个表单 该表单在各种情况下对开发人员更有用 其中一些在我的回答中描述 因为原始问题的解决方案变成了提供更广泛的应用领域 我有一组应用程序的灰度图标 并且要求用户可以更改图标颜色 因此 显而