使用预渲染图片更快,因为iOS不用创建一张图像和绘制图形到屏幕上(图像已经处理好了)。问题是你需要全部把这些图片放进应用束里,增加它的尺寸。那就是为什么使用可调整尺寸的图片是那么好:你通过移除”浪费了的“图片空间来节约空间。你也不需要为不同的元素生成不同的图片。(例如 buttons)
尽管如此,用图片你会失去代码调整你图片的能力,需要一次又一次的生成它们然后把它们加入到应用中。这是个缓慢的过程。另外一点如果你有动画或者很多张稍微变化的图片(例如 颜色叠加),你需要加很多的图片增加了应用束的大小。
总结一下,你需要想对你来说最重要的是什么:绘图性能还是app的大笑.通常两个都很重要,所以你会在一个工程里使用这两种方法。
12)处理内存警告
当系统内存低的时候iOS会通知所有的正在运行的app,关于低内存警告的处理苹果官方文档 描述:
如果你的应用收到这个警告,它必须尽可能多的释放内存。最好的方法是移除对缓存,图像对象,和其他稍后要创建的对象的强引用。
幸运的是,UIKit提供了一些方法去接收低内存警告:
实现App代理中的applicationDidReceiveMemoryWarning:方法。
重载你自定义UIViewController子类中的didReceiveMemoryWarning方法。
注册接收UIApplicationDidReceiveMemoryWarningNotification的通知
一旦收到这些警告,你的处理方法必须立刻响应并释放不必要的内存。
举例,如果视图当前不可见,UIViewController的默认行为是清除这些视图;子类可以通过清除额外的数据结构来补充父类的默认行为。一个应用程序维护一个图片的缓存,没有在屏幕上的图片都会被释放。
一旦收到内存警告,释放可能的全部内存是很重要的,否则你就有让你的app被系统杀死的的风险。
尽管如此,开始扑杀对象释放内存的时候要小心,因为你需要保证它们会在之后重新创建。当你开发app的时候,用你的模拟器上的模拟内存警告功能测试这种情况。
13)重用大开销对象
有的对象的初始化非常慢–NSDateFormatter 和 NSCalendar是两个例子,但是你不能避免使用它们,当你从 JSON/XML响应中解析日期时。
避免使用这些对象时的性能瓶颈,试着尽可能的重用这些对象。你可以加入你的类中成为一个属性,也可以创建为静态变量。
注意如果你选择了第二种方式,这个对象在app运行的时候会一直保持在内存里,像单例一样。
下面这段代码演示了NSDateFomatter作为一个属性的lazy加载,第一次被调用然后创建它,之后就使用已创建在的实例
// in your .h or inside a class extension@property (nonatomic, strong) NSDateFormatter *formatter; // inside the implementation (.m)// When you need, just use self.formatter- (NSDateFormatter *)formatter { if (! _formatter) { _formatter = [[NSDateFormatter alloc] init]; _formatter.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy"; // twitter date format } return _formatter;}同样要记住设置一个NSDateFormatter的日期格式几乎跟创建一个新的一样慢。因此,如果在你的应用中你频繁需要处理多个日期格式,你的代码应该获利于初始化创建,重用,多个NSDateFormatter对象。
14) 使用精灵表
你是一个游戏开发者吗?精灵表是你的好朋友之一.精灵表让绘制比标准屏幕绘制方法更快速,消耗更少的内存。
这里有两个很棒的精灵表使用的教程
How To Use Animations and Sprite Sheets in Cocos2D
How to Create and Optimize Sprite Sheets in Cocos2D with Texture Packer and Pixel Formats
第二个教程详细覆盖了像素格式,它可以对游戏性能有一个可衡量的影响。
如果对精灵表还不是很熟悉,一个很好的介绍 SpriteSheets – The Movie, Part 1and Part 2. 这些视频的作者是Andreas Lw,一个最流行的创建精灵表的工具Texture Packer的创建者。
除了使用精灵表之外,之前已经说到的内容也可以用在游戏上.举个例子,如果你的游戏有很多精灵,比如在标准的敌人或炮弹射击游戏,你可以重用精灵表额如是每次重新创建它们。
15)避免重复处理数据
很多app调用函数获取远程服务器上的数据.这些数据通常是通过JSON 或者 XML格式来传输。非常重要的是在请求和接收数据的时候努力在两端使用相同的数据结构。
理由?在内存中操纵数据以合适你的数据结构是非常昂贵的。
比如,如果你需要在表格视图中显示数据,最好请求和接收数据是数组的格式,以避免任何中间操纵数据,使其适合你在app中使用的数据结构
相似的,如果你的应用程序依赖于访问特定值的键,那么你可能会想要请求和接收一个键/值对的字典
通过第一次就获取正确格式的数据,在自己的应用程序中你就会避免很多的重复处理工作,使数据符合你的选择的结构。
16)选择正确的数据格式
你可以有很多方法从web 服务中传递数据到你的app中
JSON 是一种通常比XML小且解析更快的格式,它的传输的内容也比较小。自iOS5起,内置的JSON解析很好用 built-in JSON deserialization
尽管如此,XML的一个优势当你使用SAXparsing方法时,你可以传输过程中读取它,在面的非常大的数据时,你不必像JSON一样在数据下载完之后才开始读取。
17)适当的设置背景图片
像iOS编码的其他工作一样,至少有两种不同方式去替换你视图的背景图片。
你可以设置你的视图的背景颜色为UIColor的colorWithPatternImage创建的颜色。
你可以添加一个UIImageView子试图给View
如果你有全尺寸的背景图片,你绝对要用UIImageView,因为UIColor的colorWithPatternImage是重复的创建小的模式图片,在这种情况下用UIImageView方式会节约很多内存。
// You could also achieve the same result in Interface Builder UIImageView *backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background"]];[self.view addSubview:backgroundView];尽管如此,如果你计划用模式图片背景,你应该是用UIColor的colorWithPatternImage。它更快一些,而且这种情况不会使用很多内存。
self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background"]];18)减少你的网络占用
UIWebView 是非常游泳的.它非常容易用来显示web内容,甚至创建你app的视窗。这些都是标准UIKit 空间很难做到的。
尽管如此,你可能注意你可以用在你的app中的UIWebView组件并没有Apple的Safari app快。这是Webkit’s的Nitro引擎的限制使用。JIT compilation.
所以为了获得最佳的性能,你需要调整你的HTML。第一件事是尽可能多的避免取代依赖的框架会快很多。
随时随地遵循异步加载Java文件的实践。特别当它们不直接影响到页面表现的时候,比如分析脚本。
最后,总是要意识到你在用的图片,保持图片的正确尺寸。正如这个教程前面所提到的,利用精灵表的优势来节约内存和提高速度。
想要获取更多的信息,看看WWDC 2012 session #601 – Optimizing Web Content in UIWebViews and Websites on iOS.
19) 设置阴影路径
你需要给视图或者layer添加一个阴影,你应该怎么做?