132 lines
4.9 KiB
C#
132 lines
4.9 KiB
C#
using UnityEngine;
|
||
using UnityEditor;
|
||
using ArtResource;
|
||
using System.Diagnostics;
|
||
using GameFramework.Resource;
|
||
using UnityGameFramework.Runtime;
|
||
using Debug = UnityEngine.Debug;
|
||
|
||
namespace CrazyMaple.Editor
|
||
{
|
||
/// <summary>
|
||
/// 对比测试:AssetDatabase vs GameEntry.Resource.LoadAsset
|
||
/// </summary>
|
||
public class LoadMethodComparisonTest : EditorWindow
|
||
{
|
||
[MenuItem("美术工具/性能测试工具/对比加载方式性能")]
|
||
public static void ShowWindow()
|
||
{
|
||
GetWindow<LoadMethodComparisonTest>("加载方式对比");
|
||
}
|
||
|
||
private void OnGUI()
|
||
{
|
||
GUILayout.Label("对比测试", EditorStyles.boldLabel);
|
||
GUILayout.Space(10);
|
||
|
||
EditorGUILayout.HelpBox(
|
||
"对比两种加载方式的性能差异:\n" +
|
||
"1. AssetDatabase.LoadAssetAtPath(Editor专用)\n" +
|
||
"2. GameEntry.Resource.LoadAsset(框架统一接口)",
|
||
MessageType.Info);
|
||
|
||
GUILayout.Space(10);
|
||
|
||
if (GUILayout.Button("运行对比测试", GUILayout.Height(40)))
|
||
{
|
||
RunComparisonTest();
|
||
}
|
||
}
|
||
|
||
private void RunComparisonTest()
|
||
{
|
||
Debug.Log("========== 加载方式性能对比 ==========");
|
||
|
||
string[] guids = AssetDatabase.FindAssets("t:ArtTableSO");
|
||
|
||
if (guids.Length == 0)
|
||
{
|
||
Debug.LogWarning("未找到任何ArtTableSO");
|
||
return;
|
||
}
|
||
|
||
// 清理缓存
|
||
Resources.UnloadUnusedAssets();
|
||
System.GC.Collect();
|
||
|
||
foreach (var guid in guids)
|
||
{
|
||
string path = AssetDatabase.GUIDToAssetPath(guid);
|
||
|
||
Debug.Log($"\n--- 测试文件: {path} ---");
|
||
|
||
// 方法1: AssetDatabase(Editor专用,最直接)
|
||
Resources.UnloadUnusedAssets();
|
||
var sw1 = Stopwatch.StartNew();
|
||
var table1 = AssetDatabase.LoadAssetAtPath<ArtTableSO>(path);
|
||
sw1.Stop();
|
||
Debug.Log($"[AssetDatabase] 加载耗时: {sw1.Elapsed.TotalMilliseconds:F2} ms");
|
||
|
||
// 方法2: GameEntry.Resource(框架接口,通过EditorResourceComponent)
|
||
Resources.UnloadUnusedAssets();
|
||
|
||
// 检查 GameEntry 是否已初始化
|
||
if (GameEntry.Resource == null)
|
||
{
|
||
Debug.LogWarning("[GameEntry.Resource] GameEntry未初始化,请先运行游戏或在Play模式下测试");
|
||
Debug.LogWarning("跳过GameEntry.Resource测试,只显示AssetDatabase结果");
|
||
continue;
|
||
}
|
||
|
||
var sw2 = Stopwatch.StartNew();
|
||
|
||
bool loadCompleted = false;
|
||
ArtTableSO table2 = null;
|
||
|
||
var callbacks = new LoadAssetCallbacks(
|
||
(assetName, asset, duration, userData) =>
|
||
{
|
||
sw2.Stop();
|
||
table2 = asset as ArtTableSO;
|
||
loadCompleted = true;
|
||
Debug.Log($"[GameEntry.Resource] 加载耗时: {sw2.Elapsed.TotalMilliseconds:F2} ms");
|
||
Debug.Log($" - Framework报告的duration: {duration:F4} 秒 ({duration * 1000:F2} ms)");
|
||
},
|
||
(assetName, status, errorMessage, userData) =>
|
||
{
|
||
sw2.Stop();
|
||
loadCompleted = true;
|
||
Debug.LogError($"[GameEntry.Resource] 加载失败: {errorMessage}");
|
||
}
|
||
);
|
||
|
||
GameEntry.Resource.LoadAsset(path, typeof(ArtTableSO), callbacks);
|
||
|
||
// 等待异步加载完成(Editor模式下实际是同步的,但需要等待回调)
|
||
int timeout = 0;
|
||
while (!loadCompleted && timeout < 1000)
|
||
{
|
||
System.Threading.Thread.Sleep(1);
|
||
timeout++;
|
||
}
|
||
|
||
if (!loadCompleted)
|
||
{
|
||
Debug.LogError("[GameEntry.Resource] 加载超时!");
|
||
}
|
||
|
||
// 对比
|
||
if (table1 != null && table2 != null)
|
||
{
|
||
float ratio = (float)sw2.Elapsed.TotalMilliseconds / (float)sw1.Elapsed.TotalMilliseconds;
|
||
Debug.Log($"性能差异: GameEntry.Resource 比 AssetDatabase 慢 {ratio:F1}x");
|
||
}
|
||
}
|
||
|
||
Debug.Log("\n========== 测试完成 ==========");
|
||
Debug.Log("结论: 如果GameEntry.Resource明显更慢,说明EditorResourceComponent有额外开销");
|
||
Debug.Log("建议: 真机/打包后测试,Runtime的AssetBundleResourceComponent性能可能完全不同");
|
||
}
|
||
}
|
||
}
|