entityのdestroyでは、assetが残り続けてしまっているためVRAMを消費し続けメモリリークを起こします。
unloadをすることでメモリの消費量を減らすことができます。
const LoadGlb = pc.createScript('loadGlb');
LoadGlb.attributes.add('file', {
type: 'asset'
});
LoadGlb.attributes.add("count", {
type: "number",
defualt: 10
});
LoadGlb.attributes.add("interval", {
type: "number",
default: 2000
});
LoadGlb.prototype.update = function(){
const info = performance.memory.jsHeapSizeLimit / performance.memory.usedJSHeapSize;
console.log(`${info}%`);
};
LoadGlb.prototype.initialize = function() {
setInterval(() => {
const entities = this.app.root.findByTag("entity");
for(let asset of this.app.assets.findByTag("glb")){
asset.unload();
}
for(let entity of entities){
entity.destroy();
}
[...Array(this.count).map(_ =>_)].forEach((_, row) => {
[...Array(this.count).map(_ =>_)].forEach((_, col) => {
const entity = this.loadGlb(row, col);
});
});
}, this.interval);
};
LoadGlb.prototype.loadGlb = function(row, col){
const blob = new Blob([this.file.resource]);
const url = window.URL.createObjectURL(blob);
this.app.assets.loadFromUrlAndFilename(url, "model.glb", "container", (err, asset) => {
const entity = new pc.Entity();
asset.tags.add("glb");
entity.addComponent("model", {
type: "asset",
asset: asset.resource.model,
castShadow: false
});
entity.tags.add("entity");
this.app.root.addChild(entity);
entity.setPosition(row * 0.1, col * 0.1, 0);
console.log(entity)
});
};
コメント
0件のコメント
サインインしてコメントを残してください。