在通用 iOS 应用程序中打包多个分辨率

Posted

技术标签:

【中文标题】在通用 iOS 应用程序中打包多个分辨率【英文标题】:packaging multiple resolutions in a universal iOS app 【发布时间】:2012-07-19 04:44:33 【问题描述】:

我正在用 Unity3d 编写一个 3D ios 游戏,但找不到关于为不同设备添加不同纹理大小的完整而直接的答案。

首先,我假设一个真正通用的应用程序需要每个纹理的 3 个版本......(非视网膜 iPhone/iPod 的低分辨率,视网膜 iPhone/iPod 和非视网膜 iPad 的 2x res,现在视网膜 iPad 的 4 倍分辨率)我还假设基于苹果定义的命名约定,将应用程序下载到特定设备将仅下载适当的纹理。否则,将所有三种分辨率下载到旧的非视网膜手机将包含 95% 的自重。

链接的 Apple 文档说在视网膜设备的纹理文件名中使用“@2x”,以及适用于设备的“~ipad”或“~iphone”。

https://developer.apple.com/library/ios/documentation/2DDrawing/Conceptual/DrawingPrintingiOS/SupportingHiResScreens/SupportingHiResScreens.html#//apple_ref/doc/uid/TP40010156-CH15-SW8

假设一个 1024x1024 的低分辨率图集文件,并遵循上述命名约定,我们现在必须在每个图像中包含四个文件,但除了文件名之外,其中两个文件是相同的?

例如:

(1024 x 1024) myAtlas~iphone.png
(2048 x 2048) myAtlas@2x~iphone.png 
(2048 x 2048) myAtlas~ipad.png 
(4096 x 4096) myAtlas@2x~ipad.png 

这对吗?

我想我的困惑源于能够轻松地为非视网膜 iPad 和视网膜 iPhone/iPod 使用相同的纹理分辨率,因为屏幕分辨率相当相似,但苹果建议的命名约定似乎没有利用那个。

这将是我在 iOS 上发布的第一个应用程序,也许我完全错过了一些要点?还是我的一些假设是错误的?

【问题讨论】:

【参考方案1】:

    是的,命名约定没有为 iPhone Retina 和 iPad 非 Retina 提供共享图像的方法。

    命名约定仅适用于 UIImage 类和相关 API。虽然您可以UIImage/CGImage 加载 OpenGL ES 纹理,但您绝不需要这样做。随意命名文件,使用UIDevice 类(或相应的GL API)来确定屏幕大小,并使用NSBundle 类自己定位适当的纹理文件。 (有关使用 PVR 纹理文件的一些示例,另请参阅 Apple 示例代码站点。)

    恐怕您对下载到设备的内容的假设不正确。您提交到 App Store 的 .ipa 捆绑包会原封不动地下载到您的用户安装它的任何设备上——如果您提交的通用应用程序包含四种不同设备分辨率的资源,它将与所有四组资源一起安装在设备,即使其中三个未使用。

【讨论】:

感谢 rickster,我开始担心可能是这种情况。因此,鉴于 Unity 可以为某些纹理自动生成 mipmap,除了最高分辨率之外,我真的没有理由包含任何内容。这对我来说似乎真的违反直觉,迫使低端设备承担额外的重量。

以上是关于在通用 iOS 应用程序中打包多个分辨率的主要内容,如果未能解决你的问题,请参考以下文章

XCode 8 通用应用程序:IB 未显示所有设备分辨率

iOS Web 应用程序(尤其是 iPad)的多个“apple-touch-startup-image”分辨率?

使用pyinstaller打包python小程序(没有使用第三方模块)

适用于iOS网络应用的多个“苹果触摸启动图像”分辨率(尤其适用于iPad)?

如果设备上安装的iOS通用链接上有多个支持的应用程序,是不是可以选择每次打开的应用程序?

使用 Launch Screen.xib 模板的真正通用 iOS 启动屏幕?