在工作中我正在创建一个音乐可视化程序。选择JOGL是因为我们需要一个API来编程3D图形,并让它立即在多个平台上运行。目前,我正在使用GLCanvas来渲染所有工作,但是,缺点是它使用EDT渲染OpenGL循环,而EDT也用于调度其他GUI交互。因此,如果我让渲染器休眠一段时间以等待数据结构或控制FPS,那么我会使整个EDT进入睡眠状态,从而减慢GUI的速度。
我想要做的是让音乐播放器(在一个线程上)与可视化器正在使用的数据结构进行交互。我会通过2个同步方法来做到这一点,这些方法通知另一个线程或等待自己,具体取决于发生了什么。我刚才提到的问题是,目前程序是在EDT运行渲染的地方实现的(GLCanvas会发生这种情况)。在这种情况下,当渲染循环(EDT线程)去检索空数据结构时,它被告知等待。线程将等到加载歌曲然后播放,但是,我无法使用GUI加载歌曲,因为EDT线程正在等待加载和播放歌曲但由于EDT是睡眠而无法加载歌曲。从本质上讲,这是一个死锁。
我为所有的写作道歉。我希望我这么容易阅读。 我的问题的一个完美解决方案是使用JOGL的NEWT,它将在一个单独的线程上运行渲染循环,然后分别在EDT上运行。这样我就可以在不触及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 - Parent既不是NSWindow也不是NSView:0x0 * ** * *** viewWillDraw:0x0x7f9ca062ae18位置0x248的无效内存访问权限rip = 0x10df02478
我已经在互联网上搜索了好几天,并且广泛阅读了记录很少的NEWT API。我希望有人可以提供帮助,因为在高性能程序中使用NEWT比使用GLCanvas更有益,更灵活。
我正在使用:
操作系统版本:Mac OS X 10.7(11A511) 报告版本:9 型号:MacBook5,1,BootROM MB51.007D.B03,2处理器,Intel Core 2 Duo,2 GHz,4 GB,SMC 1.40f2 图形:NVIDIA GeForce 9400M,NVIDIA GeForce 9400M,PCI,256 MB 最新的Mac Java更新 JOGL-2.0-b23-20110303-MacOSX的
答案 0 :(得分:0)
这是我用来学习newt操作的教程https://sites.google.com/site/justinscsstuff/jogl-tutorial-2。
它解释了Newt以及JFrame设置。