Home Reference Source

viewer/buffersetpool.js

/**
 * Keeps track of a collections of buffersets that can be reused. The main reason is that we don't have to allocate new memory for each new bufferset
 */
export class BufferSetPool {
	constructor(maxPoolSize, stats) {
		this.maxPoolSize = maxPoolSize;
		this.stats = stats;
		
		this.currentPoolSize = 0;
		
		this.available = new Set();
		this.used = new Set();
		
		window.buffersetpool = this;
	}
	
	lease(bufferManager, hasTransparency, color, sizes) {
		if (this.currentPoolSize >= this.maxPoolSize) {
			throw "Maximum pool size exceeded";
		}
		
		if (this.available.size > 0) {
			var bufferSet = this.available.keys().next().value;
			this.used.add(bufferSet);
			this.available.delete(bufferSet);
			this.stats.setParameter("BufferSet pool", "Used", this.used.size);
			this.stats.setParameter("BufferSet pool", "Available", this.available.size);
			this.stats.setParameter("BufferSet pool", "Total memory", this.currentPoolSize * bufferManager.getDefaultByteSize());
			
			return bufferSet;
		}
		var newBufferSet = bufferManager.createBufferSet(hasTransparency, color, sizes);
		this.currentPoolSize++;
		this.used.add(newBufferSet);
		this.stats.setParameter("BufferSet pool", "Used", this.used.size);
		this.stats.setParameter("BufferSet pool", "Available", this.available.size);
		this.stats.setParameter("BufferSet pool", "Total memory", this.currentPoolSize * bufferManager.getDefaultByteSize());
		return newBufferSet;
	}
	
	release(bufferSet) {
		this.used.delete(bufferSet);
		this.available.add(bufferSet);
		
		this.stats.setParameter("BufferSet pool", "Used", this.used.size);
		this.stats.setParameter("BufferSet pool", "Available", this.available.size);
		
		bufferSet.positionsIndex = 0;
		bufferSet.normalsIndex = 0;
		bufferSet.indicesIndex = 0;
		bufferSet.nrIndices = 0;
		bufferSet.colorsIndex = 0;
	}
	
	cleanup() {
		this.available.clear();
		this.used.clear();
		this.currentPoolSize = 0;
		this.stats.setParameter("BufferSet pool", "Used", this.used.size);
		this.stats.setParameter("BufferSet pool", "Available", this.available.size);
		this.stats.setParameter("BufferSet pool", "Total memory", 0);
	}
}