From fcbf4022c394cdec00f458c8230dc7c7d3b92bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E9=A3=9E?= <1835698775@qq.com> Date: Thu, 17 Sep 2026 13:15:08 +0800 Subject: [PATCH] =?UTF-8?q?fix(one-assets):=20=E6=94=B6=E7=BC=A9=20SSH=20?= =?UTF-8?q?=E5=BD=A9=E8=89=B2=E5=9B=BE=E6=A0=87=E5=9B=BA=E6=9C=89=E5=B0=BA?= =?UTF-8?q?=E5=AF=B8=EF=BC=8C=E9=81=BF=E5=85=8D=20img=20=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E5=86=85=E5=AD=98=E6=9A=B4=E6=B6=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 彩色图标走 gpui-component 的 img() 分支,按 SVG 固有尺寸栅格化并乘 SMOOTH_SVG_SCALE_FACTOR(2),再缓存进 App 的 asset cache。28 个 SSH 图标 固有尺寸为 1024x1024,单个解码后 2048x2048x4 = 16 MiB,一次渲染约 1.3 GiB (CPU BGRA + resvg pixmap + GPU 纹理),关闭窗口也不释放。 将 28 个 *_color.svg 根标签 width/height 改为 48,viewBox 保持 1024, 单个约 36 KiB。新增 icon_assets_are_not_oversized 测试,限制图标固有 尺寸不超过 256,防止回归。Refs #185 --- .../one-assets/assets/icons/alinux_color.svg | 2 +- .../assets/icons/almalinux_color.svg | 2 +- .../one-assets/assets/icons/alpine_color.svg | 2 +- .../one-assets/assets/icons/amazon_color.svg | 2 +- crates/one-assets/assets/icons/arch_color.svg | 2 +- .../one-assets/assets/icons/centos_color.svg | 2 +- .../one-assets/assets/icons/cisco_color.svg | 2 +- .../one-assets/assets/icons/debian_color.svg | 2 +- .../one-assets/assets/icons/docker_color.svg | 2 +- .../one-assets/assets/icons/fedora_color.svg | 2 +- .../assets/icons/fortinet_color.svg | 2 +- .../one-assets/assets/icons/freebsd_color.svg | 2 +- crates/one-assets/assets/icons/h3c_color.svg | 2 +- crates/one-assets/assets/icons/hpe_color.svg | 2 +- .../one-assets/assets/icons/huawei_color.svg | 2 +- .../one-assets/assets/icons/juniper_color.svg | 2 +- crates/one-assets/assets/icons/kali_color.svg | 2 +- .../assets/icons/linux_penguin_color.svg | 2 +- .../one-assets/assets/icons/macos_color.svg | 2 +- .../assets/icons/mikrotik_color.svg | 2 +- .../assets/icons/openeuler_color.svg | 2 +- .../assets/icons/opensuse_color.svg | 2 +- .../assets/icons/paloalto_color.svg | 2 +- .../one-assets/assets/icons/redhat_color.svg | 2 +- .../one-assets/assets/icons/rocky_color.svg | 2 +- .../one-assets/assets/icons/ubuntu_color.svg | 2 +- .../one-assets/assets/icons/windows_color.svg | 2 +- .../one-assets/assets/icons/zyxel_color.svg | 2 +- crates/one-assets/src/lib.rs | 37 +++++++++++++++++++ 29 files changed, 65 insertions(+), 28 deletions(-) diff --git a/crates/one-assets/assets/icons/alinux_color.svg b/crates/one-assets/assets/icons/alinux_color.svg index 370ea93d4..3286ef057 100644 --- a/crates/one-assets/assets/icons/alinux_color.svg +++ b/crates/one-assets/assets/icons/alinux_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/almalinux_color.svg b/crates/one-assets/assets/icons/almalinux_color.svg index ad32ef688..5c512c050 100644 --- a/crates/one-assets/assets/icons/almalinux_color.svg +++ b/crates/one-assets/assets/icons/almalinux_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/alpine_color.svg b/crates/one-assets/assets/icons/alpine_color.svg index db4e7815c..53de26f54 100644 --- a/crates/one-assets/assets/icons/alpine_color.svg +++ b/crates/one-assets/assets/icons/alpine_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/amazon_color.svg b/crates/one-assets/assets/icons/amazon_color.svg index 3b8b975f4..e82f3e202 100644 --- a/crates/one-assets/assets/icons/amazon_color.svg +++ b/crates/one-assets/assets/icons/amazon_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/arch_color.svg b/crates/one-assets/assets/icons/arch_color.svg index 468dca46c..908e15ad4 100644 --- a/crates/one-assets/assets/icons/arch_color.svg +++ b/crates/one-assets/assets/icons/arch_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/centos_color.svg b/crates/one-assets/assets/icons/centos_color.svg index 05dc41763..7605684a6 100644 --- a/crates/one-assets/assets/icons/centos_color.svg +++ b/crates/one-assets/assets/icons/centos_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/cisco_color.svg b/crates/one-assets/assets/icons/cisco_color.svg index 65564ea16..73299de86 100644 --- a/crates/one-assets/assets/icons/cisco_color.svg +++ b/crates/one-assets/assets/icons/cisco_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/debian_color.svg b/crates/one-assets/assets/icons/debian_color.svg index f216e9145..6d82d6ede 100644 --- a/crates/one-assets/assets/icons/debian_color.svg +++ b/crates/one-assets/assets/icons/debian_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/docker_color.svg b/crates/one-assets/assets/icons/docker_color.svg index 58b4e2c75..c454f3b1f 100644 --- a/crates/one-assets/assets/icons/docker_color.svg +++ b/crates/one-assets/assets/icons/docker_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/fedora_color.svg b/crates/one-assets/assets/icons/fedora_color.svg index 6b48cb409..1a6f69a1b 100644 --- a/crates/one-assets/assets/icons/fedora_color.svg +++ b/crates/one-assets/assets/icons/fedora_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/fortinet_color.svg b/crates/one-assets/assets/icons/fortinet_color.svg index fc25f3d13..2de5dd287 100644 --- a/crates/one-assets/assets/icons/fortinet_color.svg +++ b/crates/one-assets/assets/icons/fortinet_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/freebsd_color.svg b/crates/one-assets/assets/icons/freebsd_color.svg index 71981f90f..dcf6e7537 100644 --- a/crates/one-assets/assets/icons/freebsd_color.svg +++ b/crates/one-assets/assets/icons/freebsd_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/h3c_color.svg b/crates/one-assets/assets/icons/h3c_color.svg index 8643f408b..7ed2a657f 100644 --- a/crates/one-assets/assets/icons/h3c_color.svg +++ b/crates/one-assets/assets/icons/h3c_color.svg @@ -1,4 +1,4 @@ - + + diff --git a/crates/one-assets/assets/icons/huawei_color.svg b/crates/one-assets/assets/icons/huawei_color.svg index fcb6584c2..2cdaaddd9 100644 --- a/crates/one-assets/assets/icons/huawei_color.svg +++ b/crates/one-assets/assets/icons/huawei_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/juniper_color.svg b/crates/one-assets/assets/icons/juniper_color.svg index 27a7194c1..63c0e2359 100644 --- a/crates/one-assets/assets/icons/juniper_color.svg +++ b/crates/one-assets/assets/icons/juniper_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/kali_color.svg b/crates/one-assets/assets/icons/kali_color.svg index 856791f2a..ac2338ecf 100644 --- a/crates/one-assets/assets/icons/kali_color.svg +++ b/crates/one-assets/assets/icons/kali_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/linux_penguin_color.svg b/crates/one-assets/assets/icons/linux_penguin_color.svg index 4a703b387..3d92412c4 100644 --- a/crates/one-assets/assets/icons/linux_penguin_color.svg +++ b/crates/one-assets/assets/icons/linux_penguin_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/macos_color.svg b/crates/one-assets/assets/icons/macos_color.svg index f0762d1ea..9ffb68d12 100644 --- a/crates/one-assets/assets/icons/macos_color.svg +++ b/crates/one-assets/assets/icons/macos_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/mikrotik_color.svg b/crates/one-assets/assets/icons/mikrotik_color.svg index 68fcdc348..1df0947c0 100644 --- a/crates/one-assets/assets/icons/mikrotik_color.svg +++ b/crates/one-assets/assets/icons/mikrotik_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/openeuler_color.svg b/crates/one-assets/assets/icons/openeuler_color.svg index 86041613d..f9b3d3d2e 100644 --- a/crates/one-assets/assets/icons/openeuler_color.svg +++ b/crates/one-assets/assets/icons/openeuler_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/opensuse_color.svg b/crates/one-assets/assets/icons/opensuse_color.svg index 536dc6a53..f9b9fbb6e 100644 --- a/crates/one-assets/assets/icons/opensuse_color.svg +++ b/crates/one-assets/assets/icons/opensuse_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/paloalto_color.svg b/crates/one-assets/assets/icons/paloalto_color.svg index 1ca4c9e3a..5974e4e5f 100644 --- a/crates/one-assets/assets/icons/paloalto_color.svg +++ b/crates/one-assets/assets/icons/paloalto_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/redhat_color.svg b/crates/one-assets/assets/icons/redhat_color.svg index 3f6d08584..559accb66 100644 --- a/crates/one-assets/assets/icons/redhat_color.svg +++ b/crates/one-assets/assets/icons/redhat_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/rocky_color.svg b/crates/one-assets/assets/icons/rocky_color.svg index 98f9e13b3..a68c804f9 100644 --- a/crates/one-assets/assets/icons/rocky_color.svg +++ b/crates/one-assets/assets/icons/rocky_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/ubuntu_color.svg b/crates/one-assets/assets/icons/ubuntu_color.svg index 7b084f500..d5339865e 100644 --- a/crates/one-assets/assets/icons/ubuntu_color.svg +++ b/crates/one-assets/assets/icons/ubuntu_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/windows_color.svg b/crates/one-assets/assets/icons/windows_color.svg index 8887b3995..bdc03ed74 100644 --- a/crates/one-assets/assets/icons/windows_color.svg +++ b/crates/one-assets/assets/icons/windows_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/assets/icons/zyxel_color.svg b/crates/one-assets/assets/icons/zyxel_color.svg index 4f0242c58..4db06bc0d 100644 --- a/crates/one-assets/assets/icons/zyxel_color.svg +++ b/crates/one-assets/assets/icons/zyxel_color.svg @@ -1,4 +1,4 @@ - + diff --git a/crates/one-assets/src/lib.rs b/crates/one-assets/src/lib.rs index 4186003ce..68bd7bcd6 100644 --- a/crates/one-assets/src/lib.rs +++ b/crates/one-assets/src/lib.rs @@ -131,4 +131,41 @@ mod tests { assert_eq!(IconName::MongoDB.path().as_ref(), "icons/mongodb.svg"); assert_eq!(IconName::ArrowUp.path().as_ref(), "icons/arrow-up.svg"); } + + // Color icons go through gpui-component's `img(...)` path, which decodes + // SVGs at their intrinsic size and rasterizes at 2x (SMOOTH_SVG_SCALE_FACTOR). + // A 1024x1024 icon costs ~16 MiB of retained BGRA memory per icon. Keep + // intrinsic dimensions small; see issue #185. + #[test] + fn icon_assets_are_not_oversized() { + const MAX_DIMENSION: f32 = 256.0; + let dir = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/icons"); + for entry in std::fs::read_dir(&dir).expect("read icons dir") { + let path = entry.expect("dir entry").path(); + if path.extension().and_then(|ext| ext.to_str()) != Some("svg") { + continue; + } + let svg = std::fs::read_to_string(&path).expect("read svg"); + let root = svg + .split_once("')) + .map(|(tag, _)| tag) + .expect("svg root tag"); + for attr in ["width", "height"] { + let prefix = format!("{attr}=\""); + let value = root + .split_whitespace() + .find_map(|part| part.strip_prefix(&prefix)) + .and_then(|rest| rest.split('"').next()) + .and_then(|value| value.parse::().ok()); + if let Some(value) = value { + assert!( + value <= MAX_DIMENSION, + "{} has intrinsic {attr}={value}; oversized color icons leak memory (issue #185)", + path.display() + ); + } + } + } + } }