【问题标题】:What consumes less memory an actual image or a drawn image?实际图像或绘制图像消耗的内存更少?
【发布时间】:2013-05-07 11:36:07
【问题描述】:

我正在设计一个应用程序,我正在使用PaintCode 创建一些图像。

使用该程序,我获得了我创建的每个图像的实际代码,因此我可以选择插入代码或使用实际图像。我想知道什么会消耗更少的内存,是图像代码还是实际的 PNG?

我知道图像的内存消耗是width x height x 4 = bytes in memory,但我不知道由代码生成的图像是内存效率更高、内存效率更低还是收支平衡?

考虑到不同的屏幕分辨率,这个决定尤其重要。在代码中创建图像并将其扩展为我想要的任何大小比每次都去 Photoshop 要容易得多。

【问题讨论】:

    标签: ios image cocoa-touch cocoa


    【解决方案1】:

    此答案与其他答案不同,因为我的印象是图形上下文是您最常见的目标——您并不总是渲染到离散位图。因此,出于典型绘图的目的:

    我想知道什么会消耗更少的内存,是图像代码还是实际的 PNG?

    代码很可能会大大减少内存消耗。

    我不知道由代码生成的图像是内存效率更高、内存效率更低还是不平衡?

    有很多变量,没有简单的方程式可以告诉您对于任何给定的输入哪个更好。如果使用 WYSIWYG 创建足够简单,它可能会比代码小得多。

    如果您需要为基于矢量的渲染器创建中间光栅化或图层,则添加第一层后内存将大致相等。通常,一个人确实/不应该将每个视图或层(不是 CALayer,顺便说一句)渲染到这些中间体,而是直接渲染到图形上下文中。当您的所有视图都直接渲染到图形上下文中时,它们会写入同一个目的地。

    使用代码,您还可以接受一些其他可能会增加大量内存的变量。字体加载和缓存的效果可能非常高,并且您使用的代码生成器不会检查如果您发现需要最小化内存消耗,如何实现这些资源的最佳缓存和共享。

    【讨论】:

      【解决方案2】:

      只要最终图像尺寸(以点为单位)与显示尺寸(以点为单位)相同,则根本没有区别。例如,最终在您的应用程序中显示的是 100x100 位图。不管它们是如何获得的,它们的位数都是相同的。

      内存浪费的地方是保存比界面中实际显示的图像(点尺寸)大得多的图像。

      如果我从我的应用程序包中加载一个 3MB 的 PNG,将其缩小到 100x100,然后在界面中绘制它,然后放开原来的 3MB PNG,结果是完全相同相同的数量后备存储中的内存,就好像我自己使用 Core Graphics 从头开始​​绘制 100X100 图形上下文的内容(这是 PaintCode 可以帮助您做的)。

      【讨论】:

      • 应用程序在设备上占用的内存量确实会有所不同(显然)。如果你在代码中绘制它,它会比你将不同的分辨率保存为你的应用程序包的一部分要小得多。但是,正如您在此处讨论的那样,一旦将其加载到 RAM 中,就不会有任何区别。
      • 我认为它不仅仅是一个拐杖。如果您的设计师想要创建需要动态生成的任何类型的复杂图像,那么他们在 PaintCode 中绘制任何不均匀的形状(例如人物或徽标)将比您以编程方式手动创建更容易。
      【解决方案3】:

      矢量图像的存储空间几乎总是小于其对应的光栅图像,但照片除外。但是在内存中,如果您需要显示它们,它们都必须被光栅化,因此它们将使用或多或少相同数量的内存。

      但是,我对 PaintCode 的实用性持高度怀疑态度;一般来说,最好使用标准图像格式,如 .svg 或 .eps,而不是非标准格式,如 Objective C 中的领域特定语言 (DSL)。

      【讨论】:

      • 您关于矢量与光栅的答案是正确的,但是 PaintCode 确实会生成 Objective C 代码。 PaintCode 可以导入 SVG 和 PSD 文件(两种标准格式),以及使用它们内置的绘图功能。有关更多信息,请参阅 OP 中指向 PaintCode 的链接。
      【解决方案4】:

      如果您的目标是绘制图像,则应尽可能使用UIImageView。这通常是将图像显示到屏幕上的最快和最便宜的方式,而且相当灵活。

      有人在这里解释得更好。 source

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多