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);
}
}
要提高性能,您可以尝试例如:
- 预先检查所有内容是否在屏幕上实际可见以避免无用的过程
- 为所有可以预先计算的东西制作查找表(如果你限制颜色,甚至可以为它们做)
- 还预先计算阴影等内容
我一直在开发一款使用 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);
}
}
要提高性能,您可以尝试例如:
- 预先检查所有内容是否在屏幕上实际可见以避免无用的过程
- 为所有可以预先计算的东西制作查找表(如果你限制颜色,甚至可以为它们做)
- 还预先计算阴影等内容