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循环都会重复这个逻辑:
- 新建
cameraPosition实例 - 第一次调用
generateChunk后,修改原实例的数值 - 第二次调用
generateChunk传入修改后的实例 - 由于每次循环都会生成新的
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
相关产品推荐
相关产品推荐

