一开始我不得不说我自己学习Java,并且可能犯过最愚蠢的错误...
在2D游戏中绘制位图时,我面临FPS下降的问题。
我的游戏地图由100x100像素的图块组成,每个图块都有一些表面图形,并且可能还有其他内容(例如树,岩石或其他东西)。
我有2种主要的绘画方法。两者看起来相似。首先是绘制地图,其次是上面的所有内容(树木等)。
这是代码。我限制了用这种方法绘制的内容。
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个正方形(绘制约60个图块)时,FPS为60。一旦我摆脱了该限制(将绘制整个屏幕-约250个图块),FPS就会降至27 -30使得游戏无法进行。
这是正常行为吗? Java受到限制吗?
或者只是我在这里犯了一个错误?
此处显示完整代码(如果有人愿意检查的话):
有人告诉我,使用这么多的图形,我应该已经使用了OpenGL,并建议我学习LibGDX。但对我而言,纯Java更优雅:)
答案 0 :(得分:0)
好的,我已经设法解决了这个问题。不过,仅适用于API26 +。
不只是:
canvas = this.surfaceHolder.lockCanvas();
我放了:
canvas = this.surfaceHolder.lockHardwareCanvas();
现在我又有60FPS +:)