Mar*_*ark 28 iphone optimization opengl-es runloop ios
首先,我的问题是:你如何管理你的iOS Run-Loop?
接下来我的理由是:我一直在研究各种原型(v.早期开发),并发现了许多令人困惑的问题.
那么有没有人围绕这些问题找到了灵丹妙药?有没有人在这个平台上有一个杀手运行循环架构?目前看起来我必须选择较少的邪恶.
对于我自己的iOS项目,我使用经典方法(创建一个窗口.nib,创建一个继承的类EAGLView,添加EAGLView到视图控制器中的视图,该视图控制器放在它自己的.nib中).
在工作中,我采用了一种略微不同的方法,灵感来自SDL,您可以在我们的开源库APRIL中进行检查.APRIL的主要目标是支持尽可能多的平台,同时保持简单性(仅限窗口和输入管理)并明确许可问题并免费使用.我们的开发人员希望在一个平台(Windows,Mac或Linux,根据品味和愿望)编写应用程序,然后将代码移交给我以适应其他平台.
在我们在APRIL中使用的方法中,您不创建任何.nib,并且在调用时UIApplicationMain,您将委托类指定为其第四个参数.对于每个平台,游戏的主要代码保持完全相同,并且只有特定于平台的内容才会#ifdef进入代码,或者在帮助程序库中进行抽象.
在app delegate中,您可以创建视图控制器和窗口:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
    // create a window.
    // early creation so Default.png can be displayed while we're waiting for 
    // game initialization
    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // viewcontroller will automatically add imageview
    viewController = [[AprilViewController alloc] initWithWindow:window];
    [viewController loadView];
    // set window color
    [window setBackgroundColor:[UIColor blackColor]];
    // display the window
    [window makeKeyAndVisible];
    // thanks to Kyle Poole for this trick
    // also used in latest SDL
    // quote:
    // KP: using a selector gets around the "failed to launch application in time" if the startup code takes too long
    // This is easy to see if running with Valgrind
    [self performSelector:@selector(runMain:) withObject:nil afterDelay:0.2f];
}
请注意我们如何延迟启动0.2?这就是为什么我提到上面的图像视图.在这0.2秒内,我们在Default.png之后立即显示空白屏幕,并且在控制转移到runMain:之前引入了额外的延迟,它将控制释放到主应用程序:
- (void)runMain:(id)sender
{       
    // thanks to Kyle Poole for this trick
    char *argv[] = {"april_ios"};
    int status = april_RealMain (1, argv); //gArgc, gArgv);
#pragma unused(status)
}
所以,现在控件永远不会转移回UIApplication的实际主循环.然后创建自己的主循环.
    void iOSWindow::enterMainLoop()
    {
            while (mRunning) 
            {
                    // parse UIKit events
                    doEvents();
                    handleDisplayAndUpdate();
            }
    }
    void iOSWindow::doEvents()
    {
            SInt32 result;
            do {
                    result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, TRUE);
            } while(result == kCFRunLoopRunHandledSource);
    }
(在旁注中,当然使用视图控制器来简化UI的旋转以匹配设备方向.)
CADisplayLink如果操作系统支持,这两种方法都会使用.我没有注意到任何一种方法的任何问题,虽然我的私人项目主要是基于加速计.我怀疑APRIL方法可能会使一些问题消失.
| 归档时间: | 
 | 
| 查看次数: | 8515 次 | 
| 最近记录: |