【问题标题】:Understanding Java Swing screen buffer memory usage (reading materials would be welcome)了解 Java Swing 屏幕缓冲区内存使用情况(欢迎阅读材料)
【发布时间】:2023-04-11 12:45:01
【问题描述】:

所以我需要了解 swing 是如何为缓冲屏幕渲染分配内存的。如果您有双重/三重/等缓冲,显然会有重复。但是,我需要知道 swing 何时分配内存以及分配多少内存。了解我是否打开了多个窗口(从同一个 jvm 启动)非常有帮助,具体取决于窗口最大化到一个屏幕、多个屏幕(我需要它最多 6 个屏幕)等需要多少内存。

有没有人知道任何好的阅读材料,或者可能对 Java Swing/AWT 如何为渲染缓冲区分配内存有答案。

一天结束时,我正在寻找一个确定的公式,以便如果我打开了多个窗口、每个窗口中的缓冲区数量、窗口的位置以及每个窗口的大小,我可以获得所需的准确字节数渲染应用程序(只是缓冲部分,其余内存是另一个问题)

我假设它是(单个缓冲的)每个窗口的 x 乘 y = 1 个缓冲区,将它们加在一起,你就有了所有的内存要求,但是分析数据这似乎与事实相去甚远,一些缓冲区很弱/软引用,有些强,我无法确定计算方式(但:))。

编辑:我正在使用 JFrame 对象(无论好坏)来做我的顶级工作。

【问题讨论】:

    标签: java swing rendering


    【解决方案1】:

    双缓冲是JPanel 的一个方便特性,但总会有一个重要的依赖于平台的贡献:每个可见的JComponent 都属于一个重量级的对等体,否则JVM 无法访问其内存。

    如果您想避免内存不足,请为启动参数选择一个合理的值,并指导用户如何更改它们。 ImageJ 就是一个很好的例子。

    【讨论】:

    • 问题是我需要使用尽可能少的内存。如果我可以在 ram 需求上节省 50m,那将非常有用。客户可能没有空闲的 50m 内存。或者,如果可能的话,我们希望确保不进行分页。我可能会在我的应用程序中禁用双缓冲,但我仍然希望能够估计我的应用程序的渲染部分应该使用多少内存。
    • 对不起,没有第一手经验,但有些实现可以使用显卡的内存。
    • 我们专门关闭了 Java 2D 硬件渲染,因为它会导致问题(我不是该决定的一部分,但由于性能问题,他们有充分的理由)。
    【解决方案2】:

    我会推荐 JConsole 和 Swing 源代码来实现这种精度。

    我假设您意识到这将是非常繁琐的计算,因为您必须考虑在过程中某处创建的每个对象,这当然取决于 UI 中涉及的控件。

    【讨论】:

    • 谢谢。我不需要确切的数字。我更需要以足够高的保真度来近似它,而不是获得确切的数字。如果答案在 50 到 60 兆之间,即使减 10 兆也可以。我只需要大致了解要为整个混乱分配多少内存并尽可能简约,但又不足以使应用程序无法在大型显示器上使用(或者至少知道何时增加内存需求)
    • 看起来其中一些来自 JDK 的非开源部分。
    【解决方案3】:

    我不知道 Swing 中有任何自动屏幕缓冲支持。如果你需要双缓冲,你需要自己实现它,在这种情况下你会更好地知道如何计算内存需求:-)

    请参阅this answer: Java: how to do double-buffering in Swing? 了解更多信息和良好指示。

    【讨论】:

    • Swing 确实提供了一些双重缓冲。 java.sun.com/products/jfc/tsc/articles/painting/#db
    • A Window 可以设置与.createBufferStrategy(numberOfBuffers) 一起使用的缓冲区数量...我正在制作数据应用程序,而不是 2d 游戏或其他任何东西。
    • @Dmitriy Likhten: JPanelComponent 继承了它的两个BufferStrategy
    • @trashgod:是的,对不起,我在打字时打断了。我在 Component 中查看它如何构建缓冲策略。仍然对我没有帮助,因为我需要有关何时构建大小缓冲区的 impl 详细信息。我将使用SingleBufferStrategy 来保持简单,同时尝试理解这一切。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多