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

