我有一个已发货的 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/

10-14 22:11
查看更多