Java 中的加速像素阵列渲染

Accelerated pixel array rendering in Java

我一直在开发一款使用 BufferedImage 渲染到屏幕的游戏。 BufferedImage 是从一组十六进制颜色创建的。所以在屏幕上渲染一个矩形可能看起来像这样:

public void renderRectangle (int xl, int yl, int rWidth, int rHeight, int color, double dist) {
    for (int x = xl; x < xl + rWidth; x++) {
        for (int y = yl; y < yl + rHeight; y++) {
            pixels [x + y * WIDTH] = color; //set pixel's color. 
            zBuffer [x + y × WIDTH] = dist; //set pixel's distance from camera.
        }
    }
}

不幸的是,在进行了这些计算之后,尤其是在 3d 中渲染时,它变得非常迟钝。

但是像《毁灭战士》这样的游戏(也不使用 gpu)运行 没问题。
那么如何在没有 opengl 且没有延迟的情况下渲染这些图形呢?

上面的代码本身不会成为你的性能问题。当然,您可以通过某种方式优化矩形的绘制(例如,您需要经常预先计算矩形)但这不会影响性能。

您能否展示您的渲染方法的一些摘录(您是否为渲染的每一帧创建一个新的缓冲图像?--> 那将是您的性能问题)。您还确定问题确实出在渲染上,而不是触发屏幕重绘吗?

就厄运 (1) 而言,还请考虑它是 VGA(仅 320x200 像素)并且具有非常简化的 3d 引擎,该引擎基于对矩形进行简单的矩阵变换。引擎也有很多逻辑来决定世界地图的哪些区域在屏幕上实际可见(而不是在相机后面或隐藏在另一堵墙后面)并且只渲染这些部分。

鉴于您问题中的信息很少,我希望这能为您指明正确的方向。

像你提供的二维方法,能做的不多;只有一点微优化。

public void renderRectangle(int xl, int yl, int rWidth, int rHeight, int color) {
    if (rWidth <= 0 || rHeight <= 0) {
        return;
    }
    int pos = xl + yl * WIDTH;
    for (int i = pos, i2 = pos + rWidth; i != i2; i++) {
        pixels[i] = color;
    }
    int pos2 = pos;
    for (int y = 1; y != rHeight; y++) {
        pos2 += WIDTH;
        System.arraycopy(pixels, pos, pixels, pos2, rWidth);
    }
}

要提高性能,您可以尝试例如:

  • 预先检查所有内容是否在屏幕上实际可见以避免无用的过程
  • 为所有可以预先计算的东西制作查找表(如果你限制颜色,甚至可以为它们做)
  • 还预先计算阴影等内容