diff --git a/installer/PSLauncher.iss b/installer/PSLauncher.iss index 2a21121..54aeff3 100644 --- a/installer/PSLauncher.iss +++ b/installer/PSLauncher.iss @@ -11,7 +11,7 @@ #define MyAppName "PROSERVE Launcher" #define MyAppShortName "PS_Launcher" -#define MyAppVersion "0.18.0" +#define MyAppVersion "0.19.0" #define MyAppPublisher "ASTERION VR" #define MyAppURL "https://asterionvr.com" #define MyAppExeName "PS_Launcher.exe" diff --git a/src/PSLauncher.App/App.xaml.cs b/src/PSLauncher.App/App.xaml.cs index ca5ef35..1490fd4 100644 --- a/src/PSLauncher.App/App.xaml.cs +++ b/src/PSLauncher.App/App.xaml.cs @@ -112,16 +112,16 @@ public partial class App : Application services.AddSingleton(sp => { // Handler tuné pour les gros téléchargements parallèles : - // - MaxConnectionsPerServer=16 pour autoriser le multi-segment (8 par défaut). - // - AutomaticDecompression sur l'API JSON uniquement (None ici car les builds - // sont des ZIPs déjà compressés ; éviter la CPU+RAM gaspillée par un éventuel - // wrapping gzip côté serveur). + // - MaxConnectionsPerServer=32 pour aligner avec le clamp DownloadManager (8-32). + // Default WPF = 8 → trop bas pour notre multi-segment. + // - AutomaticDecompression=None : les builds sont des ZIPs déjà compressés ; + // éviter la CPU+RAM gaspillée par un éventuel wrapping gzip côté serveur. // - PooledConnectionLifetime court pour éviter qu'OVH ferme nos sockets sous nous. var handler = new SocketsHttpHandler { PooledConnectionLifetime = TimeSpan.FromMinutes(5), PooledConnectionIdleTimeout = TimeSpan.FromSeconds(60), - MaxConnectionsPerServer = 16, + MaxConnectionsPerServer = 32, EnableMultipleHttp2Connections = true, AutomaticDecompression = System.Net.DecompressionMethods.None, }; diff --git a/src/PSLauncher.App/PSLauncher.App.csproj b/src/PSLauncher.App/PSLauncher.App.csproj index f7ac82d..054698d 100644 --- a/src/PSLauncher.App/PSLauncher.App.csproj +++ b/src/PSLauncher.App/PSLauncher.App.csproj @@ -15,9 +15,9 @@ PROSERVE Launcher © 2026 ASTERION VR — All rights reserved PSLauncher.App - 0.18.0 - 0.18.0.0 - 0.18.0.0 + 0.19.0 + 0.19.0.0 + 0.19.0.0 true diff --git a/src/PSLauncher.App/ViewModels/SettingsViewModel.cs b/src/PSLauncher.App/ViewModels/SettingsViewModel.cs index 8cc218a..e8ee19e 100644 --- a/src/PSLauncher.App/ViewModels/SettingsViewModel.cs +++ b/src/PSLauncher.App/ViewModels/SettingsViewModel.cs @@ -49,6 +49,7 @@ public sealed partial class SettingsViewModel : ObservableObject [ObservableProperty] private string _language; [ObservableProperty] private string _reportUrl; [ObservableProperty] private string _documentationUrl; + [ObservableProperty] private int _parallelSegments; // ----- DB Migration settings ----- [ObservableProperty] private string _dbHost; @@ -173,6 +174,7 @@ public sealed partial class SettingsViewModel : ObservableObject _language = string.IsNullOrWhiteSpace(config.Language) ? "auto" : config.Language; _reportUrl = config.ReportUrl; _documentationUrl = config.DocumentationUrl; + _parallelSegments = config.ParallelDownloadSegments; _dbHost = config.Database.Host; _dbPort = config.Database.Port; @@ -303,6 +305,7 @@ public sealed partial class SettingsViewModel : ObservableObject _config.Language = Language ?? "auto"; _config.ReportUrl = ReportUrl?.Trim() ?? ""; _config.DocumentationUrl = DocumentationUrl?.Trim() ?? ""; + _config.ParallelDownloadSegments = Math.Clamp(ParallelSegments, 1, 32); // DB settings _config.Database.Host = DbHost.Trim(); diff --git a/src/PSLauncher.App/Views/SettingsDialog.xaml b/src/PSLauncher.App/Views/SettingsDialog.xaml index 59cdc27..250cc22 100644 --- a/src/PSLauncher.App/Views/SettingsDialog.xaml +++ b/src/PSLauncher.App/Views/SettingsDialog.xaml @@ -230,6 +230,19 @@ Background="#1A1A20" Foreground="{StaticResource Brush.Text.Primary}" BorderBrush="{StaticResource Brush.Border}" BorderThickness="1" Padding="8" FontFamily="Consolas" /> + + + + + diff --git a/src/PSLauncher.Core/Downloads/DownloadManager.cs b/src/PSLauncher.Core/Downloads/DownloadManager.cs index 76c7027..522ec06 100644 --- a/src/PSLauncher.Core/Downloads/DownloadManager.cs +++ b/src/PSLauncher.Core/Downloads/DownloadManager.cs @@ -176,7 +176,10 @@ public sealed class DownloadManager : IDownloadManager } // 2. Choix single vs multi-segment - var requestedSegments = Math.Clamp(_config.ParallelDownloadSegments, 1, 16); + // Hard-cap à 32 : au-delà OVH mutualisé risque le rate-limit per-IP et le + // gain marginal devient négatif. 16 = défaut, 24-32 OK pour les serveurs + // qui le supportent. 1 = comportement single-segment legacy. + var requestedSegments = Math.Clamp(_config.ParallelDownloadSegments, 1, 32); var useMultiSegment = requestedSegments > 1 && job.ExpectedSize >= MultiSegmentMinSize && (existing is null || existing.Segments.Count > 0); diff --git a/src/PSLauncher.Core/Localization/Strings.cs b/src/PSLauncher.Core/Localization/Strings.cs index 5e66921..913181e 100644 --- a/src/PSLauncher.Core/Localization/Strings.cs +++ b/src/PSLauncher.Core/Localization/Strings.cs @@ -177,6 +177,21 @@ public static class Strings $"تعذر تحميل {url}\n\n{detail}\n\nتأكد من تشغيل XAMPP وأن العنوان صحيح (الإعدادات → متقدم)." ); + public static string SettingsParallelSegments => T( + "Connexions parallèles pour les téléchargements (1-32, défaut 16)", + "Parallel connections for downloads (1-32, default 16)", + "下载的并行连接数 (1-32,默认 16)", + "การเชื่อมต่อแบบขนานสำหรับการดาวน์โหลด (1-32, ค่าเริ่มต้น 16)", + "اتصالات متوازية للتنزيلات (1-32، الافتراضي 16)" + ); + public static string SettingsParallelSegmentsHint => T( + "Plus de connexions = débit pic plus élevé et queue de fin de DL plus courte. Au-delà de 16 le serveur peut throttler.", + "More connections = higher peak throughput and shorter end-of-DL tail. Above 16 the server may throttle.", + "更多连接 = 更高的峰值吞吐量和更短的下载尾部。超过 16 服务器可能会限速。", + "การเชื่อมต่อมากขึ้น = ปริมาณงานสูงสุดมากขึ้นและส่วนท้ายของการดาวน์โหลดสั้นลง สูงกว่า 16 เซิร์ฟเวอร์อาจจำกัด", + "اتصالات أكثر = إنتاجية ذروة أعلى وذيل تنزيل أقصر. فوق 16 قد يقيّد الخادم." + ); + public static string SettingsAdvanced => T( "▸ PARAMÈTRES AVANCÉS (serveur, installation, base de données, logs)", "▸ ADVANCED SETTINGS (server, installation, database, logs)", diff --git a/src/PSLauncher.Models/LocalConfig.cs b/src/PSLauncher.Models/LocalConfig.cs index 7cf0dbc..5a170c6 100644 --- a/src/PSLauncher.Models/LocalConfig.cs +++ b/src/PSLauncher.Models/LocalConfig.cs @@ -16,9 +16,13 @@ public sealed class LocalConfig /// /// Nombre de connexions HTTP parallèles utilisées pour télécharger un build. /// 1 = comportement legacy single-connection. 4-8 contourne le throttling - /// per-connection d'Apache/OVH mutualisé. 8 est un bon défaut. + /// per-connection d'Apache/OVH mutualisé. 16 = défaut depuis v0.19 pour + /// raccourcir la « queue » en fin de DL : avec 8 segments sur 14 Go, le + /// dernier segment doit finir seul ~1.75 Go (visible comme un effondrement + /// du débit en fin de course) ; avec 16, c'est ~875 Mo. Push à 24/32 si + /// ton serveur l'accepte (OVH mutualisé tient bien jusqu'à 16-24). /// - public int ParallelDownloadSegments { get; set; } = 8; + public int ParallelDownloadSegments { get; set; } = 16; /// /// Si false, ignore la vérification SHA-256 même si le manifest l'exige. diff --git a/src/PSLauncher.Updater/PSLauncher.Updater.csproj b/src/PSLauncher.Updater/PSLauncher.Updater.csproj index cbc0bab..f9f6501 100644 --- a/src/PSLauncher.Updater/PSLauncher.Updater.csproj +++ b/src/PSLauncher.Updater/PSLauncher.Updater.csproj @@ -8,7 +8,7 @@ latest PS_Launcher.Updater PSLauncher.Updater - 0.18.0 + 0.19.0 ..\PSLauncher.App\Resources\favicon.ico ASTERION VR © 2026 ASTERION VR — All rights reserved