Проблемы с необычной настройкой NSOpenGLView - PullRequest
0 голосов
/ 24 сентября 2010

Я пытаюсь установить подкласс NSOpenGLView необычным способом, и у меня возникают некоторые проблемы.По сути, я пишу программу для моделирования биоинженерии для моего доктора наук, и мне нужно иметь возможность скомпилировать ее как под MacOSX, так и под Unix (моя машина - Mac, но сим в конечном итоге будет работать на более мощной машине Unix).Поскольку в течение следующих полутора лет код будет становиться все длиннее и длиннее, я бы не стал отслеживать две совершенно разные версии программы.Итак, я надеюсь, что смогу скомпилировать код ObjectiveC под Unix, избегая ObjectiveC-2.0 и оставляя интерфейс необязательным (он будет в основном там, чтобы выполнять настройку перед долгим моделированием и отслеживать вещи для коротких во время разработки).

Текущая версия хорошо работает без интерфейса - симуляция выполняется правильно, и программа способна рендерить кадры OpenGL и экспортировать их в графические и видеофайлы без каких-либо проблем.Так как я сейчас добавляю интерфейс (прямо сейчас просто окно с подклассом NSOpenGLView и кнопкой «Пуск») поверх этого (чтобы я мог запустить код с альтернативной версией main () без него), яприходится «соединять» OpenGL странным образом, поскольку код рисования находится не в функции drawRect или даже в любом месте подкласса, а вместо этого в «базовой» программе.

Что я имеюна данный момент сделано следующее:

  1. Основная программа (использующая объект "Lattice") выполняет все симуляции и рендеринг, корректно выводя изображения и видео в файлы. Это также содержит NSOpenGLContext и вызывает [renderContext flushBuffer];

  2. Подкласс NSOpenGLView с именем PottsView содержит экземпляр решетки, который инициализируется вместе с представлением, подобным этому:

    - (id)initWithFrame:(NSRect)frame {
        if(![super initWithFrame:frame])
            return nil;
    
        // code
        frameSize.width = WIN_WIDTH;
        frameSize.height = WIN_HEIGHT;
        [self setFrameSize:frameSize];
    
        init_genrand64(time(0));
    
        latt = [Lattice alloc];
    
        if (SEED_TYPE) {
            [latt initWithRandomSites];
        } else {
            [latt initWithEllipse];
        }
    
        [[latt context] makeCurrentContext];
    
        return self;
    }
    

drawRect() пусто.

  1. PottsController - это объект, созданный в InterfaceBuilder, который соединяет кнопку запуска с представлением.ton просто указывает решетке выполнить несколько шагов.

Теперь нажатие кнопки start приводит к корректной работе симуляции (т. е. выводу в файлы и на терминал), но PottsView работает неправильно.Он остается белым, но если я cmd + tab частей, если он меняется на разделы визуализированного кадра.То же самое, если я нажимаю Expose (F3).

Я пробовал несколько комбинаций сброса, setNeedsDisplay и т. Д., Но, честно говоря, я потерян.До апреля этого года я не занимался программированием, и, поскольку, насколько я могу судить, это совершенно обратный способ использования NSOpenGLView. У меня нет идей.Я надеюсь, что кто-то может подсказать, как я могу заставить работать текущую настройку или как полностью переписать программу (при этом оставляя интерфейс необязательным).

1 Ответ

0 голосов
/ 26 сентября 2010

Непонятно, как вы думаете, что вы «связали» контекст и представление вместе.У вас может быть столько openglContexts, сколько вам нужно - просто рисование одного из них не приведет к тому, что его содержимое отобразится в случайном NSOpenGLView.Извинения, если я что-то пропустил.

NSOpenGLView - это довольно простой подкласс NSView, который создает контекст и формат пикселя.Так как у вас уже есть такие, вы можете покончить с NSOpenGLView и использовать пользовательский подкласс NSView.

Вы должны взглянуть на эту инструкцию.графический контекст из -drawRect:

Это заблокирует основной поток, пока gpu обрабатывает ваши инструкции, это может быть проблемой, если у вас много инструкций.Это также может происходить не более 50 кадров в секунду.

Если вы уже визуализируете свои кадры в файлы, разве вам не лучше наблюдать каталог вывода и рисовать изображение каждый раз, когда добавляется новый, opengl не требуется?

...