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

将Java.awt.Polygon转为LibGDX多边形时触发数组越界异常

问题分析与解决方案

问题根源

你遇到的IndexOutOfBoundsException是因为LibGDX的ShapeRenderer默认渲染缓冲区容量有限。默认情况下,ImmediateModeRenderer20(ShapeRenderer底层渲染器)的顶点缓冲区上限为10000个顶点(对应float数组长度20000),当传入4370个顶点的多边形时,渲染过程中生成的三角剖分数据会超出缓冲区容量,触发越界访问。

转换代码验证

你的Java.awt.Polygon转float数组的逻辑是正确的,无需修改:

int[] xpoints = p.getPolygon().xpoints;
int[] ypoints = p.getPolygon().ypoints;
float[] verticesArray = new float[p.getPolygon().npoints * 2];

for (int i = 0; i < p.getPolygon().npoints; i++) {
    verticesArray[i * 2] = xpoints[i];
    verticesArray[i * 2 + 1] = ypoints[i];
}

解决方案:扩大ShapeRenderer的缓冲区容量

方法1:旧版LibGDX(基于ImmediateModeRenderer20)

初始化ShapeRenderer时,手动创建缓冲区更大的ImmediateModeRenderer20实例传入:

// 设置最大顶点数为10000(对应20000个float元素),索引数设为顶点数的3倍(满足三角剖分需求)
ImmediateModeRenderer20 customRenderer = new ImmediateModeRenderer20(false, true, 10000, 30000);
ShapeRenderer shapeRenderer = new ShapeRenderer(customRenderer);

可根据实际需求调整maxVertices和maxIndices,比如要支持5000个顶点,就将maxVertices设为5000,maxIndices设为15000。

方法2:新版LibGDX(基于ShapeRendererConfig)

新版本推荐用ShapeRendererConfig配置参数:

ShapeRenderer.ShapeRendererConfig config = new ShapeRenderer.ShapeRendererConfig();
config.maxVertices = 10000;
config.maxIndices = 30000;
ShapeRenderer shapeRenderer = new ShapeRenderer(config);

额外注意事项

  • 若多边形存在大量重复或无效顶点,可先做去重清理,减少顶点数量降低缓冲区压力。
  • 若单个多边形顶点数极大,也可拆分为多个小多边形分别绘制,但调整缓冲区大小是更直接的解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 02:33:23