我正在制作一款游戏,我想将该选项添加到全屏,以便将所有图形扩展到新的扩展JFrame。代码工作得很好,可以做我想要的事情,但现在我遇到了一个问题,我认为这是内存问题或其他问题,因为我正在做的是将所有内容绘制到缓冲图像中,然后绘制缩放到JFrame大小的缓冲图像。以前,当我把所有东西都直接画到框架上时,我会得到~900个框架不变。但当我实现我的新方法时,它会立即下降到120帧,每隔几秒钟就会冻结半秒。
这是目前的方法:
private void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
this.createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();
BufferedImage screen = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = (Graphics2D) screen.getGraphics();
g2d.translate(-Camera.getX(), -Camera.getY());
level.render(g2d);
handler.render(g2d);
g2d.translate(Camera.getX(), Camera.getY());
g.drawImage(screen, 0, 0, fullWidth, fullHeight, null);
bs.show();
g2d.dispose();
g.dispose();
}
这就是之前的方法,即在没有冻结的情况下提供900帧或更多帧:
private void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
this.createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();
Graphics2D g2d = (Graphics2D) g;
g2d.translate(-Camera.getX(), -Camera.getY());
level.render(g);
handler.render(g);
g2d.translate(Camera.getX(), Camera.getY());
bs.show();
g.dispose();
}
例如,获取图像的高度并使循环计数器停止数量,然后在方法中一次绘制一条线。JVM";堆叠";被认为是在启动命令行上分配的最大值,标志-Xs总共1兆字节。您还应该为堆eden e.t.c中的图像保留大约1gb的空间。https://www.baeldung.com/jvm-configure-stack-sizes另请参阅垃圾收集器文档
"处置";在图形上,仅将引用置空。
System.gc();
这将调用垃圾收集器来清理RAM。对于映像程序,它们总是需要在启动命令行上为JVM保留一些RAM。也可以将关于如何处理垃圾的标志传递给JVM,通常System.gc是可以的,但由于服务器使用量很大,它们需要将垃圾收集器方案作为标志放入。如果您需要一个方案(900帧-似乎您肯定也需要一个垃圾收集方案(,请参阅G1垃圾收集器。https://www.oracle.com/technetwork/tutorials/tutorials-1876574.html
";显示";诸如Frame或window之类的顶级窗口的方法是在屏幕上初始化一次,而不是针对图像绘画本身,您需要通过从精确的方法获取Graphics对象来重新绘制图像的矩阵(Raster(。例如,您想要绘制的缓冲图像,不需要为下一个图像像素设置处理它(它属于该图像(,但可能需要将它放在永久的位置,如全局引用,以便在方法完成时不会被破坏,然后调用Window、Frame,面板";重新喷漆";方法。在java.swing J系统中;显示",您将布尔值true馈送到方法";setVisible",它还需要在SwingUtilities.invokeLater中包装setVisible,没有什么太难搜索的。如果有什么问题可以很好地解决,请下载Sun Microsystems Java教程(现在的Oracle(URL示例:https://docs.oracle.com/javase/tutorial/uiswing/components/frame.html在向开发者免费注册后,给自己一份副本。