【发布时间】:2017-07-11 06:05:55
【问题描述】:
我想旋转、缩放和平移图像的一部分。例如,我有一个包含精灵列和行的精灵表。我可以将我想要的部分绘制到一个临时的 BufferedImage 上,然后将该临时图像转换到主图形上,但这是一个非常慢的操作。
我怎样才能使这个速度更快?它需要每秒发生超过 100 * 60 次。
public void Draw_WorldSpace(Graphics2D g, double x, double y, double angle, double deltaTime) {
// setup portion of image to transform
BufferedImage tempImage = new BufferedImage(sourceRectangle.width, sourceRectangle.height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = tempImage.createGraphics();
g2.drawImage(image, 0, 0, sourceRectangle.width, sourceRectangle.height, sourceRectangle.x, sourceRectangle.y, sourceRectangle.width, sourceRectangle.height, null);
g2.dispose();
// setup a transformation object
AffineTransform transform = new AffineTransform();
// match view rotation
transform.translate(GameLogic.viewPort.GetCanvasCenter().x, GameLogic.viewPort.GetCanvasCenter().y);
transform.rotate(Math.toRadians(GameLogic.viewPort.GetAngle()));
transform.translate(-GameLogic.viewPort.GetCanvasCenter().x, -GameLogic.viewPort.GetCanvasCenter().y);
// set to position
transform.translate(x - GameLogic.viewPort.GetViewPortCenter().x + GameLogic.viewPort.GetCanvasCenter().x, y - GameLogic.viewPort.GetViewPortCenter().y + GameLogic.viewPort.GetCanvasCenter().y);
// rotate
transform.rotate(Math.toRadians(angle));
// center on sprite
transform.translate(-sourceRectangle.width / 2, -sourceRectangle.height() / 2);
// draw the sprite
g.drawImage(tempImage, transform, null);
}
【问题讨论】:
-
提前做并将旋转的精灵存储在
List<Image>中。 -
可以直接在“主”
Graphics上进行翻译,而不是在子图像上进行吗? -
超过 6 kHz 需要发生什么?
-
@trashgod 屏幕上可能有 100 多个精灵以 60fps
-
您可能还想看看其他一些
Graphics#drawImage方法,它们允许您绘制图像的不同部分 - 这可能会减少对临时图像的需求
标签: java performance sprite affinetransform