fix: resolve Context Lost by fixing GPU memory leaks and removing base64 model conversion
Build and Deploy / build-and-push (push) Successful in 55s

This commit is contained in:
AI Bot
2026-09-02 18:34:08 +05:30
parent e30d9e9869
commit ed8f589d49
+27 -16
View File
@@ -297,20 +297,34 @@ export default function Editor() {
// Dispose old model when new one is loaded // Dispose old model when new one is loaded
const prevLoadedModelRef = useRef<THREE.Object3D | null>(null); const prevLoadedModelRef = useRef<THREE.Object3D | null>(null);
useEffect(() => {
if (prevLoadedModelRef.current && prevLoadedModelRef.current !== loadedModel) { const disposeObject = (obj: THREE.Object3D) => {
prevLoadedModelRef.current.traverse((child) => { obj.traverse((child) => {
if (child instanceof THREE.Mesh) { if (child instanceof THREE.Mesh) {
child.geometry.dispose(); if (child.geometry) child.geometry.dispose();
if (child.material) {
if (Array.isArray(child.material)) { if (Array.isArray(child.material)) {
child.material.forEach(m => m.dispose()); child.material.forEach(m => m.dispose());
} else { } else {
child.material.dispose(); child.material.dispose();
} }
} }
}); }
});
};
useEffect(() => {
if (prevLoadedModelRef.current && prevLoadedModelRef.current !== loadedModel) {
disposeObject(prevLoadedModelRef.current);
} }
prevLoadedModelRef.current = loadedModel; prevLoadedModelRef.current = loadedModel;
return () => {
if (prevLoadedModelRef.current) {
disposeObject(prevLoadedModelRef.current);
prevLoadedModelRef.current = null;
}
};
}, [loadedModel]); }, [loadedModel]);
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const [importProgress, setImportProgress] = useState(0); const [importProgress, setImportProgress] = useState(0);
@@ -348,7 +362,9 @@ export default function Editor() {
if (parsedSd.modelData && parsedSd.modelData.data === 'model.glb' && unzipped['model.glb']) { if (parsedSd.modelData && parsedSd.modelData.data === 'model.glb' && unzipped['model.glb']) {
const modelBlob = new Blob([unzipped['model.glb']]); const modelBlob = new Blob([unzipped['model.glb']]);
parsedSd.modelData.data = URL.createObjectURL(modelBlob); const bUrl = URL.createObjectURL(modelBlob);
parsedSd.modelData.data = bUrl;
setBlobURLs(prev => [...prev, bUrl]);
} }
sd = parsedSd; sd = parsedSd;
} }
@@ -992,9 +1008,7 @@ export default function Editor() {
setIsLoading(true); setIsLoading(true);
setImportStatus("Restoring model..."); setImportStatus("Restoring model...");
try { try {
const response = await fetch(modelInfo.data); const url = modelInfo.data;
const blob = await response.blob();
const url = URL.createObjectURL(blob);
const manager = new THREE.LoadingManager(); const manager = new THREE.LoadingManager();
let object: THREE.Object3D | null = null; let object: THREE.Object3D | null = null;
@@ -5201,12 +5215,9 @@ export default function Editor() {
// Save model data for scene persistence // Save model data for scene persistence
const modelBlob = await fetch(modelUrl).then(r => r.blob()); const modelBlob = await fetch(modelUrl).then(r => r.blob());
const modelBase64 = await new Promise<string>((resolve) => { const blobUrl = URL.createObjectURL(modelBlob);
const reader = new FileReader(); setBlobURLs(prev => [...prev, blobUrl]);
reader.onloadend = () => resolve(reader.result as string); setModelData({ name: "Generated_Model.glb", data: blobUrl, extension: 'glb' });
reader.readAsDataURL(modelBlob);
});
setModelData({ name: "Generated_Model.glb", data: modelBase64, extension: 'glb' });
const boundingBox = new THREE.Box3().setFromObject(object); const boundingBox = new THREE.Box3().setFromObject(object);
const center = new THREE.Vector3(); const center = new THREE.Vector3();