我有一个已发货的 OpenGL 游戏,我正在为 1.1 版本添加 Game Center 支持。游戏不使用 UIViewController 并且在 AppDelegate 中编码如下:
-(void)applicationDidFinishLaunching:(UIApplication *)application
{
window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
[window setUserInteractionEnabled:YES];
[window setMultipleTouchEnabled:YES];
glView = [[EAGLView alloc] initWithFrame:[UIScreen mainScreen].bounds];
[window addSubview:glView];
[window makeKeyAndVisible];
[glView performSelectorOnMainThread:@selector(mainGameLoop) withObject:nil waitUntilDone:NO];
}
一切都很好,但是当 Game Center 调出一个窗口(例如 GKAchievementViewController)时,该窗口在屏幕上的动画效果很好,但是当我触摸以滚动它时,它没有任何像普通窗口那样的动力或反弹。当我滚动窗口超过顶部和底部时,它不会反弹回来。
该窗口功能齐全,可以注册触摸,但它的行为很丑陋。
我认为这是因为某些信息没有正确发送到管道中,因为我没有 UIViewController?我尝试创建一个位于 UIWindow 和 OpenGL UIView 之间的 UIViewController,但我得到了相同的行为。
这就是我创建 GKAchievementViewController 对话框的方式:
-(void)displayAchievements
{
achievmentsViewController = [[UIViewController alloc] init];
[glView addSubview:achievmentsViewController.view];
GKAchievementViewController *achievements = [[GKAchievementViewController alloc] init];
if (achievements != nil)
{
achievements.achievementDelegate = self;
[achievmentsViewController presentModalViewController:achievements animated:YES];
}
[achievements release];
}
我没有在游戏中使用任何 UIKit,所有按钮等都是直接使用 OpenGL 完成的。我也没有使用 cocos2d 或任何其他框架。
在我的主循环中,我这样做:
while(CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.002, TRUE) == kCFRunLoopRunHandledSource);
除此之外,我不会对操作系统进行任何常规调用。
有谁知道发生了什么?除了这个问题,我的游戏已经准备好提交,这让我发疯。
最佳答案
好的,我想我找到了这个问题的答案,所以我将回答我自己的问题,希望能让其他人免于沮丧。
问题是 CFRunLoopRunInMode。它不适合 UIKit。我改用 CADisplayLink,一切都很好。
displayLink = [NSClassFromString(@"CADisplayLink") displayLinkWithTarget:self selector:@selector(mainLoopBody)];
[displayLink setFrameInterval:1];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
我读过 CADisplayLink 导致了一些游戏问题,并且关于使用它与 CFRunLoopRunInMode 与 NSTimer 存在很多争论。我将使用它一段时间,看看它是否会导致任何问题,但窗口再次向右滚动。
我对 CADisplayLink 的一个担忧是帧速率是否开始下降。在我旧的 CFRunLoopRunInMode 系统下,如果帧花费的时间更长,则增量时间反射(reflect)了这一点。使用 CADisplayLink,我不确定是否仍然如此。
哦,编程的乐趣。
关于iphone - 游戏中心窗口在 OpenGL 游戏中滚动不顺畅,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7224741/