41
41
modelText , PowerChart , NetworkInfo , helpText * w.Paragraph
42
42
grid * ui.Grid
43
43
processList * w.List
44
- sparkline * w.Sparkline
45
- sparklineGroup * w.SparklineGroup
44
+ sparkline , gpuSparkline * w.Sparkline
45
+ sparklineGroup , gpuSparklineGroup * w.SparklineGroup
46
46
cpuCoreWidget * CPUCoreWidget
47
47
selectedProcess int
48
48
powerValues = make ([]float64 , 35 )
67
67
maxPowerSeen = 0.1
68
68
powerHistory = make ([]float64 , 100 )
69
69
maxPower = 0.0 // Track maximum power for better scaling
70
+ gpuValues = make ([]float64 , 65 )
70
71
)
71
72
72
73
type CPUUsage struct {
@@ -392,13 +393,22 @@ func setupUI() {
392
393
termWidth , _ := ui .TerminalDimensions ()
393
394
numPoints := (termWidth / 2 ) / 2
394
395
powerValues = make ([]float64 , numPoints )
396
+ gpuValues = make ([]float64 , numPoints )
395
397
396
398
sparkline = w .NewSparkline ()
397
399
sparkline .LineColor = ui .ColorGreen
398
400
sparkline .MaxHeight = 10
399
401
sparkline .Data = powerValues
400
402
401
403
sparklineGroup = w .NewSparklineGroup (sparkline )
404
+
405
+ gpuSparkline = w .NewSparkline ()
406
+ gpuSparkline .LineColor = ui .ColorGreen
407
+ gpuSparkline .MaxHeight = 10
408
+ gpuSparkline .Data = gpuValues
409
+ gpuSparklineGroup = w .NewSparklineGroup (gpuSparkline )
410
+ gpuSparklineGroup .Title = "GPU Usage History"
411
+
402
412
updateProcessList ()
403
413
404
414
cpuCoreWidget = NewCPUCoreWidget (appleSiliconModel )
@@ -422,6 +432,7 @@ func setupGrid() {
422
432
grid .Set (
423
433
ui .NewRow (1.0 / 4 ,
424
434
ui .NewCol (1.0 , cpuGauge ),
435
+ // ui.NewCol(1.0/2, gpuSparklineGroup),
425
436
),
426
437
ui .NewRow (2.0 / 4 ,
427
438
ui .NewCol (1.0 / 2 ,
@@ -1088,9 +1099,25 @@ func collectMetrics(done chan struct{}, cpumetricsChan chan CPUMetrics, gpumetri
1088
1099
case <- done :
1089
1100
cmd .Process .Kill ()
1090
1101
return
1091
- case cpumetricsChan <- parseCPUMetrics (data , NewCPUMetrics ()):
1092
- case gpumetricsChan <- parseGPUMetrics (data ):
1093
- case netdiskMetricsChan <- parseNetDiskMetrics (data ):
1102
+ default :
1103
+ // Send all metrics at once
1104
+ cpuMetrics := parseCPUMetrics (data , NewCPUMetrics ())
1105
+ gpuMetrics := parseGPUMetrics (data )
1106
+ netdiskMetrics := parseNetDiskMetrics (data )
1107
+
1108
+ // Non-blocking sends
1109
+ select {
1110
+ case cpumetricsChan <- cpuMetrics :
1111
+ default :
1112
+ }
1113
+ select {
1114
+ case gpumetricsChan <- gpuMetrics :
1115
+ default :
1116
+ }
1117
+ select {
1118
+ case netdiskMetricsChan <- netdiskMetrics :
1119
+ default :
1120
+ }
1094
1121
}
1095
1122
}
1096
1123
}
@@ -1249,6 +1276,30 @@ func updateCPUUI(cpuMetrics CPUMetrics) {
1249
1276
func updateGPUUI (gpuMetrics GPUMetrics ) {
1250
1277
gpuGauge .Title = fmt .Sprintf ("GPU Usage: %d%% @ %d MHz" , int (gpuMetrics .Active ), gpuMetrics .FreqMHz )
1251
1278
gpuGauge .Percent = int (gpuMetrics .Active )
1279
+
1280
+ // Add GPU history tracking
1281
+ for i := 0 ; i < len (gpuValues )- 1 ; i ++ {
1282
+ gpuValues [i ] = gpuValues [i + 1 ]
1283
+ }
1284
+ gpuValues [len (gpuValues )- 1 ] = float64 (gpuMetrics .Active )
1285
+
1286
+ // Calculate average GPU usage
1287
+ var sum float64
1288
+ count := 0
1289
+ for _ , v := range gpuValues {
1290
+ if v > 0 {
1291
+ sum += v
1292
+ count ++
1293
+ }
1294
+ }
1295
+ avgGPU := 0.0
1296
+ if count > 0 {
1297
+ avgGPU = sum / float64 (count )
1298
+ }
1299
+
1300
+ gpuSparkline .Data = gpuValues
1301
+ gpuSparkline .MaxVal = 100 // GPU usage is 0-100%
1302
+ gpuSparklineGroup .Title = fmt .Sprintf ("GPU: %d%% (Avg: %.1f%%)" , gpuMetrics .Active , avgGPU )
1252
1303
}
1253
1304
1254
1305
func getDiskStorage () (total , used , available string ) {
0 commit comments