V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hxs
V2EX  ›  程序员

怎么实现 iOS 上怎么控制准确频率刷新

  •  
  •   hxs · 2014-03-13 19:57:36 +08:00 · 4595 次点击
    这是一个创建于 3689 天前的主题,其中的信息可能已经有所发展或是发生改变。
    因为应用需求要实现屏幕上物体按照特定的频率闪烁,频率得尽可能的准确,并且至少要达到60FPS以上。如果单纯用timer的话肯定是不准的,尤其是在帧数高上去的时候。各位大神有何建议?
    19 条回复    1970-01-01 08:00:00 +08:00
    kejinlu
        1
    kejinlu  
       2014-03-13 20:13:35 +08:00
    明显可以使用 Core Animation阿 少年
    hxs
        2
    hxs  
    OP
       2014-03-13 21:37:51 +08:00
    @kejinlu

    试过Core Animation的
    CFTimeInterval localLayerTime = [myLayer convertTime:CACurrentMediaTime() fromLayer:nil];
    用这个控制时间的话,测试还是不准啊,关键是要准
    doskoi
        3
    doskoi  
       2014-03-13 21:42:35 +08:00
    CADisplayLink
    hxs
        4
    hxs  
    OP
       2014-03-13 21:59:00 +08:00
    @doskoi
    试过这个,但是如果满负荷就是每帧都更新东西就不行了帧率一下就掉下来了
    wtl
        5
    wtl  
       2014-03-13 22:14:33 +08:00
    你需要知道当前的时间 然后根据当前时间绘制 而不是根据帧率
    hxs
        6
    hxs  
    OP
       2014-03-13 22:28:44 +08:00
    @wtl 我知道当前的时间也不能知道下一帧刷新的时候出现的时间啊,根据当前的时间怎么能判断我下一帧刷新的时候是不是应该显示东西呢?
    ETiV
        7
    ETiV  
       2014-03-13 22:34:56 +08:00 via iPhone
    刷新可以新开个线程?大循环里取时间并刷新

    绘制是另一码子事儿了……
    txx
        8
    txx  
       2014-03-13 22:38:07 +08:00
    我表示连cocos2d 都是基于 CADisplayLink 的....

    苹果官方文档如何打造准确的timer 就是用的 CADisplaylink
    hxs
        9
    hxs  
    OP
       2014-03-13 22:52:57 +08:00
    @txx 是啊CADisplayLink应该是最有可能的一个但是测了一下还是不行,有可能是因为render的东西太多了。。。。。。
    txx
        10
    txx  
       2014-03-13 23:09:42 +08:00
    @hxs 这个东西就要去优化 render了。用 instrument 来分析分析...哪里浪费的GPU太多能不能优化吧。就跟游戏引擎一样,他写的再好,你丢给他东西多了 也会掉帧的。

    应该不能比 CADisplaylink 再快了吧?或者直接上OpenGL?
    laihj
        11
    laihj  
       2014-03-13 23:37:38 +08:00
    同10楼,UI操作都是主线程的,哪果楼主render超过了FPS,用什么计时都是没有用的
    hxs
        12
    hxs  
    OP
       2014-03-14 00:14:31 +08:00
    @txx 我看了一下OpenGL的东西都是在各种变换和渲染,没找到哪个是可以准确控制时间的。如果优化render的话就是一个复杂活了。。。
    hxs
        13
    hxs  
    OP
       2014-03-14 00:16:52 +08:00
    @laihj 用OpenGL直接控制GPU呢?
    txx
        14
    txx  
       2014-03-14 00:40:54 +08:00
    @hxs 从cocos2d的实现上看...整个RunLoop 使用的是CADisplaylink 然后用CCSchedule封装。渲染是渲染在EAGLView上,也就是直接call OpenGL...

    我的意思是 如果你发现渲染效率还低的话 就直接用OpenGL ES来做。试试看?
    不过楼主你没说你到底是在渲染什么东西.....
    yishanhe
        15
    yishanhe  
       2014-03-14 05:34:58 +08:00
    我很好奇,iphone屏幕最大支持的刷新率是多少?
    hxs
        16
    hxs  
    OP
       2014-03-14 09:21:42 +08:00
    @txx 做到最简的话是一堆方块alpha值变化,每一个变化的频率不同,我尝试了一下如果方块数目超过10个左右就会开始卡了
    Mutoo
        17
    Mutoo  
       2014-03-14 10:52:26 +08:00
    要达到60fps,绘制任务要在16ms内完成,数量上去了计算量变大,肯定达不到这个帧速率。一般游戏也没可能保持60fps。不是怎么控制的问题,是没办法保证。

    60fps是一个目标,主线程会尽最大努力去接近这个目标,简单说就是,如果16ms内完成了计算,那就休息一会,等下个16ms开始,如果超过16ms了,那就没得休息继续画,这时候帧速率肯定就掉了。
    txx
        18
    txx  
       2014-03-14 11:56:30 +08:00   ❤️ 1
    @hxs 如果牺牲空间换时间呢?把不同方块的 alpha 先渲染存下来,之后直接贴图呢?
    hxs
        19
    hxs  
    OP
       2014-03-14 12:25:56 +08:00
    @txx 嗯这倒是可以,回头试试
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3828 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:17 · PVG 18:17 · LAX 03:17 · JFK 06:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.