Rework rendering pipeline to make better use of multithreading
Move OpenGL frame to ARGB conversion to processing threads Move video exporting to processing threads Skip creation of BufferedImage and instead use ByteBuffer with ARGB content directly
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
package eu.crushedpixel.replaymod.utils;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import org.lwjgl.BufferUtils;
|
||||
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class ByteBufferPool {
|
||||
private static Map<Integer, List<SoftReference<ByteBuffer>>> bufferPool = Maps.newHashMap();
|
||||
|
||||
public static synchronized ByteBuffer allocate(int size) {
|
||||
List<SoftReference<ByteBuffer>> available = bufferPool.get(size);
|
||||
if (available != null) {
|
||||
Iterator<SoftReference<ByteBuffer>> iter = available.iterator();
|
||||
try {
|
||||
while (iter.hasNext()) {
|
||||
SoftReference<ByteBuffer> reference = iter.next();
|
||||
ByteBuffer buffer = reference.get();
|
||||
iter.remove();
|
||||
if (buffer != null) {
|
||||
return buffer;
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
if (!iter.hasNext()) {
|
||||
bufferPool.remove(size);
|
||||
}
|
||||
}
|
||||
}
|
||||
return BufferUtils.createByteBuffer(size);
|
||||
}
|
||||
|
||||
public static synchronized void release(ByteBuffer buffer) {
|
||||
buffer.clear();
|
||||
int size = buffer.capacity();
|
||||
List<SoftReference<ByteBuffer>> available = bufferPool.get(size);
|
||||
if (available == null) {
|
||||
available = new LinkedList<SoftReference<ByteBuffer>>();
|
||||
bufferPool.put(size, available);
|
||||
}
|
||||
available.add(new SoftReference<ByteBuffer>(buffer));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user