Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
SubsystemDrawing.cs
浏览该文件的文档.
1using System.Diagnostics;
2using System.Text;
3using Engine;
6
7namespace Game {
8 public class SubsystemDrawing : Subsystem {
9 public Dictionary<IDrawable, bool> m_drawables = [];
10
11 public SortedMultiCollection<int, IDrawable> m_sortedDrawables = [];
12
13 public Dictionary<Type, DebugInfo> m_debugInfos = [];
14 public Stopwatch m_debugStopwatch = new();
15 public bool UpdateTimeDebug = false;
16
17 public int DrawablesCount {
18 get {
19 lock (m_drawables) {
20 return m_drawables.Count;
21 }
22 }
23 }
24
25 public void AddDrawable(IDrawable drawable) {
26 lock (m_drawables) {
27 if (!m_drawables.TryAdd(drawable, true)) {
28 Log.Error($"SubsystemDrawing: Drawable [{drawable.GetType().ToString()}] already added.");
29 }
30 }
31 }
32
33 public void RemoveDrawable(IDrawable drawable) {
34 lock (m_drawables) {
35 m_drawables.Remove(drawable);
36 }
37 }
38
39 public virtual void Draw(Camera camera) {
40 m_sortedDrawables.Clear();
41 lock (m_drawables) {
42 foreach (IDrawable key2 in m_drawables.Keys) {
43 int[] drawOrders = key2.DrawOrders;
44 foreach (int key in drawOrders) {
45 m_sortedDrawables.Add(key, key2);
46 }
47 }
48 }
49 if (UpdateTimeDebug) {
50 m_debugStopwatch.Start();
51 }
52 foreach ((int drawOrder, IDrawable sortedDrawable) in m_sortedDrawables) {
53 long ticks = UpdateTimeDebug ? m_debugStopwatch.ElapsedTicks : 0;
54 try {
55 sortedDrawable.Draw(camera, drawOrder);
56 }
57 catch (Exception) {
58 // ignored
59 }
60 finally {
61 if (UpdateTimeDebug) {
62 Type type = sortedDrawable.GetType();
63 long ticksCosted = m_debugStopwatch.ElapsedTicks - ticks;
64 if (!m_debugInfos.TryGetValue(type, out DebugInfo info)) {
65 info = new DebugInfo();
66 m_debugInfos.Add(type, info);
67 }
68 info.Counter++;
69 info.TotalTicksCosted += ticksCosted;
70 if (ticksCosted > info.MaxTicksCosted1) {
71 info.MaxTicksCosted1 = ticksCosted;
72 }
73 else if (ticksCosted > info.MaxTicksCosted2) {
74 info.MaxTicksCosted2 = ticksCosted;
75 }
76 }
77 }
78 }
79 m_debugStopwatch.Reset();
80 }
81
82 public override void Load(ValuesDictionary valuesDictionary) {
83 foreach (IDrawable item in Project.FindSubsystems<IDrawable>()) {
84 AddDrawable(item);
85 }
86 }
87
88 public override void Save(ValuesDictionary valuesDictionary) {
89 if (UpdateTimeDebug) {
90 int maxTypeNameLength = 1;
91 if (m_debugInfos.Keys.Count > 0) {
92 maxTypeNameLength = m_debugInfos.Keys.Max(type => type.FullName?.Length ?? 0) + 1;
93 }
94 StringBuilder stringBuilder = new();
95 stringBuilder.AppendLine("====== SubsystemDrawing Performance Analyze ======");
96 stringBuilder.Append("TypeName".PadRight(maxTypeNameLength));
97 stringBuilder.Append(" Counter TotalTime AverageTime MaxTime1 MaxTime2");
98 foreach ((Type type, DebugInfo info) in m_debugInfos.OrderByDescending(pair => pair.Value.TotalTicksCosted)) {
99 stringBuilder.AppendLine();
100 stringBuilder.Append(type.FullName?.PadRight(maxTypeNameLength));
101 stringBuilder.Append(info.Counter.ToString().PadLeft(11));
102 stringBuilder.Append($"{(float)info.TotalTicksCosted / Stopwatch.Frequency * 1000:F}ms".PadLeft(12));
103 stringBuilder.Append($"{(float)info.TotalTicksCosted / info.Counter / Stopwatch.Frequency * 1000000f:F}μs".PadLeft(12));
104 stringBuilder.Append($"{(float)info.MaxTicksCosted1 / Stopwatch.Frequency * 1000000f:F}μs".PadLeft(12));
105 stringBuilder.Append($"{(float)info.MaxTicksCosted2 / Stopwatch.Frequency * 1000000f:F}μs".PadLeft(12));
106 }
107 Log.Information(stringBuilder.ToString());
108 m_debugInfos.Clear();
109 }
110 }
111
112 public override void OnEntityAdded(Entity entity) {
113 foreach (IDrawable item in entity.FindComponents<IDrawable>()) {
114 bool skipVanilla = false;
116 "OnIDrawableAdded",
117 loader => {
118 loader.OnIDrawableAdded(this, item, skipVanilla, out bool skip);
119 skipVanilla |= skip;
120 return false;
121 }
122 );
123 if (!skipVanilla) {
124 AddDrawable(item);
125 }
126 }
127 }
128
129 public override void OnEntityRemoved(Entity entity) {
130 foreach (IDrawable item in entity.FindComponents<IDrawable>()) {
131 RemoveDrawable(item);
132 }
133 }
134 }
135}
static void Error(object message)
定义 Log.cs:80
static void Information(object message)
定义 Log.cs:56
override void Save(ValuesDictionary valuesDictionary)
override void Load(ValuesDictionary valuesDictionary)
override void OnEntityRemoved(Entity entity)
void AddDrawable(IDrawable drawable)
override void OnEntityAdded(Entity entity)
void RemoveDrawable(IDrawable drawable)
SortedMultiCollection< int, IDrawable > m_sortedDrawables
virtual void Draw(Camera camera)
Dictionary< Type, DebugInfo > m_debugInfos
Dictionary< IDrawable, bool > m_drawables
ValuesDictionary ValuesDictionary
static void HookAction(string HookName, Func< ModLoader, bool > action)
执行Hook
void Draw(Camera camera, int drawOrder)