Refactor asset handler system and catalog for safety

- Introduced AssetHandlerInfo struct for handler registration and lookup, enabling handler caching and decoupling instantiation from extension/type.
- Changed CustomAssetHandlerAttribute to use required named properties; updated source generator.
- Replaced HandlerTypeId with AssetTypeId throughout metadata, catalog, and sub-asset records for clarity.
- Refactored asset catalog to use connection pooling and local command creation for thread safety.
- Updated asset handler interfaces and implementations to align with new registration system and removed redundant properties.
- Migrated mesh import and meshlet building to async JobScheduler jobs; switched to TLSF allocator and improved safety checks.
- Made meshlet/LOD hierarchy building async and job-based with better memory management.
- Updated usages and tests for new APIs; refreshed project references and package versions.
- Improved documentation and code comments for clarity.
This commit is contained in:
2026-05-08 11:50:06 +09:00
parent d052ca848f
commit b42398bbce
23 changed files with 690 additions and 568 deletions

View File

@@ -58,9 +58,11 @@ internal static class ActivationHandler
var opts = new AllocationManagerDesc
{
ArenaCapacity = 1024 * 1024 * 1024, // 1 GB. Arena using virtual memory, so this is just a reservation and won't actually consume physical memory until used.
StackCapacity = 1024 * 1024 * 32, // 32 MB. Stack using virtual memory, so this is just a reservation and won't actually consume physical memory until used.
FreeListChunkSize = 64 * 1024 * 1024,
StackCapacity = 1024 * 1024 * 64, // 64 MB. Stack using virtual memory, so this is just a reservation and won't actually consume physical memory until used.
FreeListChunkSize = 64 * 1024,
FreeListDefaultAlignment = 8,
TLSFInitialChunkSize = 64 * 1024,
TLSFAlignment = 8,
};
AllocationManager.Initialize(opts);

View File

@@ -90,8 +90,12 @@ internal partial class ContentBrowserViewModel : ObservableObject
if (!isDir)
{
var ext = Path.GetExtension(fullPath);
assetType = AssetHandlerRegistry.GetRuntimeAssetTypeByExtension(ext);
if (AssetHandlerRegistry.TryGetHandlerInfoByExtension(ext, out var info))
{
assetType = info.RuntimeAssetType;
}
}
Files.Add(new ExplorerItem(Path.GetFileName(fullPath), fullPath, isDir, assetType));
}
}
@@ -144,7 +148,7 @@ internal partial class ContentBrowserViewModel : ObservableObject
}
var ext = Path.GetExtension(file);
var assetType = AssetHandlerRegistry.GetRuntimeAssetTypeByExtension(ext);
var assetType = AssetHandlerRegistry.TryGetHandlerInfoByExtension(ext, out var handlerInfo) ? handlerInfo.RuntimeAssetType : AssetType.Unknown;
var fileItem = new ExplorerItem(Path.GetFileName(file), file, false, assetType);
Files.Add(fileItem);