我正在寻找一种方法来正确缩放(几乎)JFrame的所有内容。到目前为止,我尝试过的所有解决方案都严重缺乏渲染速度。我正在寻找的是一种类似于在智能手机上缩放内容时的速度。
JFrame的内容应该可以快速重新缩放,并且即使您用新内容透支JFrame也可以保持缩放。它还应该足够灵活,以便您可以选择要重新绘制的BufferedImage(这基本上是我绘制的唯一类型,我不绘制任何其他“形状”)。我正在使用普通的Graphics、resp. Graphics2D对象进行绘制。
我之前尝试过的是Graphic2D的cale-method并使用AffineTransformat对象单独缩放每个BufferedImage:
g.scale(scalingFactorX, scalingFactorY);
或替代地:
BufferedImage img = someImageToScale();
AffineTransform scaleTransform = AffineTransform.getScaleInstance(scalingFactorX, scalingFactorY);
AffineTransformOp bilinearScaleOp = new AffineTransformOp(scaleTransform,
AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
return bilinearScaleOp.filter(img, new BufferedImage(targetWidth, targetHeight,
BufferedImage.TYPE_INT_ARGB));
其中calingFactorX/Y是内容应按比例缩放的因子,而target etWidth,resp. target etHeight表示BufferedImage的结果(缩放)维度。
这两种方法都相当慢,这似乎是因为在这两种情况下,每一帧,内容的缩放版本都必须重新计算。我觉得我错过了一些非常明显的东西。
虽然Image()
可以重新取样图像,但每次调用的时候都必须这样做。正如这里所建议的,
AffineTransformOp
允许您选择插值类型;使用满足您画质要求的最快的一个。一旦您满意地重新取样了图像,请确保在特定的Graphics
上下文中渲染时不会无意中重新取样图像。覆盖getPreferredSize()
以使目标组件与重新取样的图像大小相同,如这些示例所示。
我的图像只有32x32,但是有很多(~500)。
考虑使用轻量级模式仅渲染可见图像。JTable
和JList
是示例,如下所述。
使用单独的组件是否有性能优势或其他优势?
您可能需要通过比较代表性示例来确定原型和配置文件:
>
典型的基于组件的例子包括这里引用的基于按钮的游戏,或者这里、这里和这里检查的国际象棋游戏。
这里引用的基于瓦片的游戏说明了一个单一的瓦片面板和多个附件面板,它们都听一个共同的游戏模型。