Java中的加速像素阵列渲染

时间:2015-04-08 18:20:41

标签: java arrays rendering bufferedimage pixels

我一直致力于使用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且没有滞后的情况下渲染这些图形呢?

2 个答案:

答案 0 :(得分:1)

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

你可能会展示你的渲染方法的一些摘录(你为每个渲染帧创建一个新的缓冲图像吗? - &gt;那将是你的性能问题)。你也确定问题是真的与渲染有关,而不是触发屏幕的重绘吗?

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

鉴于您提出的信息很少,我希望这会引导您朝着正确的方向前进。

答案 1 :(得分:1)

对于像你提供的2D方法,可以做的不多;只有一点微观优化。

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);
    }
}

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

  • 预先检查屏幕上是否实际显示所有内容以避免无用的过程
  • 为可以预先计算的所有内容创建查找表(如果限制颜色,甚至可以为它们完成)
  • 还预先计算着色等内容