如何在iOS应用程序中设置所需的渲染频率(FPS)?

时间:2014-01-22 17:27:25

标签: ios objective-c cadisplaylink

我在带有CADisplayLink方法/处理程序的iOS应用上使用renderOneFrame。我的理解是每次屏幕刷新都会触发,即60Hz。

然而,我的应用程序正在努力以60FPS运行并且需要添加更多功能,我担心在旧硬件上这是不可行的。我不是让它以不同的速度运行,而是以30FPS渲染并给自己更多的喘息空间。

有没有办法轻松实现这一目标?

这似乎是它的核心,但我是一个移植到iOS的C ++编码器,所以它有点令人困惑(我从我发现的样本中复制了它):

- (void)go {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    mLastFrameTime = 1;
    mStartTime = 0;

    try {
        app = new MyApp()
    } catch( Ogre::Exception& e ) {
        std::cerr << "An exception has occurred: " <<
        e.getFullDescription().c_str() << std::endl;
    }

    mDate = [[NSDate alloc] init];
    mLastFrameTime = -[mDate timeIntervalSinceNow];

    mDisplayLink = [NSClassFromString(@"CADisplayLink") displayLinkWithTarget:self selector:@selector(renderOneFrame:)];
    [mDisplayLink setFrameInterval:mLastFrameTime];
    [mDisplayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

    [pool release];
}

1 个答案:

答案 0 :(得分:2)

这是Apple的文档中关于CADisplayLink属性frameInterval

的说明
  

默认值为1,这会导致应用程序以显示器的刷新率通知。如果该值设置为大于1的值,则显示链接会以原始刷新率的一小部分通知您的应用程序。例如,将间隔设置为2会导致显示链接每隔一帧触发一次,从而提供帧速率的一半。

     

将此值设置为小于1会导致未定义的行为,并且是程序员错误。

在您的示例中,您最有可能将帧间隔设置为非常小的数字,很容易小于1.如果要在每次刷新时更新,请将其设置为1。屏幕。否则你应该将它设置为2以获得一半。

但请注意,它没有具体提及帧速率是什么。据我所知,所有现有和现有的iOS设备都有60 Hz的屏幕刷新率,但没有什么可说的,苹果有一天不会发布刷新率为120 Hz的设备。所以现在,将frameInterval设置为2将产生30 fps的帧速率,但在未来的某些设备上,它可以提供60 fps的帧速率。有可能设备足够快,无论如何都能以帧速率处理您的绘图代码,但这仅仅是一个FYI。此外,似乎没有任何方式可以只检索帧速率值,但您总是可以测量绘制帧之间的时间,以查看帧之间的时间间隔,并进行一些数学运算以获得帧速率。