libGDX中Label无法正确缩放到0.07f 开启非整数坐标出现重影
libGDX Label缩放渲染异常、出现多余残缺文字修复方案
问题现象
- 向winStage添加用于显示
"YOU WIN"的Label组件时渲染异常:存在文字缺字问题,字体缩放比例低于0.044f时整段文本完全消失 - 增加
font.setUseIntegerPositions(false)配置后,目标文本可正常显示,但会额外渲染出内容为"YUW N"的错误残缺标签 - 问题复现代码(Kotlin):
private val winViewport = StretchViewport(mainStage.width, mainStage.height) val winStage = Stage(winViewport, winBatch) var font = BitmapFont() var labelStyle = Label.LabelStyle() labelStyle.font = font labelStyle.fontColor = Color.RED var label2 = Label("YOU WIN", labelStyle) label2.setBounds(0f, winStage.height*2/3, winStage.width*1, winStage.height/6) label2.setFontScale(0.07F) // 0.07f font.setUseIntegerPositions(false) label2.setWrap(false) winStage.addActor(label2) winStage.act(delta) winStage.draw()
问题原因
你看到的"YUW N"不是额外生成的标签组件,是配置顺序错误导致的字体缓存叠加绘制:
- libGDX默认BitmapFont开启整数位置对齐,在0.07f这种极端缩放下,每个字形的绘制坐标会被强制取整到整数像素,字符间距完全错乱,就会出现缺字、小缩放下文本消失的问题
- 你是先创建Label、设置完缩放参数,再修改Font的
useIntegerPositions配置,Label初始化时已经基于旧的字体配置生成了渲染缓存,后续直接修改Font属性不会自动触发Label的缓存刷新,最终旧缓存的错位字形片段和新配置下的正确文本被同时绘制,就出现了多余的残缺文字。
修复方法
方法1:调整配置顺序,清空残留缓存(最小改动)
把所有字体、Label的配置操作移到addActor之前,配置完成后主动清空字体缓存、触发Label重算,修改后核心代码如下:
private val winViewport = StretchViewport(mainStage.width, mainStage.height) val winStage = Stage(winViewport, winBatch) var font = BitmapFont() // 字体配置提前到Label创建前 font.setUseIntegerPositions(false) font.data.setScale(0.07f) // 直接给font data设缩放,比Label单独setFontScale缓存更稳定 var labelStyle = Label.LabelStyle() labelStyle.font = font labelStyle.fontColor = Color.RED var label2 = Label("YOU WIN", labelStyle) label2.setBounds(0f, winStage.height*2/3, winStage.width*1, winStage.height/6) label2.setWrap(false) // 清空旧缓存,触发重绘 font.cache.clear() label2.invalidate() // 所有配置完成后再添加到Stage winStage.addActor(label2) winStage.act(delta) winStage.draw()
方法2:生成匹配尺寸的字体(推荐,渲染效果更好)
libGDX内置的默认BitmapFont是15号字号,缩放到0.07f等效字号不到1号,本身就容易出现渲染异常。可以用FreeTypeFontGenerator直接生成你需要的实际显示尺寸的字体,不需要做极端缩放,从根源上避免像素对齐、缓存错位问题,字体显示清晰度也更高。
注意:所有UI组件的属性配置尽量在添加到Stage之前完成,组件加入Stage后如果修改了关联的Style、Font等共享资源,必须主动调用
invalidate()触发缓存重算,否则很容易出现渲染残留、状态不同步的问题。
内容的提问来源于stack exchange,提问作者Winni Zhang
相关产品推荐
相关产品推荐

