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

Libgdx地形生成问题:generateChunk重复添加同一Vector2向量

Libgdx地形生成重复添加Chunk的问题排查与修复

问题根源

你遇到的问题核心在于Libgdx的Vector2.sub()方法是原地修改实例,而非返回新的Vector2对象:

generateChunk(cameraPosition);
generateChunk(cameraPosition.sub(1,1)); // 这里会直接修改原cameraPosition的数值

执行cameraPosition.sub(1,1)时,原cameraPosition的x和y会被直接减1,然后把这个修改后的实例传入第二次generateChunk调用。每次render循环都会重复这个逻辑:

  1. 新建cameraPosition实例
  2. 第一次调用generateChunk后,修改原实例的数值
  3. 第二次调用generateChunk传入修改后的实例
  4. 由于每次循环都会生成新的Vector2实例,即使数值相同,ArrayList.contains()(依赖Vector2的equals比较数值)可能因为循环中坐标计算的问题,导致重复判断为“未存在”,从而持续添加相同数值的向量。

修复方案

将第二次调用改为基于原cameraPosition创建新的Vector2实例后再做减法操作,避免修改原对象:

Vector2 cameraPosition = new Vector2(MathUtils.round(camera.position.x/Project5.chunkSize/64), MathUtils.round(camera.position.y/Project5.chunkSize/64));
generateChunk(cameraPosition);
generateChunk(new Vector2(cameraPosition).sub(1, 1)); // 创建新实例再修改

或者使用Vector2.cpy()方法复制原实例,再做减法:

generateChunk(cameraPosition.cpy().sub(1, 1));

额外优化建议

  • 可以将generatedChunks的类型从ArrayList<Vector2>改为HashSet<Vector2>,Vector2已重写hashCode和equals,这样判断元素是否存在的效率会更高(O(1) 对比 O(n))。
  • 注意render方法会被高频调用,频繁创建Vector2实例可能带来微小性能开销,可复用一个临时Vector2对象减少GC:
    // 在类中定义临时变量
    private Vector2 tempChunkPos = new Vector2();
    
    // 在render中使用
    tempChunkPos.set(cameraPosition).sub(1,1);
    generateChunk(tempChunkPos);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 14:30:23