绘制性能

绘制性能

当你不使用命令行工具的时候,你的相关绘制代码是性能考虑的主要一块。为了频繁的更新主界面,需要大量的绘制工作,同时你也必须消耗更多的时间。

绘制要点

下面主要介绍如何提高程序的绘制效率。

减少绘制的次数

绘制没必要的内容可能导致绘制的效率很低。当你的应用程序程序收到重新绘制的事件的时候,你应该专注你的绘制区域,将绘制限制在该区域内。

优化你的调整大小相关代码

活动窗口大小的改变将会对绘制性能影响大于其他更新操作,在几秒钟内,你的绘制代码将会收到大量的绘制你窗口内容区域的时间通知。如果你的绘制代码不能及时响应这些事件,你的程序会看起来很卡顿!所以你最好简化你重绘代码部分,尽可能对数据进行缓存或者设置你绘制代码合适的速度和准确度!用户对活动窗口的改变大小一直很在意,往往表现很低级!如果这块做好了,用户会觉得很流畅或者不会在意!
优化活动窗口改变大小的代码关键在于减少绘制的行为同时能维持良好的视觉感。一般的办法是只绘制暴露的区域!但是有时候需要绘制更多内容,比如能够自动滚动的窗口。

删除没必要的绘制代码

为了确保你的界面流畅,你必须频繁去调用你的绘制代码。在活动窗口改变大小期间,

集中更新

如果我们使用几个代码片段去更新一大片区域,你可能会提前通知窗口服务区,提前移除无效区域和计算更新区域。
使用 setNeedsDisplay:或者 setNeedsDisplayInRect:方法去计算合适的区域。记住如果你绘制的区域包括一些不需要改变的内容,这时你不能合并代码去更新。如果你想使用Quartz Debug去更新没必要区域,你可以参考 Measuring Drawing Performance

设置子视图不透明

如果你是在子视图上做绘制,你可以设置你的视图为不透明来加速绘制效率,不透明的视图他能填充整个边框区域。绘制系统不会给被子视图遮挡的父视图区域发送更新消息。

隐藏视图

关闭默认裁剪行为

刷新视图缓存区

如果你在显示动画,或者一个游戏或者一个多媒体应用,你应该避免频繁的刷新窗口内容,导致频率超过屏幕刷新频率!只要超过每秒30帧,都是在浪费CPU的时间,很多开发者都没意识到这个问题,所以避免没必要的刷新。
刷新请求不应该立即发个屏幕,你可以延迟刷新,在必要的时候去刷新!在这段时间内,窗口服务会合并所以更新请求,交给显卡去处理。这个合并更新频率超过屏幕的更新频率的时候也会导致性能问题。绘制行为也会阻塞当前线程,直到窗口缓存被更新完成为止。合并更新。这种方法意味着你的代码被限制在每秒1/60th.
为了解决性能问题,刷新频率你最好不要超过屏幕的。如果你一定要及时绘制你的内容,你可以使用计时器去通知,在需要的时候绘制。使用计时器能达到你频繁刷新窗口内容的目的。

避免直接对缓存区进行刷新

如果你使用Quartz框架去绘制,你应该避免使用CGContextFlush去自动更新,而是调用CGContextSynchronize让Quartz去决定合适的时间去更新。
如果你使用Cocoa框架,你应该避免使用display和它相似的方法去强制更新,而是使用setNeedsDisplay:和setNeedsDisplayInRect:方法,让run loop在循环里面自己去处理这些更新事件。
如果你一定要刷新你的缓存,你可以使用计时器按照屏幕要求的频率去同步你的绘制队列。在你需要第一次显示一些内容的时候,刷新也是一个有效的方法,不用等待事件轮训,比如显示一个闪屏!

避免频繁的刷新

应用程序绘制或者刷新的频率不能超过我们所接受的。对大部分绘制来说每秒30帧是最合适的,不能超过这个频率,获取频率请看下文。

获取刷新频率

你能从Guartz框架中获取屏幕的刷新频率,这个CGDisplayCurrentMode函数能返回一个字段,里面包含显示的一些属性。指定屏幕的刷新率在关键字kCGDisplayRefreshRate中,如果键值为0,这个屏幕是LCD,你应该设置这个频率为60HZ

~~~
int GetMainScreenRefreshRate(){
CFDictionaryRef modeInfo;
int refreshRate = 60;//Assume LCD screen

modeInfo = CGDisplayCurrentMode(CGMainDisplayID());
if (modeInfo){

     CFNumberRef value = (CFNumberRef) CFDictionaryGetValue(modeInfo, kCGDisplayRefreshRate);
     if (value){

        CFNumberGetValue(value, kCFNumberIntType, &refreshRate);

        if (refreshRate == 0)
            refreshRate = 60;
    }
}
return refreshRate;

}
~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值