-
Notifications
You must be signed in to change notification settings - Fork 0
/
Status.vb
290 lines (251 loc) · 11.7 KB
/
Status.vb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
Imports System.Collections.Generic
Imports System.Diagnostics
Imports System.Linq
Imports GeonBit.UI.Entities
Imports Microsoft.Xna.Framework
Imports Microsoft.Xna.Framework.Input
Imports U
Namespace Extensions
Public Class Status
Inherits Panel
Property FPSCounter As FrameCounter
Property MouseCoordinates As MouseCoordinates
Property SystemUsage As SystemUsage
Property Timer As Timer
Property ShowFPS As Boolean
Property ShowMousePosition As
Property ShowSystemUsage As Boolean
Property ShowTimer As Boolean
Sub New(Size As Vector2, Optional Anchor As Anchor = Anchor.Auto, Optional Offset As Vector2? = Nothing)
MyBase.New(Size, anchor:=Anchor, offset:=Offset)
FillColor = Nothing
ClickThrough = True
Dim Settings = Game.GetService(Of Settings.Settings).Defaults.Status
ShowFPS = Settings.ShowFPS
ShowMousePosition = Settings.ShowMousePosition
ShowSystemUsage = Settings.ShowSystemUsage
ShowTimer = Settings.ShowTimer
AddChild(New Label(Game.Instance.Version))
If ShowFPS Then
FPSCounter = New FrameCounter()
AddChild(FPSCounter)
End If
If ShowMousePosition Then
MouseCoordinates = New MouseCoordinates()
AddChild(MouseCoordinates)
End If
If ShowSystemUsage Then
SystemUsage = New SystemUsage()
AddChild(SystemUsage)
End If
If ShowTimer Then
Timer = New Timer()
AddChild(Timer)
End If
End Sub
End Class
Public Module Tools
Class FrameCounter
Inherits Label
Sub New(Optional Anchor As Anchor = Anchor.Auto, Optional Size As Vector2? = Nothing, Optional Offset As Vector2? = Nothing)
MyBase.New(String.Empty, Anchor, Size, Offset)
End Sub
Property TotalFrames As Long
Property TotalSeconds As Single
Property AverageFramesPerSecond As Single
Property CurrentFramesPerSecond As Single
Const MAXIMUM_SAMPLES As Integer = 100
Private SampleBuffer As New Queue(Of Single)
Protected Overrides Sub DoBeforeUpdate()
Dim DeltaTime = CSng(Game.Instance.GameTime.ElapsedGameTime.TotalSeconds)
CurrentFramesPerSecond = (1.0F / DeltaTime)
SampleBuffer.Enqueue(CurrentFramesPerSecond)
If (SampleBuffer.Count > MAXIMUM_SAMPLES) Then
SampleBuffer.Dequeue()
AverageFramesPerSecond = SampleBuffer.Average(Function(i) i)
Else
AverageFramesPerSecond = CurrentFramesPerSecond
End If
TotalFrames += 1
TotalSeconds += DeltaTime
Text = "FPS : " & AverageFramesPerSecond.ToString
End Sub
End Class
Class SystemUsage
Inherits Paragraph
Private Skip As Date
Private PerformanceCounterToggle As Boolean
Private _UsePerfCounter As UsePerformanceCounter
Private _UseProcess As UseProcess
''' <summary>How many seconds between usage updates.</summary>
''' <remarks>Defaults to 3.</remarks>
Public SkipBy As Integer = 3
Sub New(Optional Anchor As Anchor = Anchor.Auto, Optional Size As Vector2? = Nothing, Optional Offset As Vector2? = Nothing, Optional PerformanceCounter As Boolean = False)
MyBase.New(String.Empty, Anchor, Size, Offset)
If (Not PerformanceCounter) Then
_UseProcess = New UseProcess
Else
_UsePerfCounter = New UsePerformanceCounter
PerformanceCounterToggle = True
End If
End Sub
Sub SkipAdd()
Skip = Date.Now + System.TimeSpan.FromSeconds(SkipBy)
End Sub
Function SkipCheck() As Boolean
Return (Date.Now > Skip)
End Function
Protected Overrides Sub DoBeforeUpdate()
If (Not PerformanceCounterToggle) Then
_UseProcess.CallCPU()
End If
If SkipCheck() Then
SkipAdd()
Text = Nothing
If (Not PerformanceCounterToggle) Then
Text += "CPU : " & _UseProcess.GetCPU & "%"
Text += System.Environment.NewLine
Text += "RAM : " & _UseProcess.GetMemory
Text += System.Environment.NewLine
Text += "Threads : " & _UseProcess.GetThreads
Else
Text += "CPU : " & _UsePerfCounter.GetCPU & "%"
Text += System.Environment.NewLine
Text += "RAM : " & _UsePerfCounter.GetMemory & "MB"
End If
End If
End Sub
Class UseProcess
Private StartTime As Date = Date.UtcNow
Private StartProc As System.TimeSpan = Process.GetCurrentProcess().TotalProcessorTime
Private CPU As Double
Public Sub CallCPU()
CPU = ((Process.GetCurrentProcess().TotalProcessorTime - StartProc).TotalSeconds / (System.Environment.ProcessorCount * Date.UtcNow.Subtract(StartTime).TotalSeconds))
End Sub
Public Function GetCPU() As String
Return String.Format("{0:0.0}", (CPU * 100))
End Function
Public Function GetMemory() As String
Return Process.GetCurrentProcess().PrivateMemorySize64.ToSize(SizeUnits.MB)
End Function
Public Function GetThreads() As String
Return Process.GetCurrentProcess().Threads.Count.ToString
End Function
End Class
''' <summary>
''' Will affect performance much more than using Process.
''' </summary>
Class UsePerformanceCounter
Private Counter_CPU As PerformanceCounter
Private Counter_RAM As PerformanceCounter
Public Sub SetUpUsage()
Dim Process = System.Diagnostics.Process.GetCurrentProcess()
Dim Name As String = Nothing
For Each Instance In New PerformanceCounterCategory("Process").GetInstanceNames()
If Instance.StartsWith(Process.ProcessName) Then
Using ProcessID = New PerformanceCounter("Process", "ID Process", Instance, True)
If Process.Id = CInt(ProcessID.RawValue) Then
Name = Instance
Exit For
End If
End Using
End If
Next
Counter_CPU = New PerformanceCounter("Process", "% Processor Time", Name, True)
Counter_RAM = New PerformanceCounter("Process", "Private Bytes", Name, True)
End Sub
Function GetCPU() As String
Return (System.Math.Round(Counter_CPU.NextValue() / System.Environment.ProcessorCount, 2)).ToString
End Function
Function GetMemory() As String
Return (((System.Math.Round(Counter_RAM.NextValue() / 1024) / 1024), 2)).ToString
End Function
End Class
End Class
'Class SystemUsage
' Inherits Paragraph
' Private Counter_CPU As PerformanceCounter
' Private Counter_RAM As PerformanceCounter
' Private Skip As Date
' '''<summary>
' '''<para>How many seconds between usage updates.</para>
' '''<para>Defaults to 3.</para>
' '''</summary>
' Public SkipBy As Integer = 3
' Sub New(Optional Anchor As Anchor = Anchor.Auto, Optional Size As Vector2? = Nothing, Optional Offset As Vector2? = Nothing)
' MyBase.New(String.Empty, Anchor, Size, Offset)
' SetUpUsage()
' End Sub
' Public Sub SetUpUsage()
' Dim Process = System.Diagnostics.Process.GetCurrentProcess()
' Dim Name As String = Nothing
' For Each Instance In New PerformanceCounterCategory("Process").GetInstanceNames()
' If Instance.StartsWith(Process.ProcessName) Then
' Using ProcessID = New PerformanceCounter("Process", "ID Process", Instance, True)
' If Process.Id = CInt(ProcessID.RawValue) Then
' Name = Instance
' Exit For
' End If
' End Using
' End If
' Next
' Counter_CPU = New PerformanceCounter("Process", "% Processor Time", Name, True)
' Counter_RAM = New PerformanceCounter("Process", "Private Bytes", Name, True)
' SkipAdd()
' End Sub
' Function GetCPU() As String
' Return (System.Math.Round(Counter_CPU.NextValue() / System.Environment.ProcessorCount, 2)).ToString
' End Function
' Function GetRAM() As String
' Return (System.Math.Round(Counter_RAM.NextValue() / 1024 / 1024, 2)).ToString
' End Function
' Sub SkipAdd()
' Skip = Date.Now + System.TimeSpan.FromSeconds(SkipBy)
' End Sub
' Function SkipCheck() As Boolean
' Return (Date.Now > Skip)
' End Function
' Protected Overrides Sub DoBeforeUpdate()
' If SkipCheck() Then
' SkipAdd()
' Text = Nothing
' Text += "CPU :" & GetCPU() & "%"
' Text += System.Environment.NewLine
' Text += "RAM :" & GetRAM() & "MB"
' End If
' End Sub
'End Class
Class MouseCoordinates
Inherits Label
Sub New(Optional Anchor As Anchor = Anchor.Auto, Optional Size As Vector2? = Nothing, Optional Offset As Vector2? = Nothing)
MyBase.New(String.Empty, Anchor, Size, Offset)
End Sub
Protected Overrides Sub DoBeforeUpdate()
Text = Mouse.GetState.Position.ToString
End Sub
End Class
Class Timer
Inherits Label
Sub New(Optional Anchor As Anchor = Anchor.Auto, Optional Size As Vector2? = Nothing, Optional Offset As Vector2? = Nothing)
MyBase.New(String.Empty, Anchor, Size, Offset)
Watch.Start()
End Sub
Public Watch As New Stopwatch
''' <summary>
''' If the player is trying to beat someone else's time.
''' </summary>
Public Goal As Integer
''' <summary>
''' If the Goal isn't met, should the scenario reset?
''' </summary>
Public ResetOnFail As Boolean
''' <summary>
''' If second fractions should be displayed.
''' </summary>
Public Fractions As Boolean = Game.GetService(Of Settings.Settings).Defaults.Status.Fractions
Protected Overrides Sub DoBeforeUpdate()
Text = Watch.Elapsed.ToString(If(Fractions, "mm\:ss\:fffffff", "mm\:ss"))
End Sub
End Class
End Module
End Namespace