我可以在没有OpenGL开销的情况下使用JavaFX8显示图像吗?

时间:2015-10-28 15:24:11

标签: javafx-8 raspberry-pi2

我试图在只有64MB GPU内存的Raspberry Pi2上编写一个简单的FX8图像显示程序。这会导致com.sun.prism.impl.BaseGraphics.drawTexture尝试渲染ImageView时出现NullPointer异常。这是使用打包的Oracle JDK8(build 1.8.0-b132)。

我在Pi stackexchange上被告知128MB是使用OpenGL功能的最小GPU内存,这看起来并不合理......但我不认为我做任何花哨的事情足以需要OpenGL。

问题

我是JavaFX和Pi的新手,所以也许我走向了错误的方向。我使用的是Rasbian / X11,但我并不依赖它。 JavaFX8是否有一种机制可以让我在不使用OpenGL的情况下显示全屏图像?

MCVE:

我的最小演示非常简单:一个持有ImageView的displaying a 29kB PNG (1847x1080)的AnchorView。

package sample;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception
    {
        Image image = new Image("/Sponsor.png");
        ImageView imageview = new ImageView(image);
        AnchorPane root = new AnchorPane(imageview);
        Scene scene = new Scene(root, 400, 275);
        primaryStage.setScene(scene);
        imageview.setFitHeight(scene.getHeight());
        imageview.setFitWidth(scene.getWidth());
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

堆栈跟踪

glGetError 0x505
java.lang.NullPointerException
    at com.sun.prism.impl.BaseGraphics.drawTexture(BaseGraphics.java:389)
    at com.sun.prism.impl.ps.BaseShaderGraphics.drawTexture(BaseShaderGraphics.java:139)
    at com.sun.prism.image.Coords.draw(Coords.java:46)
    at com.sun.prism.image.CompoundCoords.draw(CompoundCoords.java:94)
    at com.sun.javafx.sg.prism.NGImageView.renderContent(NGImageView.java:134)
    at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2043)
    at com.sun.javafx.sg.prism.NGImageView.doRender(NGImageView.java:103)
    at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1951)
    at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:225)
    at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:575)
    at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2043)
    at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1951)
    at com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:469)
    at com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:324)
    at com.sun.javafx.tk.quantum.PresentingPainter.run(PresentingPainter.java:89)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
    at com.sun.javafx.tk.RenderJob.run(RenderJob.java:58)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:129)
    at java.lang.Thread.run(Thread.java:744)

1 个答案:

答案 0 :(得分:1)

是的,你应该能够做到这一点。 JavaFX可以使用旧的Java2D API进行软件渲染。通常它应该只在没有硬件加速的系统上这样做。如果有,但它无法正常工作,应该尝试通过在启动应用程序时添加命令行选项来禁用硬件加速:

-Dprism.order = j2d

目前,似乎很难找到官方文档,但据报道其他地方也可以使用。