You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LibGDX安卓端左上角绘制FPS计数器崩溃问题排查

解决LibGDX添加FPS计数器崩溃&坐标系疑问

嘿,我来帮你一步步排查问题!你遇到的崩溃和坐标显示问题,其实都是LibGDX新手常踩的坑,咱们拆开来解决:

一、先搞定崩溃问题

你已经把绘制代码放在batch.begin()和batch.end()之间,那大概率是这几个细节没做好:

1. Android端BitmapFont的初始化坑

直接用new BitmapFont()在桌面端能正常运行,但Android系统不一定自带LibGDX默认依赖的字体,这会导致字体加载失败直接崩溃。解决方法很简单:

  • 把LibGDX自带的字体文件(arial.fnt和对应的arial.png)复制到你的项目assets文件夹里
  • 初始化font的时候改成:
font = new BitmapFont(Gdx.files.internal("arial.fnt"));

用自带的字体文件,就不会依赖系统字体了。

2. 相机投影矩阵没同步到Batch

如果你的游戏用了OrthographicCamera,一定要记得在绘制前把相机的投影矩阵同步给Batch,不然绘制坐标会和相机视口不匹配,可能导致渲染错误甚至崩溃。在render()方法里更新相机后,要加这行代码:

batch.setProjectionMatrix(camera.combined);

然后再调用batch.begin()开始绘制。

3. 别忘了释放资源(好习惯提前养)

虽然刚启动崩溃大概率不是这个问题,但还是要记得在dispose()方法里释放font和batch,避免内存泄漏:

@Override
public void dispose() {
    batch.dispose();
    font.dispose();
}

二、坐标系的误解:你猜对了一半,但有细节要注意

LibGDX的默认屏幕坐标系确实是左下角为(0,0),右上角对应(屏幕宽度, 屏幕高度),所以你想把FPS放左上角,x设0的思路是对的,但y=480有个容易忽略的坑:

font.draw()方法里的y参数是文本基线的坐标,不是文本顶部的坐标。如果直接设y=480(你的相机高度),文本的顶部会超出屏幕,你根本看不到。正确的做法是把y设为屏幕高度减去字体的顶部高度,比如:

float textY = Gdx.graphics.getHeight() - font.getCapHeight();

font.getCapHeight()会返回字体大写字母的高度,这样设置能保证整个文本都显示在屏幕内。另外x设0的话文本会贴在左边缘,加个10像素的边距会更美观~

三、整合后的完整render()示例

把这些点结合起来,你的render方法应该是这样的:

@Override
public void render(float delta) {
    // 清屏
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    // 更新相机逻辑(比如跟随玩家)
    camera.update();

    // 同步相机矩阵到Batch
    batch.setProjectionMatrix(camera.combined);

    // 开始绘制
    batch.begin();
    // 先绘制你的游戏元素(玩家、敌人等)
    // ...
    // 再绘制FPS计数器
    int fps = Gdx.graphics.getFramesPerSecond();
    font.draw(batch, "FPS: " + fps, 10, Gdx.graphics.getHeight() - font.getCapHeight());
    batch.end();
}

先试试替换BitmapFont的初始化方式,应该就能解决崩溃问题,然后调整坐标就能看到左上角的FPS计数器啦~

内容的提问来源于stack exchange,提问作者PoLLeN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:32:34