На работе я создаю программу визуализации музыки. 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);
Независимо от того, каким образом я использую, я все равно получаю те же ошибки:
- Находясь в консоли, он говорит:
Обнаружен размер экрана 1280x800
createWindow0 - Родитель не является ни NSWindow, ни NSView: 0x0
******* viewWillDraw: 0x0x7f9ca062ae18Неверный доступ к памяти местоположения 0x248 рип = 0x10df02478
- Откроется окно со словами:
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