Получение EXC_BAD_ACCESS с Cocos2d & Box2d при попытке использовать DebugDraw - PullRequest
0 голосов
/ 04 марта 2011


эта вещь сводит меня с ума!
Я экспериментирую с Cocos2d (0.99.5) и Box2D, и я успешно создал сцену со слоем и двумя телами (фактически парой прыгающих шаров). Теперь я хотел бы включить DebugDrawing, чтобы я мог точно видеть, что происходит. Учтите, что все работает с отключенным DebugDrawing.

Говоря о коде, в моем методе init у меня есть это:

    m_debugDraw = new GLESDebugDraw(PTM_RATIO);


    uint32 flags;
    flags = 0;
    flags += 1  * b2DebugDraw::e_shapeBit;
    flags += 1  * b2DebugDraw::e_jointBit;
    flags += 1  * b2DebugDraw::e_aabbBit;
    flags += 1  * b2DebugDraw::e_pairBit;
    flags += 1  * b2DebugDraw::e_centerOfMassBit;

    m_debugDraw->SetFlags(flags);
    _world->SetDebugDraw(m_debugDraw);

Мой метод рисования следующий:

-(void)draw {
    [super draw];

    glDisable(GL_TEXTURE_2D);
    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);

    _world->DrawDebugData();  // <------ here comes the problem

    glEnable(GL_TEXTURE_2D);
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
}

Проблема в том, что когда программа достигает строки

_world->DrawDebugData();

исключение EXC_BAD_ACCESS в брошенном. Отладчик показывает ошибку здесь:

void b2World::DrawDebugData()
{
    if (m_debugDraw == NULL)
    {
        return;
    }

    uint32 flags = m_debugDraw->GetFlags();    // <----- this is the row pointed by Xcode

    if (flags & b2DebugDraw::e_shapeBit)
    {
    [...]

Ошибка, отображаемая в главном окне: «Поток 1: Программа получила сигнал:« EXC_BAD_ACCESS »». Это вывод, который я получаю:

GNU gdb 6.3.50-20050815 (версия Apple gdb-1515) (суббота, 8 января 00:31:48 UTC 2011) Copyright 2004 Free Software Foundation, Inc.

GDB - это бесплатное программное обеспечение, подпадающее под действие Стандартной общественной лицензии GNU, и вы добро пожаловать изменить его и / или распространять его копии при определенных условиях.

Введите «show copying», чтобы увидеть условия.

На GDB нет абсолютно никаких гарантий. Для получения подробной информации введите «показать гарантию».

Эта GDB была настроена как "--host = x86_64-apple-darwin --target = arm-apple-darwin" .tty / dev / ttys000 целевой удаленный мобильный /tmp/.XcodeGDBRemote-191-40

Переключение на протокол remote-macosx

mem 0x1000 0x3fffffff кеш

mem 0x40000000 0xffffffff нет

mem 0x00000000 0x0fff нет

[Переключение на тему 11779]

[Переключение на тему 11779]

sharedlibrary apply-load-rules all

2011-03-03 22: 10: 36.477 MyApp [2738: 707] cocos2d: cocos2d v0.99.5

2011-03-03 22: 10: 36.529 MyApp [2738: 707] cocos2d: Использование типа директора: CCDirectorDisplayLink

2011-03-03 22: 10: 36.936 MyApp [2738: 707] cocos2d: версия ОС: 4.3 (0x04030000)

2011-03-03 22: 10: 36.943 MyApp [2738: 707] cocos2d: GL_VENDOR: Imagination Technologies

2011-03-03 22: 10: 36.949 MyApp [2738: 707] cocos2d: GL_RENDERER: PowerVR SGX 535

2011-03-03 22: 10: 36.956 MyApp [2738: 707] cocos2d: GL_VERSION: OpenGL ES-CM 1.1 IMGSGX535-58.1

2011-03-03 22: 10: 36.966 MyApp [2738: 707] cocos2d: GL_MAX_TEXTURE_SIZE: 2048

2011-03-03 22: 10: 36.973 MyApp [2738: 707] cocos2d: GL_MAX_MODELVIEW_STACK_DEPTH: 16

2011-03-03 22: 10: 36.979 MyApp [2738: 707] cocos2d: GL_MAX_SAMPLES: 4

2011-03-03 22: 10: 37.020 MyApp [2738: 707] cocos2d: GL поддерживает PVRTC: ДА

2011-03-03 22: 10: 37.026 MyApp [2738: 707] cocos2d: GL поддерживает текстуры BGRA8888: ДА

2011-03-03 22: 10: 37.033 MyApp [2738: 707] cocos2d: GL поддерживает текстуры NPOT: ДА

2011-03-03 22: 10: 37.039 MyApp [2738: 707] cocos2d: GL поддерживает discard_framebuffer: ДА

2011-03-03 22: 10: 37.060 MyApp [2738: 707] cocos2d: скомпилировано с поддержкой NPOT: НЕТ

2011-03-03 22: 10: 37.066 MyApp [2738: 707] cocos2d: скомпилировано с поддержкой VBO в TextureAtlas: ДА

2011-03-03 22: 10: 37.072 MyApp [2738: 707] cocos2d: скомпилировано с преобразованием Affine Matrix в CCNode: ДА

2011-03-03 22: 10: 37.078 MyApp [2738: 707] cocos2d: скомпилировано с поддержкой профилирования: НЕТ

2011-03-03 22: 10: 44.375 MyApp [2738: 707] cocos2d: интервал кадров: 1

2011-03-03 22: 10: 44.420 MyApp [2738: 707] cocos2d: размер поверхности: 320x480

2011-03-03 22: 10: 44.654 MyApp [2738: 707] Получено предупреждение о памяти. Уровень = 1

2011-03-03 22: 10: 44.696 MyApp [2738: 707] cocos2d: разборка

"MenuBackGround.png",

"Star.png",

"fps_images.png"

)>

Текущий язык: авто; в настоящее время с ++

(ГБД)

Я пробовал поискать в Google и многое узнал об этой ошибке, но до сих пор не могу ее решить. Это происходит как на симуляторе, так и на iPhone. Кто-то в другом обсуждении (извините, потерял ссылку) отметил, что это может быть связано с компилятором или оптимизацией, поэтому я пробовал разные комбинации, переключаясь с LLVM на GCC на LLVM-GCC и устанавливая оптимизацию на разных уровнях, но безуспешно.

Может ли кто-нибудь указать мне правильное направление? Дайте мне знать, если потребуется дополнительная информация.

Спасибо вам всем,
Даниэле Салатти

Ответы [ 2 ]

2 голосов
/ 04 марта 2011

Единственное отличие от шаблона Cocos2D Box2D заключается в том, что вы вызываете SetDebugDraw после назначения флагов. Это не должно иметь никакого значения, но вы можете попробовать это точно так же, как это делает проект шаблона Box2D:

    world = new b2World(gravity, doSleep);

    world->SetContinuousPhysics(true);

    // Debug Draw functions
    m_debugDraw = new GLESDebugDraw( PTM_RATIO );
    world->SetDebugDraw(m_debugDraw);

    uint32 flags = 0;
    flags += b2DebugDraw::e_shapeBit;
    m_debugDraw->SetFlags(flags);       

Обновление: Я нашел другую разницу. В вашем методе рисования вы вызываете [super draw]. Шаблонный проект Box2D этого не делает. Опять же, это не должно иметь никакого значения, но вы никогда не знаете. Если он все еще падает, я рекомендую сравнить ваш проект с шаблоном Box2D, чтобы найти любые другие (возможно, тонкие) различия. В дополнение к обычным рекомендациям исключить все ошибки компилятора: очистить все цели, удалить папку сборки, перезапустить Xcode (и весь компьютер), удалить приложение из Simulator / Device (и перезагрузить устройство).

PS: Я вижу, вы используете префиксы подчеркивания, как в: _world. Apple рекомендует не делать этого, поскольку префиксы подчеркивания зарезервированы для их собственного внутреннего использования, а также для некоторых функций в стиле C. В ObjC, если вы должны назвать переменные-члены в соответствии с какой-то схемой, предпочитайте использовать суффиксы подчеркивания, как в мире _-> SetDebugDraw ()

Лично я стараюсь вообще избегать этих схем именования world, world или m_world, в этом нет никакого смысла, кроме традиции и противоречивых имен параметров функций. Там, где это необходимо, я скорее изменяю имена параметров функции, чтобы они подчеркивались суффиксами.

1 голос
/ 04 марта 2011

Посмотрите на переменные world и debugDraw с помощью отладчика. Похоже, один из них поврежден

...