Использование одного и того же EAGLContext в разных ViewControllers / EAGLViews - PullRequest
0 голосов
/ 04 октября 2011

У меня проблемы с использованием одного и того же EAGLContext через EAGLViews.У меня есть два контроллера просмотра, каждый из которых имеет один EAGLView.

Каждый контроллер просмотра выделяет новый EAGLContext, и для каждого соответствующего EAGLView создается последующий кадровый буфер / цветовой буфер, но это пустая тратаресурсов памяти.

Я знаю, что можно использовать один и тот же EAGLContext в контроллерах ViewController, просто привязав разные кадровые буферы / цветовые буферы к различным EAGLViews:

Использование нескольких OpenGLViews And UIKit

Но мне пока не удалось этого достичь.

Есть идеи?

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

Ответы [ 2 ]

1 голос
/ 04 октября 2011

Наконец-то удалось решить проблему.

В одном из контроллеров представления я использовал:

dispatch_async(openGLESContextQueue, ^{

        [(EAGLView *)self.view setFramebuffer];

        (...opengl draw code...)

        [(EAGLView *)self.view presentFramebuffer];

    });

При использовании EAGLContext в многопоточной среде нужно быть осторожным, чтобы другие потоки не могли одновременно получить к нему доступ, используя:

@syncronized(context) { ...opengl drawing here...}

и слить текущую очередь dispatch_queue перед передачей управления другому ViewController (через presentViewController :), используя:

dispatch_sync(openGLESContextQueue, ^{});

Итак, используя эти два трюка, я смог просто использовать один EAGLContext для нескольких представлений. Необходимо также обратить особое внимание на текущее состояние EAGLContext. У меня были неожиданные результаты, потому что на первый взгляд у меня было:

glVertexPointer(2, GL_FLOAT, 0, squareVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors);
glEnableClientState(GL_COLOR_ARRAY);

Во втором представлении у меня был совершенно другой код рисования, и я, конечно, забыл использовать:

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);

И вуаля!

Спасибо:)

0 голосов
/ 04 октября 2011

EAGLView на самом деле не единственный класс; это семейство классов с тем же именем, которое Apple склонна бросать в свои файлы примеров. Так что относительно конкретных модификаций советовать довольно сложно.

Моим первоначальным решением было создание одноэлементного класса, который продавал бы один общий EAGLContext. EAGLContext s можно использовать только в одном потоке за раз, так что это не обязательно полное решение, но то, что вы хотите сделать, вероятно, будет зависеть от семантики вашей программы и похоже на тему, отличную от вашего реального вопроса. 1006 *

Шаблон 'OpenGL ES Application' в Xcode 4.1 создает контекст вне пределов представления, тогда как я думаю, что ранее он был внутри, что немного облегчает задачу.

...