Java;调整窗口大小后,paint(Graphics)调用过多!

| 我有个问题。最近,我正在研究使用Java实现硬件渲染的方法。我的目标不是使用诸如OpenGL之类的外部库。我在网站上找到了一篇帖子,其中详细介绍了操作方法。 这就是代码的含义(我将某些项目重命名):
    @Override
    public void paint(Graphics g) {
        createVolatileImage();

        do {
            GraphicsConfiguration gc = getGraphicsConfiguration();
            Graphics offscreenGraphics = volatileImage.getGraphics();

            int validationCode = volatileImage.validate(gc);
            if (validationCode == VolatileImage.IMAGE_INCOMPATIBLE) {
                createVolatileImage();
            }

            offscreenGraphics.setColor(getBackground());
            offscreenGraphics.fillRect(0, 0, getSize().width, getSize().height);

            offscreenGraphics.setColor(getForeground());
            paint(offscreenGraphics);

            g.drawImage(volatileImage, 0, 0, this);
        } while (volatileImage.contentsLost());
    }

    private void createVolatileImage() {
        GraphicsConfiguration gc = getGraphicsConfiguration();
        volatileImage = gc.createCompatibleVolatileImage(getWidth(), getHeight());
    }
不幸的是,如果我调整窗口的大小,paint(Graphics)方法(在Canvas类中)在一秒钟内被调用了1,000次,从而导致OutOfMemoryException。 有人遇到过吗? 在此先多谢!     
已邀请:
        之所以收到OutOfMemoryException,是因为您从未清理过ѭ1。从我的角度来看,您每次调用ѭ3you时都会分配一个新的
VolatileImage
,每秒可能发生数百次(在您的情况下为一千次)。除非释放ѭ1所使用的内存或解决问题以使分配一次而不是每帧分配一次,否则应用程序的内存空间将迅速膨胀,直到使JVM崩溃。尝试在渲染循环结束时将呼叫添加到“ 5”。另请阅读Javadoc。 编辑: 另一个有用的参考。     
        我真的不认为您的绘画方法中应该有一个循环。对于需要绘制的每个动作,它应该绘制一次,然后返回。当您拖动屏幕时,OS / env将负责将重新绘制消息一遍又一遍地分发到您的应用程序。如果可能的话,您应该重新粉刷,然后再返回。没有循环检查内容是否丢失,操作系统会告诉您何时进行绘画。     
        如在AWT和Swing中绘画中所讨论的,这是在AWT中绘画时的预期行为。尤其是在调整零部件尺寸时会发生系统触发的喷涂操作。如@rjacks所述,您需要“ you6”在“ѭ3”中创建的任何资源。     

要回复问题请先登录注册