mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2025-10-30 08:11:25 +00:00
fix memory leaks caused by world not being properly disposed
This commit is contained in:
parent
628a2627ff
commit
0ae13d5acc
4 changed files with 44 additions and 11 deletions
|
|
@ -989,6 +989,7 @@ class DtsObject extends GameObject {
|
||||||
|
|
||||||
public override function dispose() {
|
public override function dispose() {
|
||||||
super.dispose();
|
super.dispose();
|
||||||
|
this.level = null;
|
||||||
this.dtsResource.release();
|
this.dtsResource.release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,16 +13,25 @@ import h3d.scene.Object;
|
||||||
import h3d.scene.Mesh;
|
import h3d.scene.Mesh;
|
||||||
import h3d.scene.MeshBatch;
|
import h3d.scene.MeshBatch;
|
||||||
|
|
||||||
typedef MeshBatchInfo = {
|
@:publicFields
|
||||||
|
class MeshBatchInfo {
|
||||||
var instances:Array<MeshInstance>;
|
var instances:Array<MeshInstance>;
|
||||||
var meshbatch:MeshBatch;
|
var meshbatch:MeshBatch;
|
||||||
var ?transparencymeshbatch:MeshBatch;
|
var transparencymeshbatch:MeshBatch;
|
||||||
var mesh:Mesh;
|
var mesh:Mesh;
|
||||||
|
|
||||||
|
public function new() {}
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef MeshInstance = {
|
@:publicFields
|
||||||
|
class MeshInstance {
|
||||||
var emptyObj:Object;
|
var emptyObj:Object;
|
||||||
var gameObject:GameObject;
|
var gameObject:GameObject;
|
||||||
|
|
||||||
|
public function new(eo, go) {
|
||||||
|
this.emptyObj = eo;
|
||||||
|
this.gameObject = go;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class InstanceManager {
|
class InstanceManager {
|
||||||
|
|
@ -108,7 +117,7 @@ class InstanceManager {
|
||||||
var objs = getAllChildren(object);
|
var objs = getAllChildren(object);
|
||||||
var minfos = objects[objectMap.get(object.identifier)]; // objects.get(object.identifier);
|
var minfos = objects[objectMap.get(object.identifier)]; // objects.get(object.identifier);
|
||||||
for (i in 0...objs.length) {
|
for (i in 0...objs.length) {
|
||||||
minfos[i].instances.push({emptyObj: objs[i], gameObject: object});
|
minfos[i].instances.push(new MeshInstance(objs[i], object));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// First time appending the thing so bruh
|
// First time appending the thing so bruh
|
||||||
|
|
@ -117,11 +126,11 @@ class InstanceManager {
|
||||||
var minfos = [];
|
var minfos = [];
|
||||||
for (obj in objs) {
|
for (obj in objs) {
|
||||||
var isMesh = obj is Mesh;
|
var isMesh = obj is Mesh;
|
||||||
var minfo:MeshBatchInfo = {
|
var minfo:MeshBatchInfo = new MeshBatchInfo();
|
||||||
instances: [{emptyObj: obj, gameObject: object}],
|
minfo.instances = [new MeshInstance(obj, object)];
|
||||||
meshbatch: isMesh ? new MeshBatch(cast(cast(obj, Mesh).primitive), cast(cast(obj, Mesh)).material.clone(), scene) : null,
|
minfo.meshbatch = isMesh ? new MeshBatch(cast(cast(obj, Mesh).primitive), cast(cast(obj, Mesh)).material.clone(), scene) : null;
|
||||||
mesh: isMesh ? cast obj : null
|
minfo.mesh = isMesh ? cast obj : null;
|
||||||
}
|
|
||||||
if (isMesh) {
|
if (isMesh) {
|
||||||
var mat = cast(obj, Mesh).material;
|
var mat = cast(obj, Mesh).material;
|
||||||
var dtsshader = mat.mainPass.getShader(DtsTexture);
|
var dtsshader = mat.mainPass.getShader(DtsTexture);
|
||||||
|
|
|
||||||
|
|
@ -194,10 +194,12 @@ class MarbleGame {
|
||||||
}, (sender) -> {
|
}, (sender) -> {
|
||||||
canvas.popDialog(exitGameDlg);
|
canvas.popDialog(exitGameDlg);
|
||||||
paused = !paused;
|
paused = !paused;
|
||||||
world.setCursorLock(true);
|
var w = getWorld();
|
||||||
|
w.setCursorLock(true);
|
||||||
}, (sender) -> {
|
}, (sender) -> {
|
||||||
canvas.popDialog(exitGameDlg);
|
canvas.popDialog(exitGameDlg);
|
||||||
world.restart();
|
var w = getWorld();
|
||||||
|
w.restart();
|
||||||
// world.setCursorLock(true);
|
// world.setCursorLock(true);
|
||||||
paused = !paused;
|
paused = !paused;
|
||||||
});
|
});
|
||||||
|
|
@ -211,6 +213,11 @@ class MarbleGame {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getWorld() {
|
||||||
|
// So that we don't actually store this somewhere in any closure stack
|
||||||
|
return world;
|
||||||
|
}
|
||||||
|
|
||||||
public function quitMission() {
|
public function quitMission() {
|
||||||
world.setCursorLock(false);
|
world.setCursorLock(false);
|
||||||
paused = false;
|
paused = false;
|
||||||
|
|
|
||||||
|
|
@ -1545,27 +1545,43 @@ class MarbleWorld extends Scheduler {
|
||||||
for (interior in this.interiors) {
|
for (interior in this.interiors) {
|
||||||
interior.dispose();
|
interior.dispose();
|
||||||
}
|
}
|
||||||
|
interiors = null;
|
||||||
for (pathedInteriors in this.pathedInteriors) {
|
for (pathedInteriors in this.pathedInteriors) {
|
||||||
pathedInteriors.dispose();
|
pathedInteriors.dispose();
|
||||||
}
|
}
|
||||||
|
pathedInteriors = null;
|
||||||
for (marble in this.marbles) {
|
for (marble in this.marbles) {
|
||||||
marble.dispose();
|
marble.dispose();
|
||||||
}
|
}
|
||||||
|
marbles = null;
|
||||||
for (dtsObject in this.dtsObjects) {
|
for (dtsObject in this.dtsObjects) {
|
||||||
dtsObject.dispose();
|
dtsObject.dispose();
|
||||||
}
|
}
|
||||||
|
dtsObjects = null;
|
||||||
for (trigger in this.triggers) {
|
for (trigger in this.triggers) {
|
||||||
trigger.dispose();
|
trigger.dispose();
|
||||||
}
|
}
|
||||||
|
triggers = null;
|
||||||
for (soundResource in this.soundResources) {
|
for (soundResource in this.soundResources) {
|
||||||
soundResource.release();
|
soundResource.release();
|
||||||
}
|
}
|
||||||
for (textureResource in this.textureResources) {
|
for (textureResource in this.textureResources) {
|
||||||
textureResource.release();
|
textureResource.release();
|
||||||
}
|
}
|
||||||
|
gems = null;
|
||||||
|
|
||||||
sky.dispose();
|
sky.dispose();
|
||||||
|
|
||||||
|
instanceManager = null;
|
||||||
|
collisionWorld = null;
|
||||||
|
particleManager = null;
|
||||||
|
namedObjects = null;
|
||||||
|
shapeOrTriggerInside = null;
|
||||||
|
shapeImmunity = null;
|
||||||
|
currentCheckpoint = null;
|
||||||
|
checkpointCollectedGems = null;
|
||||||
|
marble = null;
|
||||||
|
|
||||||
this._disposed = true;
|
this._disposed = true;
|
||||||
AudioManager.stopAllSounds();
|
AudioManager.stopAllSounds();
|
||||||
AudioManager.playShell();
|
AudioManager.playShell();
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue