Рендеринг секции BufferedImage в прямоугольнике - PullRequest
0 голосов
/ 26 марта 2020

В настоящее время я пытаюсь нарисовать только часть BufferedImage, которая находится в пределах прямоугольника на лету. Изображение перемещается, и поэтому размер изображения в прямоугольнике изменяется.

Визуальное изображение:

enter image description here

В настоящее время это это то, что у меня есть, и оно прекрасно работает с изображением в низком разрешении. Но если я масштабирую миникарту вверх, это становится очень неэффективным и вызывает лаг

private BufferedImage extractPixels() {
    int[] imagePixels = new int[scaledImage.getWidth() * scaledImage.getHeight()];
    scaledImage.getRGB(0, 0, scaledImage.getWidth(), scaledImage.getHeight(), imagePixels,
            0, scaledImage.getWidth());
    int maxX = 0, maxY = 0;
    boolean first = false;
    for (int y = 0; y < scaledImage.getHeight(); y++) {
        for (int x = 0; x < scaledImage.getWidth(); x++) {
            int px = (int)(this.x + x);
            int py = (int)(this.y + y);
            if (viewingArea.contains(px, py)) {
                if (x > maxX) maxX = x;
                if (y > maxY) maxY = y;
                if (!first) {
                    imageX = x;
                    imageY = y;
                    first = true;
                }
            }
        }
    }
    int xCount = maxX - imageX;
    int yCount = maxY - imageY;
    if (imageX < 0 || imageX > scaledImage.getWidth() || imageX + xCount > scaledImage.getWidth()) return null;
    if (imageY < 0 || imageY > scaledImage.getHeight() || imageY + yCount > scaledImage.getHeight()) return null;
    return scaledImage.getSubimage(imageX, imageY, xCount, yCount);
}

В Render l oop:

public void Render(PixelRenderer renderer) {
    BufferedImage image = extractPixels();
    if (image != null) renderer.renderImage(image, x + imageX, y + imageY);
}

Есть ли способ сделать это более эффективно, чтобы повторное масштабирование оказало меньшее влияние на производительность?

1 Ответ

0 голосов
/ 26 марта 2020

Исправлено вычислением того, откуда должно быть изображение, и размер изображения, зависящий от положения основного изображения.

private BufferedImage extractPixels() {
    double xp = viewingArea.x - this.x;
    double yp = viewingArea.y - this.y;
    double iw = viewingArea.width;
    double ih = viewingArea.height;

    int rightBound = scaledImage.getWidth() - viewingArea.width;
    int bottomBound = scaledImage.getHeight() - viewingArea.height;

    if (xp < 0) {
        xp = 0;
        iw = viewingArea.width - (this.x - viewingArea.x);
        imageX = viewingArea.x + (viewingArea.width - (int)iw);
    } else if (xp >= 0 && xp < rightBound) {
        xp -= dx;
        iw -= dx;
        imageX = viewingArea.x;
    }
    if (xp >= rightBound) {
        iw = viewingArea.width - ((int)xp - (scaledImage.getWidth() - viewingArea.width));
        imageX = viewingArea.x;
    }

    if (yp < 0) {
        yp = 0;
        ih = viewingArea.height - (this.y - viewingArea.y);
        imageY = viewingArea.x + (viewingArea.height - (int)ih);
    } else if (yp >= 0 && yp < bottomBound) {
        yp -= dy;
        ih -= dy;
        imageY = viewingArea.y;
    }
    if (yp >= bottomBound) {
        ih = viewingArea.height - ((int)yp - (scaledImage.getHeight() - viewingArea.height));
        imageY = viewingArea.y;
    }

    if (iw < 0) iw = Math.abs(iw);
    if (ih < 0) ih = Math.abs(ih);
    if (xp < 0) xp = Math.abs(xp);
    if (yp < 0) yp = Math.abs(yp);

    BufferedImage result = new BufferedImage((int)iw, (int)ih, BufferedImage.TYPE_INT_RGB);

    try {
        result = scaledImage.getSubimage((int)xp, (int)yp, (int)iw, (int)ih);
    } catch (Exception e) {
        //TODO: Log to game engine something bad has happened
        e.printStackTrace();
    }

    return result;
}
...