Linux Javafx8图形上的性能衰减问题

时间:2016-04-10 16:53:42

标签: java linux opengl

test program output

我在Windows和Linux上使用某些应用程序在Javafx8中发现了几个关于图形性能的点击。我已经尝试过-Dprism.vsync = false的建议,但这似乎不会影响结果。我做了什么来消除它成为我的代码的可能性是编写一个简单的air-gappable应用程序,该应用程序只为GraphicsContext2D提供宽度为0且画布高度之间随机高度的数据。虽然我让它在一夜之间运行,但我会尝试显示每个图形循环的衰减metod调用时间,即#34;

这确实更好,但在Windows上并不完美。 Linux环境是Ubuntu 14.04最新版本。 Java是1.8.0_77。

我不知道的是,这是Javafx8问题还是Linux或Linix X.Org问题。

-Dprism.verbose数据是:

Prism pipeline init order: es2 sw 
Using java-based Pisces rasterizer
Using dirty region optimizations
Not using texture mask for primitives
Not forcing power of 2 sizes for textures
Using hardware CLAMP_TO_ZERO mode
Opting in for HiDPI pixel scaling
Prism pipeline name = com.sun.prism.es2.ES2Pipeline
Loading ES2 native library ... prism_es2
    succeeded.
GLFactory using com.sun.prism.es2.X11GLFactory
(X) Got class = class com.sun.prism.es2.ES2Pipeline
Initialized prism pipeline: com.sun.prism.es2.ES2Pipeline
Maximum supported texture size: 16384
Maximum texture size clamped to 4096
Non power of two texture support = true
Maximum number of vertex attributes = 16
Maximum number of uniform vertex components = 16384
Maximum number of uniform fragment components = 16384
Maximum number of varying components = 128
Maximum number of texture units usable in a vertex shader = 16
Maximum number of texture units usable in a fragment shader = 16
Graphics Vendor: X.Org
       Renderer: Gallium 0.4 on AMD OLAND
        Version: 3.0 Mesa 10.5.9
 vsync: true vpipe: true
ES2ResourceFactory: Prism - createStockShader: FillPgram_Color.frag
ES2ResourceFactory: Prism - createStockShader: Solid_TextureRGB.frag
ES2ResourceFactory: Prism - createStockShader: Solid_Color.frag
ES2ResourceFactory: Prism - createStockShader: Mask_TextureSuper.frag
new alphas
ES2ResourceFactory: Prism - createStockShader: Texture_Color.frag
ES2ResourceFactory: Prism - createStockShader: Texture_LinearGradient_PAD.frag
ES2ResourceFactory: Prism - createStockShader: Solid_TextureFirstPassLCD.frag
ES2ResourceFactory: Prism - createStockShader: Solid_TextureSecondPassLCD.frag
new alphas

在我用它运行的很多时间结束时,以小时或夜晚衡量,使用jconsole或jvisualvm测量的cpu,对于应用程序来说,从来没有,例如,大约23%。 top报告的CPU超过50%。最初CPU为6%,并且在10分钟内稳定增加到23%左右,但系统的响应性非常好。经过一个晚上或晚上,整个系统都是可怜的。终止应用程序可能会锁定整个系统一两分钟。 Java堆大小始终保持在50MB以下。在GC上它下降到20年代。我目前正在等待我用X轴生成的图表,我每隔100ms生成一个新帧。人们可以看到显示器中的眩晕,视觉上要慢得多,但我不知道发电时间是否不同.Y轴是毫秒,因为毫秒证明了过程。我已经意识到两件事: 1)Java9具有新的Marlin渲染器 2)Ubuntu 16.04具有新的视频驱动程序,在这种情况下是AMD,我相信内核有所改进,并且与图形性能有关。由于jvisualvm没有做lambda表达式,我确实做了堆转储并离线查看它,并没有看到任何特别值得注意的东西。我不相信我的应用程序中的减速源。我注意到Xorg的运行速度大约是50%+/-并且拥有大约652K(652232)的虚拟足迹

在完整的应用程序中,不仅顶部有示波器类型显示,下面还有瀑布(热图)。我可以用任何一个单独重现系统性能下降,但我想让一个足够小的应用程序重现我所看到的内容而没有混淆问题的无关的应用程序代码。同样,vsync的设置似乎没有任何效果。

现在根据top,它说java进程使用90%cpu,而jvirtualvm说这个进程使用22-23%,考虑到它开始时为6%仍然很高。

今天早上(自从我昨晚写完这篇文章以来)系统完全锁定,中断被禁用(没有数字锁定或大写锁定)。

我在3.5小时内看到,从顶部开始,java的CPU只有100%的羞涩而且XOrg的cpu增长缓慢。现在是42%。我的测试应用程序中的堆最低约13MB。我不知道为什么它从6%增长到23%(根据visualvm,然而根据top来增加到大约100%。但是visualvm显示cpu和堆平。enter image description here 任何观察,建议,对我可能出错的知识或已经在管道中治愈的知识都将不胜感激。

谢谢, 沃尔特

这会驱动显示器

ByteBuffer intBuffer = ByteBuffer.allocate(4);
while (PanadapterView.running) {
    short height = spectrumView.getController().getHeight();
    short width = spectrumView.getController().getWidth();
    try {
        Thread.sleep(100);
        if (height * width != 0) {
            short data[] = new short[width];
            for (int i = 0; i < width; i++) {
                data[i] = (short)(height - (Math.random()* height));
            }
            milliStart = System.nanoTime();
            controller.onSpectrumDataReady(null, data);
            milliDuration = (int)(System.nanoTime()-milliStart);
            milliDuration += 500;
            milliDuration /=1000;
            intBuffer.asIntBuffer().put(milliDuration);
            if (output != null) {
                int written = output.write(intBuffer);
            }
            intBuffer.clear();
            if (cnt++ % 5000 == 0) {
                if (output != null) {
                    output.force(false);
                }
            }
        }
    } catch (InterruptedException | IOException ex) {
        PanadapterView.running = false;
    }
}
if (output != null) {
    output.close();
}

}

这绘制画布

    public void onSpectrumDataReady(Panadapter targetPan, short[] data) {
        Platform.runLater(() -> {
            int start = 0;
            double offset = spectrum.getHeight();
            double canvasWidth = spectrum.getWidth();
            double canvasHeight = spectrum.getHeight();
            assert (data.length == canvasWidth);
            GraphicsContext gc = spectrum.getGraphicsContext2D();
            gc.beginPath();
            gc.clearRect(0, 0, canvasWidth, canvasHeight);
//            gc.save();
            gc.setLineWidth(1);
            gc.setStroke(Color.WHITESMOKE);
            gc.moveTo(start, (double) data[0]);
            for (int i = start; i < data.length; i++) {
                gc.lineTo((double) i, (double) data[i]);
            }
            gc.stroke();
//            gc.closePath();
        });
    }

我刚停止了该应用。一旦我做了Xorg cpu下降到.3%。这是图表,Y轴是美国的挂钟时间。enter image description here

运行7 1/2小时后,以下表示绘制整个帧的挂钟持续时间。我应该指出以下代表方法持续时间的1分钟滚动平均值。overnight execution

我确实在Windows 7上进行了相同的测试,并且它在绘图中没有明显的降级,这缩小回prism.order = sw,因为没有选择es2和es1。该问题似乎是Linux独有的,无论是在JavaFX8渲染器中还是在xorg本身中。其中,今天早上以76%的cpu运行。

0 个答案:

没有答案