Окна игрового центра не прокручиваются плавно в игре OpenGL - PullRequest
3 голосов
/ 29 августа 2011

У меня есть поставляемая игра OpenGL, в которую я добавляю поддержку Game Center для версии 1.1. Игра не использует 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? Я попытался создать UIViewController, который находится между UIWindow и OpenGL UIView, но у меня такое же поведение.

Вот как я создаю диалог 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);

Кроме этого, я не делаю регулярных звонков в ОС.

Кто-нибудь знает, что происходит? Моя игра готова к отправке, кроме этой проблемы, и она сводит меня с ума.

1 Ответ

2 голосов
/ 30 августа 2011

Хорошо, я думаю, что нашел ответ на этот вопрос, поэтому я собираюсь ответить на свой вопрос в надежде спасти других от большого разочарования.

Проблема в 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, если кадры занимали больше времени, дельта-время отражало это.С CADisplayLink я не уверен, что это все еще так.

О, удовольствие от программирования.

...