在通用 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 应用程序中打包多个分辨率的主要内容,如果未能解决你的问题,请参考以下文章
iOS Web 应用程序(尤其是 iPad)的多个“apple-touch-startup-image”分辨率?
使用pyinstaller打包python小程序(没有使用第三方模块)
适用于iOS网络应用的多个“苹果触摸启动图像”分辨率(尤其适用于iPad)?