我在带有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];
}
答案 0 :(得分:2)
这是Apple的文档中关于CADisplayLink
属性frameInterval
:
默认值为1,这会导致应用程序以显示器的刷新率通知。如果该值设置为大于1的值,则显示链接会以原始刷新率的一小部分通知您的应用程序。例如,将间隔设置为2会导致显示链接每隔一帧触发一次,从而提供帧速率的一半。
将此值设置为小于1会导致未定义的行为,并且是程序员错误。
在您的示例中,您最有可能将帧间隔设置为非常小的数字,很容易小于1.如果要在每次刷新时更新,请将其设置为1
。屏幕。否则你应该将它设置为2
以获得一半。
但请注意,它没有具体提及帧速率是什么。据我所知,所有现有和现有的iOS设备都有60 Hz的屏幕刷新率,但没有什么可说的,苹果有一天不会发布刷新率为120 Hz的设备。所以现在,将frameInterval
设置为2将产生30 fps的帧速率,但在未来的某些设备上,它可以提供60 fps的帧速率。有可能设备足够快,无论如何都能以帧速率处理您的绘图代码,但这仅仅是一个FYI。此外,似乎没有任何方式可以只检索帧速率值,但您总是可以测量绘制帧之间的时间,以查看帧之间的时间间隔,并进行一些数学运算以获得帧速率。