我作为测试,在单独的NSThread上的while循环中设置我的opengl游戏的update()和render()函数。它的运行速度恰好为60FPS。这怎么可能?它实际上是我想要的,但它为什么这样做呢?我以为NSThread会尽可能快地运行......?似乎V-synced。
func setupGL(){
glThread = NSThread(target: self, selector: "glRun", object: nil);
glThread.start();
}
func glRun(){
//Start and run Opengl on a separate Thread
setupLayer();
setupContext();
setupRenderBuffer();
//setupDepthBuffer();
setupFrameBuffer();
engine.setupEngine(GLfloat(self.frame.size.width) * GLfloat(scale), screenHeight: GLfloat(self.frame.size.height) * GLfloat(scale));
//setupDisplayLink();
print("THREAD STARTED!");
while(true){
update()
render();
logger.logFrame();
}
}
答案 0 :(得分:1)
这是因为iOS将硬件使用量降低到合理水平。事实是你不需要超过60fps,因为屏幕不会刷新得更快,因此帧速率是有限的。通过这种方式,电池寿命显着延长。
在这种情况下,使用NSThread
并不重要,因为限制在OpenGL层中。
您可以通过设置CADisplayLink
及其frameInterval
值来控制帧速率。
答案 1 :(得分:1)
是的,iOS上有一个帧速率限制。所有iOS设备(截至撰写本文时)每秒最多刷新屏幕60次。例如,请参阅WWDC 2015 Session 233: Advanced Touch Input on iOS,在4分20秒:
我们的产品以60赫兹或每秒60次的速度刷新屏幕。
iOS OpenGL ES实现知道这一点,并与窗口服务器的屏幕刷新同步。