<# .SYNOPSIS Mediane FrameTime et decompte des images longues d'un CSV du profileur (session C). .EXAMPLE .\Tools\SummarizeDebugCsv.ps1 -Csv D:\Game\LifePlay_Backup_5.5\Dbg-I6\SessionC\Profiling\CSV #> param( [Parameter(Mandatory)][string]$Csv ) $ErrorActionPreference = 'Stop' $files = @() if (Test-Path $Csv -PathType Container) { $files = @(Get-ChildItem $Csv -Filter '*.csv' -File) } elseif (Test-Path $Csv) { $files = @(Get-Item $Csv) } if ($files.Count -lt 1) { Write-Error "CSV introuvable : $Csv" } function Median([double[]]$Values) { $s = @($Values | Sort-Object) if ($s.Count -eq 0) { return [double]::NaN } $mid = [int][math]::Floor($s.Count / 2) if ($s.Count % 2) { return [double]$s[$mid] } return ([double]$s[$mid - 1] + [double]$s[$mid]) / 2.0 } $frame = New-Object System.Collections.Generic.List[double] $game = New-Object System.Collections.Generic.List[double] $over100 = 0 $over50 = 0 $physicsMb = $null foreach ($file in $files) { $rows = Import-Csv $file.FullName $hasFrame = $rows.Count -gt 0 -and ($rows[0].PSObject.Properties.Name -contains 'FrameTime') if (-not $hasFrame) { continue } foreach ($row in $rows) { $ft = 0.0 if (-not [double]::TryParse($row.FrameTime, [Globalization.NumberStyles]::Float, [Globalization.CultureInfo]::InvariantCulture, [ref]$ft)) { continue } $frame.Add($ft) if ($ft -gt 100) { $over100++ } if ($ft -gt 50) { $over50++ } if ($row.PSObject.Properties.Name -contains 'GameThreadTime') { $gt = 0.0 if ([double]::TryParse($row.GameThreadTime, [Globalization.NumberStyles]::Float, [Globalization.CultureInfo]::InvariantCulture, [ref]$gt)) { $game.Add($gt) } } } if ($rows.Count -gt 0 -and $rows[0].PSObject.Properties.Name -contains 'LLM/Physics/Chaos') { $last = $rows[$rows.Count - 1].'LLM/Physics/Chaos' $bytes = 0.0 if ([double]::TryParse($last, [Globalization.NumberStyles]::Float, [Globalization.CultureInfo]::InvariantCulture, [ref]$bytes)) { $physicsMb = [math]::Round($bytes / 1MB, 1) } } } if ($frame.Count -lt 1) { Write-Error "Colonne FrameTime absente dans $Csv" } $med = Median $frame.ToArray() $medGame = Median $game.ToArray() Write-Host ("Fichiers={0} Images={1} MedianeFrameTimeMs={2:N2} MedianeGameThreadMs={3:N2} ImagesGt50ms={4} ImagesGt100ms={5} PhysicsChaosMB={6}" -f ` $files.Count, $frame.Count, $med, $medGame, $over50, $over100, $physicsMb) exit 0