4141 modelText , PowerChart , NetworkInfo , helpText * w.Paragraph
4242 grid * ui.Grid
4343 processList * w.List
44- sparkline * w.Sparkline
45- sparklineGroup * w.SparklineGroup
44+ sparkline , gpuSparkline * w.Sparkline
45+ sparklineGroup , gpuSparklineGroup * w.SparklineGroup
4646 cpuCoreWidget * CPUCoreWidget
4747 selectedProcess int
4848 powerValues = make ([]float64 , 35 )
6767 maxPowerSeen = 0.1
6868 powerHistory = make ([]float64 , 100 )
6969 maxPower = 0.0 // Track maximum power for better scaling
70+ gpuValues = make ([]float64 , 65 )
7071)
7172
7273type CPUUsage struct {
@@ -392,13 +393,22 @@ func setupUI() {
392393 termWidth , _ := ui .TerminalDimensions ()
393394 numPoints := (termWidth / 2 ) / 2
394395 powerValues = make ([]float64 , numPoints )
396+ gpuValues = make ([]float64 , numPoints )
395397
396398 sparkline = w .NewSparkline ()
397399 sparkline .LineColor = ui .ColorGreen
398400 sparkline .MaxHeight = 10
399401 sparkline .Data = powerValues
400402
401403 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+
402412 updateProcessList ()
403413
404414 cpuCoreWidget = NewCPUCoreWidget (appleSiliconModel )
@@ -422,6 +432,7 @@ func setupGrid() {
422432 grid .Set (
423433 ui .NewRow (1.0 / 4 ,
424434 ui .NewCol (1.0 , cpuGauge ),
435+ // ui.NewCol(1.0/2, gpuSparklineGroup),
425436 ),
426437 ui .NewRow (2.0 / 4 ,
427438 ui .NewCol (1.0 / 2 ,
@@ -1088,9 +1099,25 @@ func collectMetrics(done chan struct{}, cpumetricsChan chan CPUMetrics, gpumetri
10881099 case <- done :
10891100 cmd .Process .Kill ()
10901101 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+ }
10941121 }
10951122 }
10961123}
@@ -1249,6 +1276,30 @@ func updateCPUUI(cpuMetrics CPUMetrics) {
12491276func updateGPUUI (gpuMetrics GPUMetrics ) {
12501277 gpuGauge .Title = fmt .Sprintf ("GPU Usage: %d%% @ %d MHz" , int (gpuMetrics .Active ), gpuMetrics .FreqMHz )
12511278 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 )
12521303}
12531304
12541305func getDiskStorage () (total , used , available string ) {
0 commit comments