首先我不得不说我是自学java,可能会犯一个最愚蠢的错误......
我在 2d 游戏中绘制位图时遇到 FPS 下降的问题。
我的游戏 map 由 100x100 像素的图 block 组成,每个图 block 都有一些表面图形,并且可能有其他东西(例如树、岩石或其他东西)。
我有两种主要的绘图方法。两者看起来很相似。首先是绘制 map ,其次是 map 上的所有内容(树木等)。
这是一个代码。我限制了此方法中要绘制的内容。
public static void drawMap(Canvas canvas, Player player, ArrayList<MapField> map)
{
int a = player.getShiftX()/Constants.TILE_SIZE;
int b = player.getShiftY()/Constants.TILE_SIZE;
for (int x = a-Constants.VISIBILITY_X; x<=a+Constants.VISIBILITY_X; x++)
{
if (x>=0&&x<=99)
{
for (int y = b-Constants.VISIBILITY_Y; y<=b+Constants.VISIBILITY_Y*2-1; y++)
{
if (y>=0&&y<=99)
{
map.get(x+y*100).update();
map.get(x+y*100).draw(canvas);
}
}
}
}
}
然后我打电话:
public void draw(Canvas canvas)
{
canvas.drawBitmap(Graphics.TILES_BITMAP[tileId], null, rect, p);
}
当我将“视野”限制为每个方向 3 个方 block (绘制大约 60 个图 block )时,FPS 为 60。一旦我摆脱该限制(要绘制整个屏幕 - 大约 250 个图 block ),FPS 就会下降到 27 -30 这使得游戏无法玩。
这是正常行为吗? Java有那么有限吗?
或者只是我在这里犯了一个错误?
完整代码可在此处查看(如果有人愿意检查):
有人告诉我,有了这么多的图形,我应该已经使用一些 OpenGL,并建议我学习 LibGDX 等。但对我来说,纯java更优雅:)
最佳答案
好的,我已经解决了这个问题。但它仅适用于 API26+。
而不仅仅是:
canvas = this.surfaceHolder.lockCanvas();
我已经放了:
canvas = this.surfaceHolder.lockHardwareCanvas();
现在我又拥有 60FPS+ :)
关于java - 关于性能和绘制位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56621300/