63 lines
2.5 KiB
PowerShell
63 lines
2.5 KiB
PowerShell
<#
|
|
.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
|