diff --git a/README.md b/README.md index 91f66a4..2aa08e1 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ gst-launch-1.0 idsueyesrc config-file=ini/whole-presacler64_autoexp-binningx2.in ``` ## Network Streaming +see more at network_guide.md ### Sending Line Scan Data Over UDP diff --git a/scripts/recv_raw_rolling.py b/scripts/recv_raw_rolling.py index 42abf11..f8594d0 100644 --- a/scripts/recv_raw_rolling.py +++ b/scripts/recv_raw_rolling.py @@ -6,6 +6,11 @@ # "numpy", # ] # /// +# +# NOTE: For higher performance (200+ fps), see the Go implementation: +# scripts/go/main.go - Significantly faster, handles 200+ fps easily +# Build: Run scripts/build_go_receiver.ps1 (Windows) or scripts/build_go_receiver.sh (Linux/macOS) +# See scripts/go/README.md for setup instructions import socket import numpy as np @@ -41,6 +46,8 @@ UDP_IP = "0.0.0.0" UDP_PORT = 5000 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16777216) # 16MB buffer + sock.bind((UDP_IP, UDP_PORT)) print(f"Receiving raw {COLUMN_WIDTH}x{COLUMN_HEIGHT} RGB columns on UDP port {UDP_PORT}") diff --git a/scripts/udp_optimize.ps1 b/scripts/udp_optimize.ps1 new file mode 100644 index 0000000..f9dc6c2 --- /dev/null +++ b/scripts/udp_optimize.ps1 @@ -0,0 +1,232 @@ +# UDP Performance Optimization Script for Windows +# Run as Administrator +# +# Usage: +# .\udp_optimize.ps1 query - Show current settings +# .\udp_optimize.ps1 apply - Apply optimizations (backs up to udp_backup.reg) +# .\udp_optimize.ps1 revert - Restore from backup + +param( + [Parameter(Mandatory=$true)] + [ValidateSet("query", "apply", "revert")] + [string]$Action +) + +# Check if running as Administrator +$isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) +if (-not $isAdmin) { + Write-Error "This script must be run as Administrator!" + exit 1 +} + +$backupFile = "udp_backup.reg" + +# Define registry settings +$regSettings = @( + @{ + Path = "HKLM:\SYSTEM\CurrentControlSet\Services\AFD\Parameters" + Name = "DefaultReceiveWindow" + Type = "DWORD" + Value = 16777216 # 16MB + Description = "UDP Receive Buffer Size" + }, + @{ + Path = "HKLM:\SYSTEM\CurrentControlSet\Services\AFD\Parameters" + Name = "LargeBufferSize" + Type = "DWORD" + Value = 4096 + Description = "Large Buffer Size" + }, + @{ + Path = "HKLM:\SYSTEM\CurrentControlSet\Services\AFD\Parameters" + Name = "MediumBufferSize" + Type = "DWORD" + Value = 1504 + Description = "Medium Buffer Size" + }, + @{ + Path = "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" + Name = "TcpWindowSize" + Type = "DWORD" + Value = 65535 + Description = "TCP Window Size" + }, + @{ + Path = "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" + Name = "MaxConnectionsPerServer" + Type = "DWORD" + Value = 16 + Description = "Max Connections Per Server" + }, + @{ + Path = "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" + Name = "MaxFreeTcbs" + Type = "DWORD" + Value = 16000 + Description = "Max Free TCBs" + }, + @{ + Path = "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" + Name = "DefaultTTL" + Type = "DWORD" + Value = 64 + Description = "Default TTL" + } +) + +function Query-Settings { + Write-Host "`n=== Current UDP/TCP Performance Settings ===" -ForegroundColor Cyan + Write-Host "" + + foreach ($setting in $regSettings) { + $path = $setting.Path + $name = $setting.Name + + # Ensure path exists + if (-not (Test-Path $path)) { + Write-Host "[$name] Path does not exist: $path" -ForegroundColor Yellow + Write-Host " Description: $($setting.Description)" -ForegroundColor Gray + Write-Host " Current: NOT SET" -ForegroundColor Yellow + Write-Host " Recommended: $($setting.Value)" -ForegroundColor Green + Write-Host "" + continue + } + + try { + $currentValue = Get-ItemProperty -Path $path -Name $name -ErrorAction Stop + Write-Host "[$name] $($setting.Description)" -ForegroundColor White + Write-Host " Path: $path" -ForegroundColor Gray + Write-Host " Current: $($currentValue.$name)" -ForegroundColor Yellow + Write-Host " Recommended: $($setting.Value)" -ForegroundColor Green + } + catch { + Write-Host "[$name] $($setting.Description)" -ForegroundColor White + Write-Host " Path: $path" -ForegroundColor Gray + Write-Host " Current: NOT SET" -ForegroundColor Yellow + Write-Host " Recommended: $($setting.Value)" -ForegroundColor Green + } + Write-Host "" + } +} + +function Backup-Settings { + Write-Host "Creating backup..." -ForegroundColor Cyan + + $backupContent = "Windows Registry Editor Version 5.00`r`n`r`n" + + foreach ($setting in $regSettings) { + $path = $setting.Path + $name = $setting.Name + + if (Test-Path $path) { + try { + $currentValue = Get-ItemProperty -Path $path -Name $name -ErrorAction Stop + $regPath = $path -replace "HKLM:\\", "HKEY_LOCAL_MACHINE\" + $backupContent += "[$regPath]`r`n" + $backupContent += "`"$name`"=dword:$("{0:x8}" -f $currentValue.$name)`r`n`r`n" + } + catch { + # Value doesn't exist, note it in backup + $regPath = $path -replace "HKLM:\\", "HKEY_LOCAL_MACHINE\" + $backupContent += "; [$regPath]`r`n" + $backupContent += "; `"$name`" was not set`r`n`r`n" + } + } + } + + $backupContent | Out-File -FilePath $backupFile -Encoding ASCII + Write-Host "Backup saved to: $backupFile" -ForegroundColor Green +} + +function Apply-Settings { + Write-Host "`n=== Applying UDP/TCP Optimizations ===" -ForegroundColor Cyan + + # Create backup first + Backup-Settings + Write-Host "" + + $changedCount = 0 + + foreach ($setting in $regSettings) { + $path = $setting.Path + $name = $setting.Name + $value = $setting.Value + + # Ensure registry path exists + if (-not (Test-Path $path)) { + Write-Host "Creating registry path: $path" -ForegroundColor Yellow + New-Item -Path $path -Force | Out-Null + } + + try { + # Get current value + $currentValue = $null + try { + $current = Get-ItemProperty -Path $path -Name $name -ErrorAction Stop + $currentValue = $current.$name + } + catch { + $currentValue = $null + } + + if ($currentValue -eq $value) { + Write-Host "[UNCHANGED] $name = $value" -ForegroundColor Gray + } + else { + Set-ItemProperty -Path $path -Name $name -Value $value -Type $setting.Type + Write-Host "[APPLIED] $name = $value (was: $currentValue)" -ForegroundColor Green + $changedCount++ + } + } + catch { + Write-Host "[ERROR] Failed to set $name : $_" -ForegroundColor Red + } + } + + Write-Host "`n$changedCount settings changed." -ForegroundColor Cyan + + if ($changedCount -gt 0) { + Write-Host "`n⚠️ IMPORTANT: Restart your computer for changes to take effect!" -ForegroundColor Yellow + } +} + +function Revert-Settings { + if (-not (Test-Path $backupFile)) { + Write-Error "Backup file not found: $backupFile" + Write-Host "Run 'apply' first to create a backup, or restore manually." -ForegroundColor Yellow + exit 1 + } + + Write-Host "`n=== Reverting to Backed Up Settings ===" -ForegroundColor Cyan + Write-Host "Importing: $backupFile" -ForegroundColor Yellow + + try { + $result = reg import $backupFile 2>&1 + + if ($LASTEXITCODE -eq 0) { + Write-Host "Settings restored successfully!" -ForegroundColor Green + Write-Host "`n⚠️ IMPORTANT: Restart your computer for changes to take effect!" -ForegroundColor Yellow + } + else { + Write-Error "Failed to import registry file: $result" + } + } + catch { + Write-Error "Error importing registry: $_" + } +} + +# Main execution +switch ($Action) { + "query" { + Query-Settings + } + "apply" { + Apply-Settings + } + "revert" { + Revert-Settings + } +} + +Write-Host "`nDone!" -ForegroundColor Cyan \ No newline at end of file