CADisplayLink 及定时器的使用

第一种:
用CADisplayLink可以实现不停重绘。

例子:

CADisplayLink* gameTimer;

gameTimer = [CADisplayLink displayLinkWithTarget:self

selector:@selector(updateDisplay:)];

[gameTimer addToRunLoop:[NSRunLoop currentRunLoop]

forMode:NSDefaultRunLoopMode];


第二种:
int CCApplication::run()
{
    if (applicationDidFinishLaunching())
    {
        [[CCDirectorCaller sharedDirectorCaller] startMainLoop];//主循环开始
    }
    return 0;
}

继续跟进startMainLoop函数

-(void) startMainLoop
{
        // CCDirector::setAnimationInterval() is called, we should invalidate it first
        [displayLink invalidate];
        displayLink = nil;
        // displayLink是CADisplayLink对象,target是自己,回调是coCaller
        displayLink = [NSClassFromString(@"CADisplayLink") displayLinkWithTarget:self selector:@selector(doCaller:)];//看这个doCaller回调
        [displayLink setFrameInterval: self.interval];//设置帧率
        [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];//添加到循环并启动
}

看doCaller回调,

void CCDisplayLinkDirector::mainLoop(void)
{
    if (m_bPurgeDirecotorInNextLoop)
    {
        m_bPurgeDirecotorInNextLoop = false;
        purgeDirector();
    }
    else if (! m_bInvalid)
     {
         drawScene();// draw the scene

         // release the objects
         CCPoolManager::sharedPoolManager()->pop();
     }
}

好,一个循环完了。最后看到CCPoolManager::sharedPoolManager()->pop();就是用来释放对象的。

第三种:

IOS--NSTimer和CADisplayLink的用法

NSTimer初始化器接受调用方法逻辑之间的间隔作为它的其中一个参数,预设一秒执行30次。CADisplayLink默认每秒运行60次,通过它的frameInterval属性改变每秒运行帧数,如设置为2,意味CADisplayLink每隔一帧运行一次,有效的逻辑每秒运行30次。

此外,NSTimer接受另一个参数是否重复,而把CADisplayLink设置为重复(默认重复?)直到它失效。

还有一个区别在于,NSTimer一旦初始化它就开始运行,而CADisplayLink需要将显示链接添加到一个运行循环中,即用于处理系统事件的一个Cocoa Touch结构。

NSTimer 我们通常会用在背景计算,更新一些数值资料,而如果牵涉到画面的更新,动画过程的演变,我们通常会用CADisplayLink。

但是要使用CADisplayLink,需要加入QuartzCore.framework及#import <QuartzCore/CADisplayLink.h>

NSTimer

@interface ViewController : UIViewController

{

NSTimer *theTimer; //声明

}

//使用

float theInterval = 1.0 / 30.0f;  //每秒调用30次

theTimer = [NSTimer scheduledTimerWithTimeInterval:theInterval target:self selector:@selector(MyTask) userInfo:nil repeats:YES];

//停用

[theTimer invalidate];

theTimer = nil;

CADisplayLink,需要加入QuartzCore.framework及#import <QuartzCore/CADisplayLink.h>

/*CADisplayLink 默认每秒运行60次,将它的frameInterval属性设置为2,意味CADisplayLink每隔一帧运行一次,有效的使游戏逻辑每秒运行30次*/

if(theTimer == nil)

{

theTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(MyTask)];

theTimer.frameInterval = 2;

[theTimer addToRunLoop: [NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

}

//停用

[theTimer invalidate];

theTimer = nil;

时间: 2024-10-10 12:40:53

CADisplayLink 及定时器的使用的相关文章

关情纸尾-----Quartz2D定时器CADisplayLink下雪效果

定时器CADisplayLink下雪效果 1.定时器雪花整体思路: 先在控制器View面绘制一个雪花. 在View加载完毕后,添加一个定时器. 在定时器方法当中调用得绘方法. 在绘图方法当不段的去修改雪花的Y值. 当雪花的Y值超过屏幕的高度时,让雪花的Y值重新设为0.从最顶部开始. 2.添加定时器实现方案 第一种采用NSTime 第二种采用CADisplayLink 最终采用CADisplayLink方案. 2.1为什么采用CADisplayLink方案不用NSTime? 首先要了解setNee

07-定时器之雪花

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: pointer; position: absolute

swift版QQ音乐播放器(二)

一 完善部分的QQ音乐效果图 二 需要完善点 1 歌曲的切换和暂停播放 2 歌曲当前播放时间和歌曲总时间的更新 3 进度条的处理 4 歌手头像处理 5 头像动画效果 6 歌词的进度显示 8 完善细节 三 添加歌曲展示页面中的动画效果 1 代码书写位置 : 由于展示歌词的控制器的UITableViewController,那么我们可以使用代理方法.当用户拖动tableView的时候,会调用一个方法,在该方法中实现动画效果 2 思路 : 通过拿到第一个cell和最后一个cell来计算中间cell的索

iOS开发练习之UIPickerView实现歌词翻滚效果

麻雀虽小,五脏俱全.在平时的项目中,任何一个模块或者功能里其实都隐藏着许多我们平时注意不到的知识点,其实很多东西大家每天都在用,但很多时候都是知其然,而不知其所以然.时间久了,也就懒得去想到底是什么原因了,怎么实现的之类.回想自己的学习路程,也基本都这样混过来,实在愧对光阴,近日抽空,查看过往笔记,顺手写了个小代码练习,感觉温故知新.现分享代码,以供新手入门参考,尤其其中错误的部分也很有广泛性.同时也欢迎各路成精的老鸟们喷吐,能够指正,这样也促进我再进步一点. ViewController.m文

tableView使用定时器CADisplaylink改变imageView的transform的bug

在UITableViewCell的imageView中,设置定时器CADisplayLink调用CGAffineTransformRotate改变transform时, 点击UItableViewCell时,会导致图标变形,代码如下: @property(nonatomic,strong)CADisplayLink *link; -(CADisplayLink *)link { if (_link == nil) { //使用transform的方式旋转,每隔1/60秒移动一次,会改变image

CADisplayLink定时器

1 CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(XXXXXXXX)]; 2 //此定时器每秒更新60次,设置此属性后,每秒更新60/frameInterval 3 link.frameInterval = 2; 4 //添加定时器 5 [link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes

iOS 中三种定时器的用法NSTimer、CADisplayLink、GCD

一.NSTimer 1. 创建方法 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats:NO]; TimerInterval : 执行之前等待的时间.比如设置成1.0,就代表1秒后执行方法 target : 需要执行方法的对象. selector : 需要执行的方法 repeats : 是否需要循环 2.

iOS CADisplayLink 定时器的使用

CADisplayLink 是一个能让我们以和屏幕刷新频率相同的频率将内容刻画到屏幕上的定时器,在应用中创建一个新的CADisplayLink对象,把他添加到一个runloop中,并且给他提供一个target和selector在屏幕刷新时调用 一旦displayLink以特定的模式注册到runloop中之后,每当屏幕需要刷新的时候,runloop就会调用CADisplayLink绑定的target上的selector,这是target可以读到CADisplayLink每次调用的时间戳,用来准备下

Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用

OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLink : NSObject { @private void *_impl; //指针 } + (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel;//唯一一个初始化方法 - (void)addToRunLoop:(NS