From a4af90c978dd92b2a690775ecdc04aeeeb009079 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 23 Oct 2024 15:38:44 +0900 Subject: [PATCH 1/3] if IsAssetImport, Prevent runtime resource allocation. Or temporary object when export. --- Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs | 5 ++++- .../ScriptedImporter/VrmScriptedImporterImpl.cs | 5 ++++- Assets/VRM10/Editor/Vrm10ExportDialog.cs | 1 + Assets/VRM10/Runtime/IO/Vrm10Importer.cs | 11 ++++++++--- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs index 68f5bdec6..2b4e5a83b 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs @@ -12,6 +12,7 @@ namespace UniGLTF /// public class ImporterContext : IResponsibilityForDestroyObjects { + public readonly bool IsAssetImport; private readonly ImporterContextSettings _settings; public ITextureDescriptorGenerator TextureDescriptorGenerator { get; protected set; } @@ -37,8 +38,10 @@ namespace UniGLTF IReadOnlyDictionary externalObjectMap = null, ITextureDeserializer textureDeserializer = null, IMaterialDescriptorGenerator materialGenerator = null, - ImporterContextSettings settings = null) + ImporterContextSettings settings = null, + bool isAssetImport = false) { + IsAssetImport = isAssetImport; _settings = settings ?? new ImporterContextSettings(); Data = data; TextureDescriptorGenerator = new GltfTextureDescriptorGenerator(Data); diff --git a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs index c748a9451..a3c5d71b2 100644 --- a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs +++ b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs @@ -48,7 +48,10 @@ namespace UniVRM10 var materialGenerator = GetMaterialDescriptorGenerator(renderPipeline); - using (var loader = new Vrm10Importer(result, externalObjectMap: extractedObjects, materialGenerator: materialGenerator)) + using (var loader = new Vrm10Importer(result, + externalObjectMap: extractedObjects, + materialGenerator: materialGenerator, + isAssetImport: true)) { // settings TextureImporters foreach (var textureInfo in loader.TextureDescriptorGenerator.Get().GetEnumerable()) diff --git a/Assets/VRM10/Editor/Vrm10ExportDialog.cs b/Assets/VRM10/Editor/Vrm10ExportDialog.cs index 41e71f8ed..eb805d358 100644 --- a/Assets/VRM10/Editor/Vrm10ExportDialog.cs +++ b/Assets/VRM10/Editor/Vrm10ExportDialog.cs @@ -290,6 +290,7 @@ namespace UniVRM10 { Debug.Log("vrm-1.0 FreezeMesh"); var copy = GameObject.Instantiate(root); + copy.GetComponent().UpdateType = Vrm10Instance.UpdateTypes.None; disposer.Push(copy); root = copy; diff --git a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs index dacfdedf7..220a0ceaa 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs @@ -33,9 +33,10 @@ namespace UniVRM10 IMaterialDescriptorGenerator materialGenerator = null, bool useControlRig = false, ImporterContextSettings settings = null, - IVrm10SpringBoneRuntime springboneRuntime = null + IVrm10SpringBoneRuntime springboneRuntime = null, + bool isAssetImport = false ) - : base(vrm.Data, externalObjectMap, textureDeserializer, settings: settings) + : base(vrm.Data, externalObjectMap, textureDeserializer, settings: settings, isAssetImport: isAssetImport) { if (vrm == null) { @@ -288,7 +289,11 @@ namespace UniVRM10 await LoadSpringBoneAsync(awaitCaller, controller, springBone); } - if (Application.isPlaying) + if (IsAssetImport) + { + controller.UpdateType = Vrm10Instance.UpdateTypes.None; + } + else { // EditorImport では呼ばない // Vrm10Runtime で初期化していたが、 async にするためこちらに移動 v0.127 From 53028c82f87b7b5b1b10f1d74b50586f426409b5 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 23 Oct 2024 16:09:46 +0900 Subject: [PATCH 2/3] =?UTF-8?q?Vrm10Instance.UpdateTypes.None=20=E3=81=AF?= =?UTF-8?q?=E3=82=84=E3=82=81=E3=80=82=E4=B8=8D=E8=A6=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/VRM10/Runtime/IO/Vrm10Importer.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs index 220a0ceaa..440143db3 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs @@ -291,11 +291,13 @@ namespace UniVRM10 if (IsAssetImport) { - controller.UpdateType = Vrm10Instance.UpdateTypes.None; + // ScriptedImpoter から発動された。 + // SpringBone のリソース確保を回避する。 + // Application.isPlaying == true がありえる。 } else { - // EditorImport では呼ばない + // ScriptedImpoter 経由でない。 // Vrm10Runtime で初期化していたが、 async にするためこちらに移動 v0.127 // RuntimeGltfInstance にアクセスしたいのだが OnLoadHierarchy ではまだ attach されてなかった v0.128 // VRMC_springBone が無くても初期化する v0.127.2 From 0e4bf5da06d295caaf560df14fc05a04e39f3d5e Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 24 Oct 2024 16:43:30 +0900 Subject: [PATCH 3/3] =?UTF-8?q?#2463=20=E3=81=A7=E3=82=B3=E3=83=B3?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=83=A9=E3=82=AF=E3=82=BF=E3=83=BC=E3=81=A7?= =?UTF-8?q?=20Singleton=20=E7=A2=BA=E4=BF=9D=E3=81=97=E3=81=9F=E3=81=AE?= =?UTF-8?q?=E3=81=8C=E4=BB=87=E3=81=AB=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Vrm10Runtime/Vrm10NopSpringboneRuntime.cs | 44 +++++++++++++++++++ .../Vrm10NopSpringboneRuntime.cs.meta | 11 +++++ Assets/VRM10/Runtime/IO/Vrm10Importer.cs | 19 +++++++- ProjectSettings/QualitySettings.asset | 1 + 4 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10NopSpringboneRuntime.cs create mode 100644 Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10NopSpringboneRuntime.cs.meta diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10NopSpringboneRuntime.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10NopSpringboneRuntime.cs new file mode 100644 index 000000000..30f26068d --- /dev/null +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10NopSpringboneRuntime.cs @@ -0,0 +1,44 @@ +using System.Threading.Tasks; +using UniGLTF; +using UniGLTF.SpringBoneJobs.Blittables; +using UnityEngine; + +namespace UniVRM10 +{ + /// + /// SpcriptedImporter 経由の import 向け。 + /// NativeArray の確保や DontDestroyOnLoad を回避。 + /// + public class Vrm10NopSpringboneRuntime : IVrm10SpringBoneRuntime + { + public void Dispose() + { + } + + public Task InitializeAsync(Vrm10Instance instance, IAwaitCaller awaitCaller) + { + return Task.CompletedTask; + } + + public void Process() + { + } + + public bool ReconstructSpringBone() + { + return false; + } + + public void RestoreInitialTransform() + { + } + + public void SetJointLevel(Transform joint, BlittableJointMutable jointSettings) + { + } + + public void SetModelLevel(Transform modelRoot, BlittableModelLevel modelSettings) + { + } + } +} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10NopSpringboneRuntime.cs.meta b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10NopSpringboneRuntime.cs.meta new file mode 100644 index 000000000..cb64688e3 --- /dev/null +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10NopSpringboneRuntime.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b58249c702cd4054480f69562b43b0b7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs index 440143db3..c3c05ff38 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs @@ -54,7 +54,24 @@ namespace UniVRM10 m_externalMap = new Dictionary(); } - m_springboneRuntime = springboneRuntime ?? new Vrm10FastSpringboneRuntime(); + m_springboneRuntime = MakeDefaultRuntime(springboneRuntime, isAssetImport); + } + + static IVrm10SpringBoneRuntime MakeDefaultRuntime(IVrm10SpringBoneRuntime runtime, bool isAssetImport) + { + if (runtime != null) + { + return runtime; + } + + if (isAssetImport) + { + // 何もしない dummy + return new Vrm10NopSpringboneRuntime(); + } + + // Vrm10Instance.MakeRuntime に移譲 + return null; } static void AssignHumanoid(List nodes, UniGLTF.Extensions.VRMC_vrm.HumanBone humanBone, VrmLib.HumanoidBones key) diff --git a/ProjectSettings/QualitySettings.asset b/ProjectSettings/QualitySettings.asset index 785dd573c..dc07d28e4 100644 --- a/ProjectSettings/QualitySettings.asset +++ b/ProjectSettings/QualitySettings.asset @@ -230,6 +230,7 @@ QualitySettings: PSM: 5 PSP2: 2 Samsung TV: 2 + Server: 0 Standalone: 5 Switch: 5 Tizen: 2