背景
我用独立悬浮宠物形态(surfaceMode = floatingPet),「宠物大小」已经调到最大的「较大」,但在 16" MacBook Pro 内置屏上还是偏小。
翻了下代码,发现这不是我没调对,而是当前尺寸的可调范围确实很窄,所以来提个需求。
现状
PingIsland/UI/Views/DetachedIslandPanelView.swift(v0.28.3):
init(scale: CGFloat) {
let sanitizedScale = min(max(scale, 1), 1.22) // 硬上限 1.22
...
self.mascotDisplaySize = 46 * sanitizedScale
}
static func resolutionScale(for screenRect: CGRect, sizeMode: FloatingPetSizeMode) -> CGFloat {
switch sizeMode {
case .standard: return 1
case .automatic: return automaticResolutionScale(for: screenRect)
case .large: return max(1.16, automaticResolutionScale(for: screenRect))
}
}
private static func automaticResolutionScale(for screenRect: CGRect) -> CGFloat {
let baseArea: CGFloat = 1440 * 900
let area = max(screenRect.width * screenRect.height, baseArea)
let linearScale = sqrt(area / baseArea)
return min(1.22, 1 + ((linearScale - 1) * 0.45))
}
按这段逻辑算了下各档位的实际结果(我的机器:MacBook Pro 16",逻辑分辨率 1728×1117):
| 档位 |
scale |
mascotDisplaySize |
| 标准 |
1.000 |
46.00 pt |
| 自动 |
1.099 |
50.56 pt |
| 较大 |
1.160 |
53.36 pt |
| 理论上限(clamp 1.22) |
1.220 |
56.12 pt |
两个观察:
1. 在 MacBook 内置屏上,「较大」恒等于 1.16。
automatic 要超过 1.16,需要逻辑分辨率面积 ≥ 2,381,439 pt²(同比例下约 1919×1241 pt)。内置屏无论选哪个缩放档都到不了:
| 逻辑分辨率 |
automatic |
large |
mascot |
| 1512×982(更大文字) |
1.032 |
1.160 |
53.36 pt |
| 1728×1117(默认) |
1.099 |
1.160 |
53.36 pt |
| 1920×1080(更多空间) |
1.119 |
1.160 |
53.36 pt |
| 2560×1440(27" 5K 外接) |
1.220 |
1.220 |
56.12 pt |
也就是说 max(1.16, automatic) 里的 automatic 在内置屏上永远不生效,换任何缩放档宠物的点尺寸都不变。
2. 三个档位 + 所有显示器加起来,宠物的总可调范围只有 46 → 56.12 pt(+22%),而内置屏用户实际只能拿到 46 → 53.36 pt(+16%)。「较大」相对「标准」只大了 16%,比档位名字给人的预期小不少。
期望
希望能有一个明显更大的选项,下面任选其一就行:
- 新增
extraLarge(超大)档,比如 scale 1.5 / 1.75;
- 把「宠物大小」改成滑杆(比如 0.8×–2.0×),跟已有的「设置面板大小」「文字大小」保持一致的交互;
- 最小改动:放宽
sanitizedScale 的 clamp 上限,并让 large 用一个不依赖分辨率的固定值(现状是内置屏上分辨率这一维本来就没起作用)。
附注:放大应该是低风险的
宠物是 MascotView 的 SwiftUI Canvas 矢量绘制,而且 DetachedFloatingMascotView 已经在按 mascotRenderScale = 1.75 超采样渲染后再缩回去:
private var renderSize: CGFloat {
petMetrics.mascotDisplaySize * DetachedIslandPanelMetrics.mascotRenderScale
}
private var displayScale: CGFloat {
petMetrics.mascotDisplaySize / renderSize
}
所以放大本身不会糊。需要跟着调的主要是 petVisualFrame / petHitFrame / badgeOffset / floatingUsageBoltVerticalOffset —— 这几个已经统一按 sanitizedScale 联动了,以及气泡(DetachedIslandBubblePlacement)的避让边界。
如果方向 OK,我也可以来提 PR。
环境
- Ping Island 0.28.3 (build 76)
- macOS 26.2 (25C56),MacBook Pro 16",内置 Liquid Retina XDR,逻辑分辨率 1728×1117,backingScale 2.0
- 形态:独立悬浮宠物(
surfaceMode = floatingPet,floatingPetSizeMode = large)
背景
我用独立悬浮宠物形态(
surfaceMode = floatingPet),「宠物大小」已经调到最大的「较大」,但在 16" MacBook Pro 内置屏上还是偏小。翻了下代码,发现这不是我没调对,而是当前尺寸的可调范围确实很窄,所以来提个需求。
现状
PingIsland/UI/Views/DetachedIslandPanelView.swift(v0.28.3):按这段逻辑算了下各档位的实际结果(我的机器:MacBook Pro 16",逻辑分辨率 1728×1117):
两个观察:
1. 在 MacBook 内置屏上,「较大」恒等于 1.16。
automatic要超过 1.16,需要逻辑分辨率面积 ≥ 2,381,439 pt²(同比例下约 1919×1241 pt)。内置屏无论选哪个缩放档都到不了:也就是说
max(1.16, automatic)里的automatic在内置屏上永远不生效,换任何缩放档宠物的点尺寸都不变。2. 三个档位 + 所有显示器加起来,宠物的总可调范围只有 46 → 56.12 pt(+22%),而内置屏用户实际只能拿到 46 → 53.36 pt(+16%)。「较大」相对「标准」只大了 16%,比档位名字给人的预期小不少。
期望
希望能有一个明显更大的选项,下面任选其一就行:
extraLarge(超大)档,比如 scale 1.5 / 1.75;sanitizedScale的 clamp 上限,并让large用一个不依赖分辨率的固定值(现状是内置屏上分辨率这一维本来就没起作用)。附注:放大应该是低风险的
宠物是
MascotView的 SwiftUI Canvas 矢量绘制,而且DetachedFloatingMascotView已经在按mascotRenderScale = 1.75超采样渲染后再缩回去:所以放大本身不会糊。需要跟着调的主要是
petVisualFrame/petHitFrame/badgeOffset/floatingUsageBoltVerticalOffset—— 这几个已经统一按sanitizedScale联动了,以及气泡(DetachedIslandBubblePlacement)的避让边界。如果方向 OK,我也可以来提 PR。
环境
surfaceMode = floatingPet,floatingPetSizeMode = large)