Tag: 精简

对图像进行下采样以获得更好的内存消耗和UICollectionView性能

任何可能出错的地方都会出错。 墨菲定律 在开发的每个步骤中,我们都会做出影响应用程序整体性能的架构决策。 我们都非常了解功耗和内存消耗对于移动应用程序极为重要。 我们也知道可用内存和应用程序的相对性能之间存在某种关联。 但是,在当今快速解决方案的世界中,缩短的期限和避免过早优化的精神使您容易错过重要的事情。 让我们看一下常见任务-图片库。 对于各种图像布局,它看起来可能会有所不同。 但是它们的共同点是-一批图像同时显示在屏幕上。 问题定义 假设您已决定从服务器获取下载的图像,并将其显示在UIImageView 。 这种方法完全没错。 此外,Apple建议在所有常见情况下使用UIImage和UIImageView来显示图像。 仅当您进行了某些特定的图像处理时例外。 让我们回到画廊。 可能您已经使用Simulator和最新的iPhone版本在不同的图像集上测试了该应用程序。 现在准备进行质量检查阶段。 Beta测试人员和QA工程师选择您的应用程序,然后您会看到以下看起来很奇怪的崩溃报告: 您将开始使用特定的图像集测试您的应用,然后看到以下内容: 几乎每个致力于性能最佳实践的WWDC会话都表示,iOS应用程序应使用尽可能少的内存。 内存是iOS上最受限制的资源。 系统可能要求的可用内存比其释放的速度快。 正如文档所述,此WWDC会话iOS没有传统的磁盘交换,而是使用内存压缩器技术。 普通用户的设备上有多个应用程序。 许多应用程序可能仍在后台,并继续消耗一些内存。 系统本身正在消耗的部分内存。 在这一点上,您可能认为仍然应该留有足够的内存来平稳地运行应用程序。 无论如何,iOS足够聪明,可以卸载一个或两个烦人的内存使用者。 但实际上,系统设置了内存限制,每个应用程序都可以使用该内存限制。 由于超出限制,前台应用程序中正在运行的应用程序可能会被关闭。 那么,为什么图像会导致这种后果呢? 图像渲染流程 在iOS中显示图像的最常见方法是使用UIImageView和UIImage 。 UIImage类负责管理图像数据,转换,应用适当的比例因子。 UIImageView —用于在应用程序界面中显示图像。 在WWDC上:Apple的图像和图形最佳实践工程师提供了一个非常简单直观的图表,说明了其实际工作方式。 基于此,当您使用UIImage在UIImageView绘制图像时,实际上需要执行几个步骤: 1.将压缩的图像数据加载到内存。 2.将压缩的图像数据转换为渲染系统可以理解的格式。 3.渲染解码图像。 让我们在这里停下来。 我们需要了解什么是图像,我们拥有哪种图像类型和格式以及如何存储图像。 图片类型 首先,有两种主要的图像类型:栅格(位图)和矢量。 光栅图像表示为由每个像素的编码后的单个值填充的矩形网格。 矢量图像是根据2D点定义的,由线,多边形和其他形状连接。 与栅格不同,矢量格式存储用于绘制图像的指令。 光栅图像和矢量图像各有优缺点,通常用于不同目的。 向量通常用于将要应用于物理产品,徽标,技术图纸,文本,图标等图像的图像,其中包含尖锐的几何形状。 矢量图像的主要优点是分辨率独立性。 这意味着可扩展性而又不损失清晰度和质量。 矢量图像使用从一个点到另一点的数学计算来形成线条和形状,这就是为什么它对每种分辨率和缩放都产生相同结果的原因。 […]