LibGDX加载GIF动画时抛出IllegalArgumentException异常求助
LibGDX加载GIF动画时抛出IllegalArgumentException异常求助
嘿,碰到这个问题别慌,咱们一步步来拆解分析~
先把你遇到的错误栈贴出来,方便定位问题:
Error: java.lang.IllegalArgumentException: capacity < 0: (-1611268096 < 0) at java.base/java.nio.Buffer.createCapacityException(Buffer.java:279) at java.base/java.nio.Buffer.<init>(Buffer.java:242) at java.base/java.nio.ByteBuffer.<init>(ByteBuffer.java:288) at java.base/java.nio.ByteBuffer.<init>(ByteBuffer.java:296) at java.base/java.nio.MappedByteBuffer.<init>(MappedByteBuffer.java:112) at java.base/java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:170) at com.badlogic.gdx.graphics.g2d.Gdx2DPixmap.newPixmap(Native Method) at com.badlogic.gdx.graphics.g2d.Gdx2DPixmap.<init>(Gdx2DPixmap.java:137) at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:137) at com.tds.game.GifDecoder.getAnimation(GifDecoder.java:697) at com.tds.game.GifDecoder.loadGIFAnimation(GifDecoder.java:731) at com.tds.game.AfterBossScreen.show(AfterBossScreen.java:26) at com.badlogic.gdx.Game.setScre...
从错误信息和栈跟踪来看,核心问题是加载GIF时,底层计算Pixmap的缓冲区容量得到了一个负数,这明显不符合逻辑,大概率是这几个原因导致的:
- GIF文件本身异常:比如文件损坏、导出时格式不规范,或者帧的宽高数值异常超大,导致宽高相乘时int类型溢出变成负数。这种情况在网上下载的GIF或者导出出错的文件里很常见。
- 自定义GifDecoder的逻辑bug:你用的是项目内的
com.tds.game.GifDecoder,可能在解析GIF帧尺寸、计算缓冲区容量时没做溢出防护,导致数值异常。 - 文件加载路径错误:如果加载的文件不存在、路径拼写错误,或者读取到空数据流,也可能触发这类解析异常。
给你几个按优先级排序的解决思路:
- 替换测试GIF文件:找一个确定没问题的简单GIF(比如小尺寸的循环动画),替换当前加载的文件,看看是否还报错。如果问题消失,那就是原GIF的问题,用PS、GIMP这类软件重新导出修复即可。
- 检查文件加载路径:确认
AfterBossScreen.java第26行里的GIF加载路径是否正确,文件是否确实放在assets目录对应位置,有没有大小写或者路径分隔符的错误。 - 排查GifDecoder的容量计算逻辑:如果是自己实现的GifDecoder,去看
getAnimation方法(第697行)里的容量计算代码,把宽高先转成long类型计算,再判断结果是否在int的合理范围(0到2^31-1)内,避免溢出。 - 换用成熟的GIF加载方案:如果自定义Decoder问题较多,可以试试LibGDX社区常用的稳定GIF加载库,避免自己造轮子踩坑。
备注:内容来源于stack exchange,提问作者Prostoblodi
相关产品推荐
相关产品推荐

