Java 如何在没有内存分配的情况下迭代ArrayBlockingQueue(GC延迟)

Java 如何在没有内存分配的情况下迭代ArrayBlockingQueue(GC延迟),java,android,Java,Android,我正在开发一款Android Java游戏,并试图最小化游戏循环中的内存分配。每个帧上的每个游戏对象都会绘制其项目,这些项目存储在ArrayBlockingQueue中。每个ForEach循环都会为迭代器分配少量内存,并且在大范围内(每秒60次,数千个对象和项目),它会导致0.1-0.2秒的GC延迟,影响FPS: ArrayBlockingQueue<Item> outputQueue = conveyor.getOutputQueue(); for (Item item

我正在开发一款Android Java游戏,并试图最小化游戏循环中的内存分配。每个帧上的每个游戏对象都会绘制其项目,这些项目存储在ArrayBlockingQueue中。每个ForEach循环都会为迭代器分配少量内存,并且在大范围内(每秒60次,数千个对象和项目),它会导致0.1-0.2秒的GC延迟,影响FPS:

 ArrayBlockingQueue<Item> outputQueue = conveyor.getOutputQueue();

    for (Item item:outputQueue) {
        progress = 1.0f - (finishedCounter * stridePerItem);
        drawItem (camera, x, y, width, height, item, progress);
        finishedCounter++;
    }
ArrayBlockingQueue outputQueue=converter.getOutputQueue();
用于(项目:outputQueue){
进度=1.0f-(完成的计数器*;
drawItem(相机、x、y、宽度、高度、项目、进度);
finishedCounter++;
}
我所需要的只是访问ArrayBlockingQueue中的所有条目,而不进行更改。使用
ArrayBlockQueue.toArray()
方法复制队列并分配额外内存

如何在没有内存分配(GC延迟)的情况下迭代ArrayBlockingQueue

p、 该游戏模拟工厂供应链——排队。它们都是从两个线程(OpenGL线程、GameLoop线程)访问的,我需要线程安全队列。我是否应该使用其他类型的队列或特殊集合,这些队列或集合可以从不同的线程同时访问


如果使用Java 8或更高版本,则可以使用以进行迭代

如果查看,您可以很容易地看到,
forEach
没有为此分配
迭代器

ArrayBlockingQueue outputQueue=converter.getOutputQueue();
outputQueue.forEach(项目->{
//你的代码
});
Queue
ArrayBlockingQueue
在不使用
迭代器或将其转换为数组/其他集合的情况下,不提供迭代方法。这似乎是在不分配额外对象的情况下迭代
ArrayBlockingQueue
的唯一方法

这种方法的缺点是无法访问非最终或有效最终的局部变量。如果要读取在别处更改的局部变量,则需要创建存储变量的对象或使用副本

如果需要在迭代器中更改变量,也可以包装变量

public类IntWrapper{//在方法之外
私有int值;
//getter/setter/constructor
}
ArrayBlockingQueue outputQueue=输送机.getOutputQueue();
最终IntWrapper FinishedCounterRapper=新IntWrapper(finishedCounter);
outputQueue.forEach(项目->{
进度=1.0f-(完成的计数器*;
drawItem(相机、x、y、宽度、高度、项目、进度);
finishedCounterRapper.setValue(finishedCounterRapper.getValue());
});
finishedCounter=finishedCounterRapper.getValue();

但是,这会为
IntWrapper
分配堆空间,即使您可以重用包装器。

内存分配不一定意味着GC延迟。此循环每秒调用60次,有数百个对象包含大量项。查看探查器屏幕截图。显示所有GC调用和分配的对象-其中大多数是ArrayBlockingList迭代器。是否确实需要
ArrayBlockingQueue
,然后?游戏模拟工厂供应链-队列。它们都是从两个线程(OpenGL线程、GameLoop线程)访问的,我需要线程安全队列。我是否应该使用任何其他类型的队列或特殊集合,这些队列或集合可以从不同的线程同时访问?p、 你能解释一下为什么你否决了我的问题吗?)