用Java快速旋转图像部分

时间:2017-07-04 00:44:44

标签: java performance sprite affinetransform

我想旋转,缩放和翻译图像的一部分。例如,我有一个sprite表,其中包含精灵的列和行。我可以将我想要的部分绘制到临时的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);
}

1 个答案:

答案 0 :(得分:0)

最终我做了Hovercraft Full Of Eels提出的建议。我不是解决方案的最大粉丝,因为它需要大量的内存开销。但最终,它的作用就像一个魅力,甚至游戏我更加简化了对图形的控制,所以这真的很酷。