【问题标题】:Quickly rotate image section in Java在 Java 中快速旋转图像部分
【发布时间】: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


【解决方案1】:

最终我按照Hovercraft Full Of Eels 的建议做了。我不是该解决方案的最大粉丝,因为它需要大量的内存开销。但最终,它就像一种魅力,甚至让我对图形的控制更加流畅,所以这真的很酷。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多