我一直致力于使用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且没有滞后的情况下渲染这些图形呢?
答案 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);
}
}
为了提高性能,您可以尝试例如: