我目前正在为使用C ++制作的一些音频应用程序设计和开发GUI(使用Juce框架)。
到目前为止,我一直在使用位图图形来创建自定义滑块和刻度盘,通过使用“电影条”样式图像来动画组件(意味着当用户与滑块交互时,它会触发更改偏移的方法胶片图像改变组件外观)。根据原始图像的大小和“帧”的数量,CPU使用级别会发生相当大的变化。
首先,在CPU消耗方面最有效的位图文件格式是什么?目前我正在使用PNG图像。
其次,将矢量图形用于这类图形组件会更有效吗?我理解位图和矢量图形之间的主要区别,但我没有找到任何关于GUI交互的CPU使用率水平的信息。
或者CPU使用率是否会降低到正在使用的特定方法/函数/库/框架?
谢谢!
答案 0 :(得分:2)
或者CPU消耗量是否会降低到正在使用的特定方法/函数/库/框架?
任何 都会影响它。
基于像素的图像可能需要一段时间才能读取磁盘,因为它们越大。压缩类型可能需要更多时间来解压缩。载入时,矢量可能需要更多时间来渲染。
话虽这么说,我绝对不希望您选择的图像类型对其性能产生任何影响。由于您没有提供代码示例,因此很难进行推测。
通常,您会期望图像的运行时成本在加载时发生。所以每当你创建一个图像对象。如果你在整个地方创建一个图像,那么它可能是昂贵的。您的胶片可能正在重新创建图像而不是加载它们并缓存它们。
答案 1 :(得分:0)
在选择位图与矢量图形之前,请先调查您的图形处理器是否支持矢量图或位图图形。有些事情需要很长时间才能作为载体绘制。
您是否尝试过双重缓冲? 这是您在显示器(图形处理器)加载另一个缓冲区时写入内存缓冲区的地方。
从资源加载一次位图。将它们存储为内存快照,以避免从格式转换它们的额外成本。
你的图形处理器是否支持“blitting”? Blitting是图形处理器可以复制存储器中的矩形区域(位图)并在显示之前显示它并应用可选操作(例如使用现有位的XOR)。
要点: 要提高渲染速度,只需将文件中的图像转换为位图形式一次。存放在某个地方。根据需要参考此转换后的位图。接下来,研究并实现双缓冲。最后,调查并使用位blitting或blitting。
其他优化规则也适用于此,例如检查设计,删除需求,循环展开,通过指针传递图像与复制它们,以及使用布尔逻辑和Karnaugh(sp?)映射减少“if”语句。 / p>
答案 2 :(得分:0)
通常,渲染矢量图形的计算比将位图的矩形区域blit到屏幕需要更长的时间。但对于基本的UI内容,两者都不应该特别密集。
您可能应该进行一些分析。也许你的重绘次数比必要时要多。或者,每次尝试从中进行绘制时,PNG都会被解码。 (我对Juce不熟悉。)
对于直接的Windows应用程序,我可能会在启动时将矢量图形渲染为依赖于设备的位图,然后只是从位图到屏幕的blit。使用矢量可以提供DPI独立性,而依赖于设备的位图的blitting是绘制像素块的最快方法。我相信在渲染到依赖于设备的位图时会完成颜色匹配,因此您甚至不会在屏幕绘图上产生ICM开销。
答案 3 :(得分:-1)
很久以前,矢量图形已被抛弃 - 位图图形性能更高。问题是你可以将一个位图发送到GPU一次,然后通过一个简单的副本再将其渲染出来。
其次,GPU使用它自己的纹理压缩。我相信DirectX是DXT5,但是当GPU看到纹理时,它并不关心你加载它的是什么。
然而,即使使用蹩脚的集成GPU,现代CPU也应该完全没有简单的GUI渲染问题。如果你正在努力,那么现在是时候重新审视你正在使用的技术了。也许你的框架很慢或者你对它的使用不是最理想的。