我的JOGL应用程序加载时间长,遇到问题。直到昨天昨天画布初始化突然开始耗时一整分钟,一切工作都很好。罪魁祸首在本地Platform.initSingleton()调用中。

在干净的类中遵循代码

System.out.println("Start");
long t0 = System.currentTimeMillis();

AbstractGraphicsDevice device = GLProfile.getDefaultDevice();
long t1 = System.currentTimeMillis();
System.out.println((t1 - t0) + "ms " + device);

GLProfile profile = GLProfile.getDefault(device);
long t2 = System.currentTimeMillis();
System.out.println((t2 - t1) + "ms " + profile);

GLCapabilities capabilities = new GLCapabilities(profile);
long t3 = System.currentTimeMillis();
System.out.println((t3 - t2) + "ms " + capabilities);

System.out.println("Java version "+System.getProperty("java.version"));


将产生

61467ms WindowsGraphicsDevice[type .windows, connection decon, unitID 0, handle 0x0, owner false, NullToolkitLock[obj 0x59b9040a]]
0ms GLProfile[GL4bc/GL4bc.hw]
0ms GLCaps[rgba 8/8/8/0, opaque, accum-rgba 0/0/0/0, dp/st/ms 16/0/0, dbl, mono  , hw, GLProfile[GL4bc/GL4bc.hw], on-scr[.]]
Java version 1.8.0_102 / 1.8.0_121 / 1.8.0_152


我试过了


在具有类似规格的不同计算机上运行(仅在该计算机上工作
精细)
进行调试以在调用中找到更具体的位置,但被困在对Platform.initSingleton()的本地调用中
使用-Djogamp.debug = ALL运行Platform.initSingleton()(请参见下文)
检查所有库是否与工作机器上的库相同
将JDK和JRE更新到最新版本
将JDK和JRE重新安装到旧版本
更新视窗
将图形驱动程序更新到最新
将(干净的)图形驱动程序重新安装到可以在其他地方使用的版本
根据Windows更新历史记录安装了KB4038788,KB890830和KB4038806,没有暗示它们可能是原因
防火墙似乎没有阻止任何系统调用(请确保关闭)
确定要关闭Windows Defender
将测试代码编译到jar中并从命令行运行


从调试打印看来,问题出在这里

IOUtil.testDirExec(): test-exe <C:\Users\User\AppData\Local\Temp\jogamp_exe_tst3558906654350516679.exe>, existingFile false, returned 0
IOUtil.testDirExec(): abs-path <C:\Users\User\AppData\Local\Temp>: res 0 -> true
IOUtil.testDirExec(): total 30033ms, create 16ms, fill 0ms, execute 30017ms
IOUtil.testDirImpl(tempX1): <C:\Users\User\AppData\Local\Temp>, create true, exec true: true
IOUtil.testDirExec(): test-exe <C:\Users\User\AppData\Local\Temp\jogamp_0000\jogamp_exe_tst3791240964894525069.exe>, existingFile false, returned 0
IOUtil.testDirExec(): abs-path <C:\Users\User\AppData\Local\Temp\jogamp_0000>: res 0 -> true
IOUtil.testDirExec(): total 30016ms, create 0ms, fill 0ms, execute 30016ms


我的想法不多了,我不完全喜欢重新安装整个系统以进行备份(可能再次遇到)的想法。

任何想法,经验可能导致此吗?我发现最有趣的是,它最终可以工作,并且初始化过程只是延迟了。

使用oracle JDK 1.8.0_102 / 1.8.0_121 / 1.8.0_152(总之,几天前工作过121)
尝试使用驱动程序388.13x64(最新)和385.69x64(在其他计算机上运行)

编辑:无法正常运行的计算机具有GTX 1070,可以正常运行的计算机具有GTX 960。

最佳答案

经过更多的挖掘之后,我发现最好的解决方案是添加

-Djogamp.gluegen.UseTempJarCache=false


JVM参数。

引用类似的问题(在问这个问题时出于某种原因我没有找到它)JOGL takes too long to start

马文·梅勒:


  使用参数-Djogamp.gluegen.UseTempJarCache = false启动,然后
  使用本地库而不是jar为我完成了窍门
  (启动时间从15s +到500ms)。这不是一个真正的解决方案,因为
  本机库不应该再使用了,但仍然足够
  进行调试。


原始问题中的问题似乎与我的问题有所不同,因为我已经修复了30 + 30秒,这是由于缓存访问超时而不是长时间运行防病毒检查引起的。

08-18 09:58