iOS - 基于设备的不同图像或缩放相同的图像?

iOS - Different images based on device OR scaling the same image?

似乎开发人员总是为不同的设备创建不同的图像资源并根据设备加载它们。但是,仅为最大分辨率设备 (iPad) 创建图像然后将图像缩小为 iPhone 6、5 等是否有任何缺点?

我使用 SpriteKit,所以我会创建不同大小的 SKSpriteNodes 并将相同的纹理应用于它们并缩放它以适合节点。

我知道性能是需要考虑的因素(为旧设备加载大图像)。但除此之外,还有别的吗?这些图片会显得更 pixelated/blurry 吗?

perfect/purist 答案是为每个设备分辨率使用单独的图像和代码。

然而,从您自己的时间和理智的角度来看,考虑到分辨率和屏幕尺寸的数量不会很快减少,使用有限的设置是有意义的。那么,为什么要浪费时间准备多张图像,除非 xcode 之类的人可以使它变得更简单。

对于正方形或固定纵横比的图片,我认为您只需要一张图片。对于像背景这样的图像存在问题,无论分辨率如何,您至少需要满足不同的纵横比:因此单独的纵横比图像是必不可少的(例如 3:2 和 16:9),除非您不这样做请注意压缩、拉伸或裁剪图像。

如果您发现性能在测试中受到影响,您可以随时添加较低分辨率的图像。

在像素化方面,这是你无法避免的。如果您考虑从 x3 分辨率变为 x1 分辨率时会发生什么,您必须将 3x3 像素混合到 1x1 中。在高分辨率下,任何一个像素宽(如一条线)或在几个像素上颜色快速变化的东西都会受到最大影响。这个网上有很多文章你可以看看

避免像素化的唯一方法是使用矢量图像,但这需要特殊的软件来加载矢量图像并将它们渲染到 UIImages 中。

当你缩小时,每张图片都会受到不同的影响。一个想法可能是选择 x2 图像,将 iPhone 3 缩小 1,iPhone 6+ 放大 1 到 x3。这将以原始分辨率覆盖大多数当前设备,并且可能提供不太明显的像素化。

一段时间以来,我的印象是您稍后缩放的单个图像也可以。

要了解多种实现方式以及一些基准,请查看 NSHispter: Image Resizing Techniques

要进一步阅读,请查看 Core Image Apple 文档,NSHipster 文章也提到了该文档。

没有人真正回答图像质量是否会降低。我只是尝试实现这一点,与保持原始大小相比,图像确实显得像素化程度更高。

视情况而定。如果截断图像会造成问题,那么使用一张图像或每个宽高比一张图像当然更经济。

对于像照片这样的图像,这可能是完全可以接受的,因为这种图像往往不包含像素完美的特征。

但是,如果我们处理的是图形艺术作品 - 细线、锐利的轮廓、像素完美的特征 - 缩放可能会严重损害质量。

考虑以下示例:假设您想创建一个固定大小的自定义文本字段。文本区域由线宽为 1px 的黑色轮廓包围。您正在为您的作品使用视网膜分辨率,并且您的起点是 4" 屏幕尺寸。如果文本字段与屏幕一起缩放,该框将如何显示在其他屏幕尺寸上?它在非屏幕上的外观如何-视网膜显示?

非视网膜:分辨率需要减半。想象一下您的作品中有一块 2x2 像素 - 它需要计算为一个像素。我们的轮廓只有 1px 的宽度,所以一个 2x2 的像素块有一条线 运行 通过它包含两个黑色和两个白色像素。生成的非视网膜像素将为灰色。实际上,缩放有点复杂,但结果会是模糊的、黑色较少且线条稍粗的。

Scaled Retina:分辨率需要提高。想象一个分辨率为 4" 屏幕 1.5 倍的设备。1px 线需要变为 1.5 像素宽,这显然行不通。相反,原始 1px 线将被拉伸为灰度两个(或更多)像素,近似于 "amount of blackness" 一条 1.5 像素的线。

无论哪种方式(向上或向下)缩放都会使轮廓变得模糊、变粗和变黑。

该示例并不完美,因为 iOS 允许定义具有可完美缩放的可拉伸部分的图像。对于我们的矩形框,这实际上是可能的。但它不适用于更复杂的艺术品。

如果像素完美是必须的,则没有办法绕过每个分辨率或矢量图形的图像 (Quartz / SVGKit / ...)

编辑: 我已经在 Photoshop 中使用双线性缩放复制了我的示例。它在设备上看起来可能略有不同,因为它可能使用另一种缩放算法。但我想你会明白这一点...

我可以根据我在内存使用方面的经验来回答。已经有足够多的人回答了图像质量问题,所以唯一的另一个问题是内存使用。我已经使用了您在我的游戏 Piston Flip 中描述的技术,并且效果很好,因为我没有使用很多纹理或节点。但是,在我正在开发的另一款使用图块的游戏中,我无法使用大图像并缩小它们,因为每个设备几乎只能处理为其屏幕尺寸指定的图块加载。

所以这真的取决于。