Java 如何在没有内存分配的情况下迭代ArrayBlockingQueue(GC延迟)
我正在开发一款Android Java游戏,并试图最小化游戏循环中的内存分配。每个帧上的每个游戏对象都会绘制其项目,这些项目存储在ArrayBlockingQueue中。每个ForEach循环都会为迭代器分配少量内存,并且在大范围内(每秒60次,数千个对象和项目),它会导致0.1-0.2秒的GC延迟,影响FPS: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
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、 你能解释一下为什么你否决了我的问题吗?)