新增场景释放机制和Dispose方法

This commit is contained in:
2025-05-09 11:23:57 +08:00
parent 4a648c2f97
commit efb220612e
9 changed files with 294 additions and 93 deletions

View File

@@ -12,7 +12,11 @@ export const useEvent = defineStore('event', () => {
events[name]?.forEach(e => e(...args));
}
return { Subscribe, Publish };
function Unsubscribe(name: EventNames, callback: Function) {
events[name] = events[name]?.filter(e => e !== callback) || [];
}
return { Subscribe, Publish, Unsubscribe };
});
export type EventNames = 'submit' | 'update-texture'

View File

@@ -8,7 +8,7 @@ import { materialRenderer } from "../common/MaterialRenderer";
import { MaterialOut } from "../common/MaterialSerializer";
export const useScene = defineStore('scene', () => {
let _editor: MaterialEditor;
let _editor: MaterialEditor | undefined;
const _currGeometry = ref<string>('球');
const _currTexture = ref<Texture>();
const CurrGeometry = computed({
@@ -24,7 +24,7 @@ export const useScene = defineStore('scene', () => {
console.warn("SceneStore has already been initialized");
return;
}
// 为Material配置一个ObjectId否则其无法被序列化
Material.value.objectId = new ObjectId(undefined, undefined);
@@ -37,11 +37,22 @@ export const useScene = defineStore('scene', () => {
const view = _editor.Viewer;
window.onresize = () => {
view.OnSize(canvas.clientWidth, canvas.clientHeight);
view.SetSize(canvas.clientWidth, canvas.clientHeight);
view.UpdateRender();
}
}
function Dispose() {
console.log("Disposing...");
Material.value.GoodBye();
_editor?.Dispose();
_editor = undefined;
window.onresize = undefined;
// 释放Singleton
MaterialEditor.ReleaseInstance();
}
function ChangeGeometry(geoName: string) {
_currGeometry.value = geoName;
let geo = _editor.Geometrys.get(_currGeometry.value);
@@ -121,7 +132,8 @@ export const useScene = defineStore('scene', () => {
ChangeTextureAsync,
UpdateTexture,
SerializeMaterialAsync,
GenerateMaterialLogoAsync
GenerateMaterialLogoAsync,
Dispose
};
});