3

我目前正在为一些用 C++ 制作的音频应用程序(使用 Juce 框架)设计和开发 GUI。

到目前为止,我一直在使用位图图形来创建自定义滑块和转盘,通过使用“胶片条”样式的图像来为组件设置动画(这意味着当用户与滑块交互时,它会触发一种改变胶片偏移量的方法-strip 图像以更改组件外观)。根据原始图像的大小和“帧”的数量,CPU 使用水平会发生很大变化。

首先,就 CPU 消耗而言,最有效的位图文件格式是什么?目前我正在使用PNG图像。

其次,对这些图形组件使用矢量图会更有效吗?我了解位图和矢量图形之间的主要区别,但我没有找到任何关于它们在 GUI 交互方面的 CPU 使用级别的信息。

还是 CPU 使用率取决于所使用的特定方法/函数/库/框架?

谢谢!

4

4 回答 4

2

或者 CPU 消耗是否取决于所使用的特定方法/函数/库/框架?

这些事情中的任何一个都可能影响它。

基于像素的图像可能需要一段时间才能从磁盘读取,它们越大。压缩类型可能需要更多时间来解压缩。加载时,矢量可能需要更多时间来渲染。

话虽如此,我绝对不会期望您选择的图像类型对其性能有任何影响。由于您没有提供代码示例,因此很难推测。

通常,您会期望图像的运行时成本在加载时发生。因此,每当您创建图像对象时。如果您在整个地方创建图像,那么它可能会很昂贵。您的胶片可能正在重新创建图像,而不是一次加载并缓存它们。

于 2011-09-02T18:25:17.047 回答
0

在选择位图与矢量图形之前,请调查您的图形处理器是否支持矢量图形或位图图形。有些东西需要很长时间才能绘制为矢量。

你试过双缓冲吗?
这是您在显示器(图形处理器)加载另一个缓冲区时写入内存中的缓冲区的地方。

从资源中加载您的位图一次。将它们存储为内存快照,以避免从格式转换它们的额外成本。

您的图形处理器是否支持“blitting”?位图是图形处理器可以在内存中复制一个矩形区域(位图)并在显示之前将其与应用可选操作一起显示(例如与现有位进行异或)。

摘要:为了提高渲染速度,只需将文件中的图像转换为位图形式一次。把它存放在某个地方。根据需要参考此转换后的位图。接下来,研究并实施双缓冲。最后,调查并使用位传输或传输。

其他优化规则也适用于此,例如审查设计、删除需求、循环展开、通过指针传递图像与复制它们,以及使用布尔逻辑和卡诺 (sp?) 映射来减少“if”语句。

于 2011-09-02T18:25:24.710 回答
0

通常,渲染矢量图形的计算要比将位图的矩形区域位图块传送到屏幕要花费更长的时间。但是对于基本的 UI 内容,两者都不应该特别密集。

你可能应该做一些分析。也许您重绘的频率比必要的要高得多。或者每次您尝试从中提取PNG时,它可能正在被解码。(我对 Juce 不熟悉。)

对于一个直接的 Windows 应用程序,我可能会在启动时将矢量图形渲染为与设备相关的位图,然后从位图到屏幕。使用矢量为您提供 DPI 独立性,并且从依赖于设备的位图进行位图传输是绘制像素块的最快方法。我相信当您渲染到与设备相关的位图时,颜色匹配就完成了,因此您甚至没有屏幕绘图上的 ICM 开销。

于 2011-09-02T19:37:20.033 回答
-1

矢量图形很久以前就被抛弃了——位图图形的性能更高。问题是您可以将位图发送到 GPU 一次,然后通过简单的副本将其渲染得更久。

其次,GPU 使用它自己的纹理压缩。我相信 DirectX 是 DXT5,但是当 GPU 看到纹理时,它并不关心你从什么加载它。

然而,即使集成了糟糕的 GPU 的现代 CPU 在简单的 GUI 渲染方面也绝对没有问题。如果你在挣扎,那么是时候重新审视你正在使用的技术了。也许您的框架很慢,或者您对它的使用不是最理想的。

于 2011-09-02T19:46:29.773 回答