【问题标题】:Requested texture dimension exceeds maximum texture size请求的纹理尺寸超过最大纹理尺寸
【发布时间】:2016-01-29 19:49:19
【问题描述】:

在 JavaFx 中,我有一个程序,其中渲染线程有时会崩溃,并显示请求的纹理尺寸太大的消息。如果我正确读取堆栈跟踪,我猜它发生在 NGCanvas 中(它可能代表本机图形画布,JavaFx Canvas 节点的实现端)。

我检查了我分配的画布的大小,没有一个接近这个大小。现在,因为 JavaFx 在它自己的线程中运行它的渲染,我什至不知道是谁创建的。

有什么办法可以找出是谁告诉渲染管道分配这么大的纹理?

java.lang.RuntimeException: Requested texture dimension (65824) requires dimension (0) that exceeds maximum texture size (16384)
    at com.sun.prism.es2.ES2RTTexture.getCompatibleDimension(ES2RTTexture.java:135)
    at com.sun.prism.es2.ES2ResourceFactory.getRTTWidth(ES2ResourceFactory.java:146)
    at com.sun.scenario.effect.impl.prism.ps.PPSDrawable.getCompatibleWidth(PPSDrawable.java:48)
    at com.sun.scenario.effect.impl.prism.ps.PPSRenderer.getCompatibleWidth(PPSRenderer.java:153)
    at com.sun.scenario.effect.impl.ImagePool.checkOut(ImagePool.java:119)
    at com.sun.scenario.effect.impl.Renderer.getCompatibleImage(Renderer.java:116)
    at com.sun.scenario.effect.impl.prism.ps.PPSRenderer.getCompatibleImage(PPSRenderer.java:168)
    at com.sun.scenario.effect.impl.prism.ps.PPSRenderer.getCompatibleImage(PPSRenderer.java:67)
    at com.sun.scenario.effect.Effect.getCompatibleImage(Effect.java:479)
    at com.sun.javafx.sg.prism.NGCanvas$RenderInput.filter(NGCanvas.java:1582)
    at com.sun.scenario.effect.FilterEffect.filter(FilterEffect.java:185)
    at com.sun.javafx.sg.prism.NGCanvas.applyEffectOnAintoC(NGCanvas.java:737)
    at com.sun.javafx.sg.prism.NGCanvas.renderStream(NGCanvas.java:1080)
    at com.sun.javafx.sg.prism.NGCanvas.renderContent(NGCanvas.java:606)
    at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2053)
    at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1945)
    at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
    at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
    at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2053)
    at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1945)
    at com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:477)
    at com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:330)
    at com.sun.javafx.tk.quantum.PresentingPainter.run(PresentingPainter.java:91)
    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:125)
    at java.lang.Thread.run(Thread.java:745)

根据要求:我使用的环境是 linux debian amd64,jdk 1.8 update 66。渲染是通过 mesa 进行的。

【问题讨论】:

  • 您可以添加有关您的环境的详细信息吗?我确信我在 openjdk 错误中看到过这个问题。
  • @ItachiUchiha 添加了更多关于环境的信息。
  • 我不确定你是否遇到了同样的问题,但你可能想检查一下 - Exception when filling shape with ImagePattern based on large image
  • 似乎与这个问题无关。
  • 会不会是驱动程序的错误?尝试使用-Dprism.order=sw 运行您的程序以强制软件渲染。如果有帮助,您可能需要尝试更新您的 GPU 驱动程序(无论如何发布您当前的版本和图形配置可能是相关的)。

标签: javafx-8


【解决方案1】:

在 javaFx 中,只允许 javaFx 应用程序线程修改画布。 尝试使用 Platform.runLater() 将您对 graphicsContext 的绘制调用打包到一个新的 Runnable 中。

【讨论】:

  • 我知道。如果你敢用错线程,JavaFx 甚至会抱怨。但这与问题无关。
猜你喜欢
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多