На работе я создаю программу визуализации музыки. JOGL был выбран потому, что нам нужен был API для программирования 3D-графики, который сразу же работал на нескольких платформах. На данный момент я использую GLCanvas для рендеринга всей работы, однако недостатком является то, что он использует EDT для рендеринга цикла OpenGL, а EDT также используется для диспетчеризации других взаимодействий с графическим интерфейсом. Поэтому, если я заставлю рендерер спать в течение определенного времени, чтобы дождаться структуры данных или контролировать FPS, тогда я заставлю весь EDT спать и, следовательно, замедлить графический интерфейс.
Я хочу, чтобы музыкальный проигрыватель (в одном потоке) взаимодействовал со структурами данных, которые использует визуализатор. Я бы сделал это, имея 2 синхронизированных метода, которые уведомляют другой поток или ждут сами, в зависимости от того, что происходит. Проблема с тем, что я только что упомянул, заключается в том, что на данный момент программа реализована там, где EDT запускает рендеринг (это то, что происходит с GLCanvas). В этом случае, когда цикл рендеринга (поток EDT) переходит к получению пустой структуры данных, ему предлагается подождать. Поток будет ждать, пока песня будет загружена, а затем воспроизведена, однако я не могу загрузить песню с помощью графического интерфейса, потому что поток EDT ожидает, пока песня будет загружена и воспроизведена, но песня не может быть загружена, потому что EDT находится в спящем режиме. По сути, это мертвый замок.
Прошу прощения за все написанное. Надеюсь, я делаю это легко читаемым. Идеальным решением моей проблемы является использование JOGL's NEWT, который запускает цикл рендеринга в отдельном потоке, а затем отдельно EDT. Это позволит мне приостановить поток рендеринга и поток музыкального проигрывателя вперед и назад, не касаясь EDT, который обрабатывает все взаимодействия с графическим интерфейсом.
Прежде чем я включу 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);
or:
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. рип = 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