Java 如何加快我的游戏fps?

Java 如何加快我的游戏fps?,java,performance,Java,Performance,我有我的游戏,在每个渲染循环中,循环通过我的贴图(128x128)中的所有块,正如你可能知道的,这会导致很多延迟。当我第一次制作它时,我必须让它只渲染屏幕上的块,否则它会立即崩溃。现在,我只在屏幕上渲染块,但仍然循环所有块以查看它们是否在屏幕上,这使我的fps大约为2 for (int y = 0; y < 128; y++) { for (int x = 0; x < 128; x++) { Block b = LevelGen.ge

我有我的游戏,在每个渲染循环中,循环通过我的贴图(128x128)中的所有块,正如你可能知道的,这会导致很多延迟。当我第一次制作它时,我必须让它只渲染屏幕上的块,否则它会立即崩溃。现在,我只在屏幕上渲染块,但仍然循环所有块以查看它们是否在屏幕上,这使我的fps大约为2

    for (int y = 0; y < 128; y++) {
        for (int x = 0; x < 128; x++) {
            Block b = LevelGen.getBlockAt(x, y);
            if (Forgotten.isInsideGameWindow(x * 30, y * 30)) {
                arg1.drawImage(b.getTexture(), x * 30, y * 30);
            }
        }
    }
for(int y=0;y<128;y++){
对于(int x=0;x<128;x++){
块b=LevelGen.getBlockAt(x,y);
if(遗忘的isInsideGameWindow(x*30,y*30)){
arg1.drawImage(b.getTexture(),x*30,y*30);
}
}
}

有没有一种方法可以使它不在所有的循环中循环

您可以在代码块中插入一个中断。。但是我看不出这段代码的目的是看16、32或256遍…

您可以在代码块中插入一个中断。。但是我看不出这段代码的目的是看16、32或256次…

好吧,你可以把所有的块放在一个数组中,在块对象中包含坐标,然后用它们来画块。然后,您只需循环浏览屏幕上显示的块。只有在屏幕上没有那么多块的情况下才有用。

好吧,你可以将所有块放在一个数组中,在块对象中包含坐标,然后使用这些坐标来绘制块。然后,您只需循环浏览屏幕上显示的块。只有当屏幕上没有那么多块时才有用。

计算显示窗口的大小,只迭代其中的块

final int tile_size = 30;

final RectangleType displayWindow = Forgotten.getDisplayWindow ();

final int left = displayWindow.getLeft () / tile_size - 1;
final int right = displayWindow.getRight () / tile_size + 1;
final int top = displayWindow.getTop () / tile_size - 1;
final int bottom = displayWindow.getBottom () / tile_size + 1;

for (int y = top; y < bottom; ++y)
   for (int x = left; x < right; ++x)
       canvas.drawImage (LevelGen.getBlockAt (x,y).getTexture (),
                         x * tile_size, y * tile_size);

然后使用脏矩形代替正常绘制的
displayWindow
,您可以测试
是否(null==getdirtylectangle())返回
如果没有任何更改,则完全跳过绘图。

计算显示窗口的大小,只迭代其中的块

final int tile_size = 30;

final RectangleType displayWindow = Forgotten.getDisplayWindow ();

final int left = displayWindow.getLeft () / tile_size - 1;
final int right = displayWindow.getRight () / tile_size + 1;
final int top = displayWindow.getTop () / tile_size - 1;
final int bottom = displayWindow.getBottom () / tile_size + 1;

for (int y = top; y < bottom; ++y)
   for (int x = left; x < right; ++x)
       canvas.drawImage (LevelGen.getBlockAt (x,y).getTexture (),
                         x * tile_size, y * tile_size);

然后使用脏矩形代替正常绘制的
displayWindow
,您可以测试
是否(null==getdirtylectangle())返回如果没有更改,则完全跳过绘图。

纹理/图像是否已预加载?或者每次绘制图像时,您都在加载图像吗?
遗忘的
如何知道您提供的坐标是否“在游戏窗口内?”(例如,
遗忘的.isInsideGameWindow
做什么?)如果它比较您提供给其他人的
x
y
,您将如何知道,然后,你不是只在另一个
x
y
处绘制图像,并完全避免循环吗?你能滚动原始图形,只需重新绘制边缘吗?纹理/图像是否已预加载?或者每次绘制图像时,您都在加载图像吗?
遗忘的
如何知道您提供的坐标是否“在游戏窗口内?”(例如,
遗忘的.isInsideGameWindow
做什么?)如果它比较您提供给其他人的
x
y
,您将如何知道,然后,你就可以在另一个
x
y
处绘制图像,完全避免循环了吗?你可以滚动原始图形,只需重新绘制边缘吗?你可以预先确定哪些块将出现在屏幕上,然后使for循环相应地开始和停止。你可以预先确定哪些块将出现在屏幕上然后使for循环相应地开始和停止。顺便说一句,你可以增加x+=平铺大小和y+=平铺大小,而不是x++或y++你不能,因为x和y使用平铺作为单位,而平铺大小最可能使用像素?你可以用像素来计算整个坐标,但是你必须用除法来获得块的分片坐标;然而,如果担心最后的整数乘以一个
的话,混合方法可能是最好的
for(int y=top,yPixel=top*tile\u size;y
这并不是很重要,但请记住乘法通常比加法慢得多,但是除法通常比乘法慢…我假设绘制一个平铺的成本是这两种方法的很多倍:-)顺便说一句,你可以增加x+=平铺大小和y+=平铺大小,而不是x++或y++你不能,因为x和y使用平铺作为单位,而平铺大小很可能使用像素?你可以用像素来计算整个坐标,但是你必须用除法来获得块的分片坐标;然而,如果担心最后的整数乘以一个
的话,混合方法可能是最好的
for(int y=top,yPixel=top*tile\u size;y
这并不是很重要,但请记住乘法通常比加法慢得多,但是除法通常比乘法慢……我想画一块瓷砖的成本是这两者的很多倍:-)