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];
}
Run Code Online (Sandbox Code Playgroud)
请注意我们如何延迟启动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)
}
Run Code Online (Sandbox Code Playgroud)
所以,现在控件永远不会转移回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);
}
Run Code Online (Sandbox Code Playgroud)
(在旁注中,当然使用视图控制器来简化UI的旋转以匹配设备方向.)
CADisplayLink如果操作系统支持,这两种方法都会使用.我没有注意到任何一种方法的任何问题,虽然我的私人项目主要是基于加速计.我怀疑APRIL方法可能会使一些问题消失.
| 归档时间: |
|
| 查看次数: |
8515 次 |
| 最近记录: |