Iphone 如何在与其他视图(如滚动拾取轮)混淆的同时继续绘制GLView

Iphone 如何在与其他视图(如滚动拾取轮)混淆的同时继续绘制GLView,iphone,interface-builder,Iphone,Interface Builder,我的应用程序有两个视图,一个保存OpenGL上下文,它不断地(通过一个NSTimer)重新绘制自己,另一个保存一个拾取轮。当我旋转方向盘时,计时器似乎停止了。有什么方法可以让picker视图手动调用draw吗?或者用什么方法让计时器持续工作 谢谢, -S您的计时器没有启动,因为它是在主线程上创建的。用户界面交互也发生在主线程上,所以当您使用选择器或其他处理触摸事件的工具时,计时器将被阻止启动 处理这个问题的一种方法是创建一个单独的线程作为计时器。您可以使用这种方法的一个例子是 - (void)o

我的应用程序有两个视图,一个保存OpenGL上下文,它不断地(通过一个NSTimer)重新绘制自己,另一个保存一个拾取轮。当我旋转方向盘时,计时器似乎停止了。有什么方法可以让picker视图手动调用draw吗?或者用什么方法让计时器持续工作

谢谢,
-S

您的计时器没有启动,因为它是在主线程上创建的。用户界面交互也发生在主线程上,所以当您使用选择器或其他处理触摸事件的工具时,计时器将被阻止启动

处理这个问题的一种方法是创建一个单独的线程作为计时器。您可以使用这种方法的一个例子是

- (void)openGLUpdateThread;
{
    while (!isOpenGLUpdateCancelled)
    {
        [self updateOpenGLView];

        // Do this at 30 FPS
        [NSThread sleepForTimeInterval:(1.0f / 30.0f)];
    }
}
然后在后台线程上使用

[NSThread detachNewThreadSelector:@selector(openGLUpdateThread) toTarget:self withObject:nil];
我相信,只要OpenGL层没有被其他线程访问,就可以在后台线程上毫无问题地更新OpenGL层的显示,但是如果遇到崩溃,可以使用

[self performSelectorOnMainThread:@selector(updateOpenGLView) withObject:nil waitUntilDone:NO];
而不是在上面的线程方法中直接调用-updatePenglView


要终止该线程,只需将isOpenGLUpdateCancelled实例变量设置为NO,然后等待它完成。当然,这里的所有方法和实例变量都只是示例,需要进行更改以满足您的应用程序。

这很有效!不过我有几个问题。。。我想使用您建议的第一种方法([NSThread detachNewThreadSelector:@selector(OpenGludateThread)toTarget:self withObject:nil];),但我的openGL调用与其余代码纠缠在一起,将它们全部分离,使它们都位于同一个线程上,这将非常烦人。第二种方法(performSelectorOnMainThread)可以工作,但是我的触摸事件失去了视图更新的优先级,因此我获得了奇怪的界面功能。我是否有办法确保触摸事件具有更高的优先级?谢谢上面调用的UpdatePenglView方法中调用的所有内容都将在同一线程上运行,除非您通过performSelectorOnMainThread或类似程序另行指定。因此,即使你有一大堆其他方法来帮助生成、操作或显示你的几何体,只要从一个方法调用它们,它们就会在同一个线程中。也就是说,如果你的OpenGL更新足够慢,以至于把它们放在主线程上会打乱你的触摸响应时间,将它们放在后台线程上可能不会在像iPhone这样的单核机器上给您带来那么多的性能提升。现在可能是时候做一些硬核工具和鲨鱼调整您的显示代码。