FPSDisplay: NSObject + (instancetype)shareFPSDisplay; @end #import "FPSDisplay.h" #define SCREEN_HEIGHT [UIScreen...mainScreen].bounds.size.height #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width @interface...displayLinkWithTarget:self selector:@selector(tick:)]; [self.link addToRunLoop:[NSRunLoop mainRunLoop...self.lastTime = link.timestamp; return; } self.count += 1; //记录tick在1秒内执行的次数...NSTimeInterval delta = link.timestamp - self.lastTime; //计算本次刷新和上次更新FPS的时间间隔 //大于等于1秒时
CADisplayLink 是一个用于显示的定时器, 它可以让用户程序的显示与屏幕的硬件刷新保持同步,iOS系统中正常的屏幕刷新率为60Hz(60次每秒)。...CADisplayLink可以以屏幕刷新的频率调用指定selector,也就是说每次屏幕刷新的时候就调用selector,那么只要在selector方法里面统计每秒这个方法执行的次数,通过次数/时间就可以得出当前屏幕的刷新率了...CADisplayLink 简介:https://www.jianshu.com/p/434ec6911148 初始化CADisplayLink,监测FPS值的代码如下: _displayLink...= [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkTick:)]; [_displayLink...= nil) { self.FPSBlock(fps); } //1秒之后,初始化时间和次数,重新开始监测 _beginTime = link.timestamp;
OpenGLES(三)- GLKit: 多边形纹理、旋转 本文中会省略关于GLKit最基本的API的注释,如果需要详细注释可以看另一篇OpenGLES(二)- 纹理贴图 展示效果 ?...上下文创建 不同于上文中的GLKView的创建方式。使用这种initWithFrame方式可以不用依赖GLKViewController。...setCurrentContext:content]; //GLKView创建 glkView = [[GLKView alloc] initWithFrame:CGRectMake(0, 100, UIScreen.mainScreen.bounds.size.width..., UIScreen.mainScreen.bounds.size.height) context:content]; //必须注册代理 glkView.delegate = self;...CADisplayLink创建 disLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(update)]; [disLink
前言 相对于Android来说 iOS定时任务用起来还是比较好用的 具体来说有三种 GCD方式 NSTimer CADisplayLink 一般都用前两种 做视图绘制 动画 视频等才用第三种 使用方式...) [timer invalidate]; CADisplayLink 创建方式 self.displayLink = [CADisplayLink displayLinkWithTarget:self...需要注意的是,该属性在target的selector被首次调用以后才会被赋值。selector的调用间隔时间计算方式是:调用间隔时间 = duration × frameInterval。...当把CADisplayLink对象add到runloop中后,selector就能被周期性调用,类似于重复的NSTimer被启动了; 执行invalidate操作时,CADisplayLink对象就会从...runloop中移除,selector调用也随即停止,类似于NSTimer的invalidate方法。
重点是这里有一个初学者经常会犯的错误, 同学们在绘制曲线的时候经常会以layer在父图层中的相对位置去绘制曲线,这是错的!!! 应该以layer自身的坐标系划线。...CGFloat end; @property (nonatomic, strong) CAShapeLayer *mylayer; @property (nonatomic, strong) CADisplayLink...displayLinkWithTarget:self selector:@selector(changeEnd)]; [self.displayLink addToRunLoop:[NSRunLoop...count; @interface ViewController () @property (nonatomic, strong) CADisplayLink *displayLink; @property...displayLinkWithTarget:self selector:@selector(action)]; [self.displayLink addToRunLoop:[NSRunLoop
iOS中的CADisplayLink定时器 说到定时器,在iOS中最常用的为NSTimer类,其实CADisplayLink类在某些场景下使用,要比NSTimer类更加适合。...首先CADisplayLink也是一种定时器,并且其和屏幕的刷新率始终保持一致(很多时候会使用CADisplayLink来检测屏幕的帧率)。...由于CADisplayLink的这种特性,使用它来实现流畅的动画效果非常合适。 ...CADisplayLink类非常简单,解析如下: //创建CADisplayLink对象 /* 需要注意 定时器对象创建后 并不会马上执行 需要添加到runloop中 */ + (CADisplayLink...*)displayLinkWithTarget:(id)target selector:(SEL)sel; //将当前定时器对象加入一个RunLoop中 - (void)addToRunLoop:(NSRunLoop
CALayer有一个属性叫做mask。 这个属性本身就是个CALayer类型,有和其他图层一样的绘制和布局属性。...ViewController () @property (nonatomic, strong) CAShapeLayer *circle; @property (nonatomic, strong) CADisplayLink...super viewDidLoad]; //创建一个CAShape CALayer *bgLayer = [CALayer layer]; //设置大小颜色和位置...bgLayer.mask = circle; [self.view.layer addSublayer:bgLayer]; //添加计时器 self.link = [CADisplayLink...displayLinkWithTarget:self selector:@selector(action)]; [self.link addToRunLoop:[NSRunLoop currentRunLoop
Default和Tracking 的Mode中 (app启动后系统默认将Default和Tracking声明为common属性了)(之前RunLoop的文章有介绍) 3. 8种初始化方法: 8种初始化方法...(因为不管self对Timer有木有强引用,Timer都不会被释放,因为RunLoop的关系) 6....初始化: @property (nonatomic, strong) CADisplayLink *link; self.link = [CADisplayLink displayLinkWithTarget...iOS现存的设备是60HZ,即60次每秒,可以通过[UIScreen mainScreen].maximumFramesPerSecond获得 所以这里selector被调用的频率是:FPS/s,(...(RunLoop、Thread、Leaks) CADisplayLink官方文档 CADisplayLink CADisplayLink的使用(一) CADisplayLink学习笔记
说到定时器, 我们使用最多的就是NSTimer 和 GCD 了, 还有另外一个高级的定时器 CADisplayLink; 一....30次 屏幕刷新时调用:CADisplayLink是一个能让我们以和屏幕刷新率同步的频率将特定的内容画到屏幕上的定时器类。...CADisplayLink以特定模式注册到runloop后,每当屏幕显示内容刷新结束的时候,runloop就会向CADisplayLink指定的target发送一次指定的selector消息, CADisplayLink...+ (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel 参数: target: 调用者 sel: 执行的方法...示例: - (void) displayLink { CADisplayLink *display = [CADisplayLink displayLinkWithTarget:
定时器大家最熟悉的可能就是 NSTime了吧,那 CADisplayLink 和 NStime 又有什么区别呢?带着这些疑问往下看。 ...CADisplayLink 是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器。...我们在应用中创建一个新的 CADisplayLink 对象,把它添加到一个runloop中,并给它提供一个 target 和 selector,它在屏幕刷新的时候调用, 一但 CADisplayLink... 以特定的模式注册到runloop之后,每当屏幕需要刷新的时候,runloop就会调用CADisplayLink绑定的target上的selector,这时target可以读到 CADisplayLink...*displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(test:)]; // 将创建的displaylink
: NSObject { @private void *_impl; //指针 } + (CADisplayLink *)displayLinkWithTarget:(id)target selector...是指两次selector触发之间间隔几次屏幕刷新,默认值为1,也就是说屏幕每刷新一次,执行一次selector,这个也可以间接用来控制动画速度 从头文件来看CADisplayLink的使用还是挺简单的,...displayLinkWithTarget:self selector:@selector(logCount...selector事件如果大于其触发间隔就会造成掉帧现象。 CADisplayLink不能被继承。...@end NSTimer的内容相对多一些但也更加灵活, 有一个地方需要注意的是timer开头的实例化方法需要手动添加到RunLoop, Schedule开头的会由系统帮你添加到RunLoop fireDate
这个图钉的位置就是锚点,就是我们在代码中设置的(0.5,1). 3. 创建CADisplayLink 我们一开始想到的办法就是用定时器,每一秒钟刷新一次秒针。但是使用了定时器之后,有一个问题。...发现秒针比电脑上的稍微慢一点。是因为刷新频率和电脑不一样。 解决方法就是使用CADisplayLink来刷新时钟。...// 创建CADisplayLink CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector...:NSDefaultRunLoopMode]; 3.1 CADisplayLink和NSTimer的区别 NSTimer占用系统资源较多 NSTimer使用完后,一定要销毁,把它设置成nil。...核心动画的时候,最好使用CADisplayLink 3.2 获取时间及时区 在clockRunning这个方法中,我们要设置时区,获取日历、当前时间。 在和时间打交道的时候,请千万别忘记了时区。
一个闭合的圆弧(白色部分) 看起来不是简单的位移动画了, 我们用UIBezierPath加CADisplayLink一帧一帧来画试试看 灰色的背景, 这个比较简单, 我们直接创建一个UIView子类,..., 一样用UIBezierPath, 先设置圆心 画一个圆弧然后闭合路径, _count是设置的一个变量, 有Controller中的计时器控制以达到动画的效果 //先画内圆 //设置线条...M_PI / 300 * _count clockwise:YES]; //线路闭合 [path closePath]; [path fill]; 要注意调整外圆和内闭合弧的线宽...ViewController () @property (nonatomic, strong) MyView *myView; @property (nonatomic, strong) CADisplayLink...displayLinkWithTarget:self selector:@selector(countOn)]; _displayLink.paused = YES; [_displayLink
一、UI更新原理和卡顿原因 在 VSync 信号到来后,系统图形服务会通过 CADisplayLink 等机制通知 App,App 主线程开始在 CPU 中计算显示内容,比如视图的创建、布局计算、图片解码...所以,卡顿造成的原因分为CPU卡顿和GPU卡顿,CPU卡顿可以用CADisplayLink来检测,UI更新卡顿可以用Runloop的mode来检测 监测卡顿:开一个子线程,利用displaylink或者...四、DisplayLink检测卡顿 一但 CADisplayLink 以特定的模式注册到runloop之后,每当屏幕需要刷新的时候,runloop就会调用CADisplayLink绑定的target...上的selector,这时target可以读到 CADisplayLink 的每次调用的时间戳,用来准备下一帧显示需要的数据。..._displayLink) { _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateTime
CADisplayLink 老司机带你走进Core Animation 之几种动画的简单应用 老司机带你走进Core Animation 之CAShapeLayer和CATextLayer 老司机带你走进...模式初始化一个实例 self.timerInC = [CADisplayLink displayLinkWithTarget:self selector:@selector(changeImg...+(CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel; 通过这个方法,可以以target/selector模式生成一个绑定了触发事件的实例...好吧,CADisplayLink就这四个方法。以及四个属性: timestamp,获取上一次selector被执行的时间戳。...最后一个init开头的实例方法就是给timer添加了一个定时启动,这里就不赘述了。 NSTimer还有两个实例方法,fire和invalid。分别是立即执行事件和销毁timer。
所以,RunLoop 实际上就是一个对象,这个对象管理了其需要处理的事件和消息,并提供了一个入口函数来执行上面 Event Loop 的逻辑。...,其包含一个时间长度和一个回调(函数指针)。...RunLoop为了节省资源,并不会在非常准确的时间点回调这个Timer。Timer 有个属性叫做 Tolerance (宽容度),标示了当时间点到后,容许有多少最大误差。...selector : 需要执行的方法 repeats : 是否需要循环 结束方法 [timer invalidate]; CADisplayLink 简单地说,CADisplayLink就是一个定时器...preferredFramesPerSecond: 使用方法: 创建方法 CADisplayLink *timer = [CADisplayLink displayLinkWithTarget:self
寅时室内地图.gif 讲一下写这篇文章的原因:安卓是由于有系统的api,在滑动手势结束后调用系统自有api,传入手势结束时的速度(x方向和y方向)就能由系统自己做完往后的操作。...所以,在我做出这个效果之后,我得将它分享出来,给有需要的人提供思路,也希望能相互讨论,接受到更好的办法做出更好的效果。...一、第一种是在手势结束后通过UIView的动画来改蓝色图片的center,因为系统UIView的动画有快进慢出UIViewAnimationOptionCurveEaseOut这种效果可选。...displayLinkWithTarget:self selector:@selector(updateView)]; [dis addToRunLoop:[NSRunLoop currentRunLoop...要是有帮到大家是我的荣幸,另外夏天热,可以帮我买块西瓜去去暑 %>_<%。
--圆角的弧度--> <!...="0dp" android:top="0dp"/> c.使用 android:background="@drawable/shape_test" 2.selector...> selector xmlns:android="http://schemas.android.com/apk/res/android"> selector> b.使用 android:background="@drawable.../btn_selector_test"
内存泄漏原因 谈论 NSTimer & CADisplayLink 内存泄漏,要理解 NSTimer & CADisplayLink 的基础概念,下面通过一个倒计时的实现的 demo 进入正题。...当然我们不建议在 MainQueue 中做,因为在编程时尽量的把一些和主线程关联不太大的操作放到子线程中去做。...CADisplayLink 来实现定时器功能,CADisplayLink 可以添加到 RunLoop 中,每当屏幕需要刷新的时候,runloop 就会调用 CADisplayLink 绑定的 target...上的 selector,这时 target 可以读到 CADisplayLink 的每次调用的时间戳,用来准备下一帧显示需要的数据。...displayLinkWithTarget:self selector:@selector(countDown)]; [self.link addToRunLoop:[NSRunLoop
所以如果需要定时器在 UIScrollView 拖动时也不影响的话,有两种解决方法 timer分别添加到 UITrackingRunLoopMode 和 NSDefaultRunLoopMode中 [[...对象是一个和屏幕刷新率同步的定时器对象。...每当屏幕显示内容刷新结束的时候,runloop就会向CADisplayLink指定的target发送一次指定的selector消息, CADisplayLink类对应的 selector 就会被调用一次...displayLinkWithTarget:self selector:@selector(handleDisplayLink:)]; // 每隔1帧调用一次 self.displayLink.frameInterval...##GCD定时器 **GCD定时器**和NSTimer是不一样的,NSTimer受RunLoop影响,但是GCD的定时器不受影响,因为通过源码可知RunLoop也是基于GCD的实现的,所以GCD定时器有非常高的精度