Как использовать модель NEWT от JOGL для создания окна в Mac OS X - PullRequest
0 голосов
/ 16 августа 2011

На работе я создаю программу визуализации музыки. JOGL был выбран потому, что нам был необходим API для программирования 3D-графики и его работы сразу на нескольких платформах. В настоящее время я использую GLCanvas для рендеринга всей работы, однако недостатком является то, что он использует EDT для рендеринга цикла OpenGL, а EDT также используется для диспетчеризации других взаимодействий GUI. Поэтому, если я заставляю рендеринг находиться в спящем режиме в течение определенного времени, чтобы дождаться структуры данных или управлять FPS, тогда я перехожу в спящий режим EDT и, следовательно, замедляю работу графического интерфейса.

Я хочу, чтобы музыкальный проигрыватель (в одном потоке) взаимодействовал со структурами данных, которые использует визуализатор. Я хотел бы сделать это, имея 2 синхронизированных метода, которые уведомляют другой поток или ждут сами, в зависимости от того, что происходит. Проблема с тем, что я только что упомянул, заключается в том, что в данный момент программа реализуется там, где EDT выполняет рендеринг (именно это происходит с GLCanvas). В этом случае, когда цикл рендеринга (поток EDT) переходит к извлечению пустой структуры данных, ему предлагается подождать. Поток будет ждать, пока песня будет загружена, а затем воспроизведена, однако я не могу загрузить песню с помощью графического интерфейса, потому что поток EDT ждет, пока песня будет загружена и воспроизведена, но песня не может быть загружена, потому что EDT является спящим. По сути, это мертвый замок.

Я прошу прощения за все написанное. Я надеюсь, что я делаю это легко читать. Идеальное решение моей проблемы - использовать NEWT JOGL, который будет запускать цикл рендеринга в отдельном потоке, а затем в EDT отдельно. Это позволит мне спать поток рендеринга и поток музыкального проигрывателя взад и вперед, не касаясь EDT, который обрабатывает все взаимодействия GUI.

Прежде чем я включу NEWT в реальный проект, я просто хочу попробовать базовые вещи с NEWT, такие как открытие окна в Mac OS 10.7. Поэтому я создал проект, который просто открывает окно, и оно терпит неудачу. Код для этого (один из способов сделать это, это единственный код в моем проекте):

Display display = NewtFactory.createDisplay(null); 
GLCapabilities capabilities = new GLCapabilities(GLProfile.get(GLProfile.GL2)); 
Screen screen = NewtFactory.createScreen(display, 0); 
Window window = NewtFactory.createWindow(screen, capabilities); 
window.setVisible(true); 

или

GLProfile.initSingleton(true);
GLProfile glp = GLProfile.get(GLProfile.GL2);;
GLCapabilities caps = new GLCapabilities(glp);
Renderer r = new Renderer();
GLWindow window = GLWindow.create(caps);
window.addGLEventListener(r);
window.setSize(300, 300);
window.setTitle("NEWT Window Test");
window.addWindowListener(new WindowAdapter() {
        public void windowDestroyNotify(WindowEvent e) {
            System.exit(0);
        }
});
Animator a = new FPSAnimator(window);
a.start();
window.setVisible(true);

Независимо от того, каким образом я использую, я все равно получаю те же ошибки:

  1. Находясь в консоли, он говорит:

Обнаружен размер экрана 1280x800 createWindow0 - Родитель не является ни NSWindow, ни NSView: 0x0 ******* viewWillDraw: 0x0x7f9ca062ae18Неверный доступ к памяти местоположения 0x248 рип = 0x10df02478

  1. Откроется окно со словами: NEWTTRY неожиданно завершил работу при использовании плагина libnewt.jnilib

Я искал в интернете несколько дней и много читал API NEWT, который плохо документирован. Я надеюсь, что кто-то может помочь, потому что использование NEWT в высокопроизводительных программах чрезвычайно выгодно и более гибко, чем использование GLCanvas.

Я использую:

Версия ОС: Mac OS X 10.7 (11A511) Версия отчета: 9 Модель: MacBook5,1, BootROM MB51.007D.B03, 2 процессора, Intel Core 2 Duo, 2 ГГц, 4 ГБ, SMC 1.40f2 Графика: NVIDIA GeForce 9400M, NVIDIA GeForce 9400M, PCI, 256 МБ Последнее обновление Java для Mac JOGL-2,0-b23-20110303-MacOSX

1 Ответ

0 голосов
/ 22 мая 2012

Это учебник, который я использовал для изучения операций тритона https://sites.google.com/site/justinscsstuff/jogl-tutorial-2.

Это объясняет как Newt, так и настройку JFrame.

...