Cocos2D зависает на iPhone 4 - PullRequest
       48

Cocos2D зависает на iPhone 4

1 голос
/ 11 ноября 2011

У меня есть приложение Cocos2d (1.0.1), которое ломается на моем iPhone 4 под управлением iOS 4.2.8.Он отлично работает в симуляторах 4.1, 4.3 и 5.0.Он отлично работает на iPhone 3g и iPod Touches с 4.2.1.Но он ломается по-другому на 4.2 сим.

На моем телефоне он зависает, когда я пытаюсь настроить вид GL и подключить к нему режиссер и сцену.Там нет ошибки и нет простого объяснения того, что пошло не так.В симуляторе 4.2 рассматриваемое представление OpenGL просто пустое, но замораживания не происходит.

Остановка даже не является «крахом».Он просто замерзает, затем, примерно через 60-75 секунд, он размораживается и продолжается, как будто ничего не происходит.После того, как устройство разморозилось, все мои входные данные, похоже, были буферизованы, потому что все они последовательно проходят (включая снимки экрана, отключение телефона, нажатие кнопки «Домой» и т. Д.)

Кроме того, само приложение работает отличнопосле разморозки.Но игра должна длиться всего 60 секунд, поэтому сначала она вообще не работала, потому что была в каком-то странном состоянии, потому что была заморожена, когда игра должна была закончиться.Но потом, просто в целях отладки, я удлинил игровой лимит до 95 секунд, и он стал полностью играбельным после разморозки (обычно, когда осталось 15 секунд) и в этот момент работает безупречно.

Вот viewWillAppearметод, где он замерзает.(Я практически ничего не делаю в init:)

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    if (self.view.subviews.count == 0)
    {
        UIImageView *scoreAreaBackground = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"ScoreBar" ofType:@"gif"]]];
        scoreAreaBackground.frame = CGRectMake(0, CalculateScoreAreaTop(), GAME_SCREEN_WIDTH, CalculateScoreAreaHeight());
        [self.view addSubview:scoreAreaBackground];

        image1View = [[[UIView alloc] initWithFrame:CGRectMake(CalculateImageLeft(), CalculateImageTop(), CalculateImageWidth(), CalculateImageHeight())] retain];
        [self.view addSubview:image1View];

        EAGLView *glView = [EAGLView viewWithFrame:CGRectMake(CalculateGridX(gameParameters.boardWidth), CalculateGridY(gameParameters.boardHeight), CalculateGridWidth(gameParameters.boardWidth), CalculateGridHeight(gameParameters.boardHeight))
                                       pixelFormat:kEAGLColorFormatRGB565   // kEAGLColorFormatRGBA8
                                       depthFormat:0                        // GL_DEPTH_COMPONENT16_OES
                            ];

        [self.view addSubview:glView];

        CCDirector *director = [CCDirector sharedDirector];
        [director setOpenGLView:glView];
        [director setAnimationInterval:1.0/60]; 
        [director setDisplayFPS:NO];

        ...

Я постепенно закомментировал каждый фрагмент кода, и "оскорбительная" строка такова:

[director setOpenGLView:glView];

Это нена самом деле заморозить при выполнении этой строки.Я могу отладить и пройти через весь метод viewWillAppear, и он отвечает нормально.Затем, когда я нажимаю «Продолжить выполнение программы», приложение останавливается.

Под оскорбительной строкой я подразумеваю, что я могу закомментировать все, что после этого (и весь код, ссылающийся на Cocos2d в остальной части приложения), иУстройство будет зависать точно так, как описано.Затем, если я закомментирую эту строку, она прекрасно работает без остановки - кроме, конечно, ничего не происходит в моем представлении OpenGL.

У кого-нибудь есть идеи, что здесь не так?Особенно странно, что это отлично работает на других устройствах и на симуляторе, но не работает только на моем телефоне, что заставляет меня подозревать какую-то настройку сборки (у меня настроено требование armv6, так как в противном случае он не работал бы настарые устройства вообще)

Заранее спасибо!

1 Ответ

0 голосов
/ 11 ноября 2011

Не ответ на вашу проблему, но предложения о том, что вы должны сделать, чтобы попытаться исключить любую странную ошибку. Прежде всего, я предполагаю, что ваши устройства не взломаны, и вы не разрабатываете на Hackintosh, верно?

  • очистить и перестроить проект (Xcode: Product -> Clean)
  • перезагрузите устройство
  • перезагрузите ваш Mac
  • обновление до Xcode 4.2 / iOS 5, особенно если вы все еще используете бета-версию Xcode или Xcode 3.2
  • попробуйте запустить на другом iPhone 4 (чтобы эта проблема возникла не только у вас)
  • попробуйте создать новый проект Cocos2D с нуля, посмотрите, не возникла ли и там ошибка
    • Если ошибка исчезнет, ​​скопируйте исходный код и ресурсы из исходного проекта в этот новый проект, пока новый проект не будет работать, как ожидалось. Затем попробуйте это на вашем iPhone 4, чтобы увидеть, была ли проблема связана с настройкой сборки.
  • пошагово просматривайте код, чтобы увидеть, какой вызов на самом деле занимает столько времени. См .: http://www.learn -cocos2d.com / 2011/10 / xcode-4-debugging-crashcourse /

Простой факт, что вы, очевидно, можете выбрать симулятор iOS 4.1, может указывать на то, что, возможно, что-то не так с вашей установкой XCode. С Xcode 4.2 единственные симуляторы, которые вы сможете выбрать, это 4.3 и 5.0. В качестве крайней меры удалите папку / Developer и переустановите Xcode.

Обратите внимание, что все настройки сборки в вашей цели, напечатанные полужирными буквами, изменились по умолчанию. Возможно, вы захотите сравнить измененные параметры сборки с параметрами только что созданного проекта XCode и соответствующим образом отменить параметры сборки.

Если вы используете Xcode 4.2, вы должны убедиться, что компилятор Apple LLVM 3.0 является компилятором, а не LLVM GCC 4.2. Если LLVM 3.0 выдает дополнительные ошибки и предупреждения, исправьте их.

...