繁体   English   中英

如何优化 Java 中嵌套的 3D xyz 循环和流向量?

[英]How do I optimize 3D xyz nested for loops in Java and stream Vectors?

我为 Minecraft 编写插件,经常遇到这样的情况:我必须遍历 3 维空间中的每个块,以某种方式处理块。 例如:

for (int x = minX; x <= maxX; x++) {
    for (int y = minY; y <= maxY; y++) {
        for (int z = minZ; z <= maxZ; z++) {
            // Do something
        }
    }
}

这种循环经常发生,这让我感到震惊,也许有更好的方法可以使代码更简洁,但执行起来仍然一样快。 我真正想做的就是遍历 3 维类型中的每个坐标。

Bukkit API 有这样一个类型——一个可以保存 x,y,z 的Vector类。 Vector 类具有返回整数的方法,例如getBlockXgetBlockYgetBlockZ 所以,我正在考虑创建一个这样的实用方法:

Stream<Vector> getXYZStream(minVector, maxVector)

这将返回给定的最小和最大向量之间的所有向量 (x,y,z) 值的流。 那么我可以这样做:

getXYZStream(minVector, maxVector).forEach(v -> doSomething);

在这方面我如何制作矢量流? 如果我可以对这种方法进行编码,那么我将衡量性能差异并查看它是否有意义。

或者有更好的方法吗?

或者我应该接受这些循环是必要的和最好的方法吗?

我找到了一种可以使用自定义迭代器创建流的方法,因此可以这样做:

    public Stream<Vector> get3dStream(Vector minVector, Vector maxVector) {
        Iterator<Vector> it = new CustomIterator(minVector, maxVector);
        return StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, Spliterator.DISTINCT), false);
    }

    class CustomIterator implements Iterator<Vector> { 

        private Vector minVector;
        private Vector maxVector;

        BoundingBox b = new BoundingBox();

        // constructor 
        CustomIterator(Vector minVector, Vector maxVector) { 
            // initialize cursor
            this.minVector = minVector;
            this.maxVector = maxVector.add(new Vector(1,1,1));
        } 

        // Checks if the next element exists 
        @Override
        public boolean hasNext() {
            return !minVector.equals(maxVector);
        } 

        // moves the cursor/iterator to next element
        @Override
        public Vector next() {
            Vector r = minVector;
            increment();
            return r;
        }

        private void increment() {
            // Increment the vector - this takes a lot of code to do
        } 

    } 

但是,如您所见,在自定义迭代器中跟踪next()将需要大量代码,并且与三个 for 循环相比要复杂得多,而且可能更慢。 我同意 kaya3 的评论,它可以隐藏一些循环,但它不会更快,这是 100% 的要求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM