支持回滚字体(fallback font)设置#284
Conversation
zerx-lab
left a comment
There was a problem hiding this comment.
(详见 inline comments 和下方总结 comment)
— 由 Claude Routine 自动生成;如需复评请 @ 维护者人工触发。
Generated by Claude Code
|
|
||
| self.line.push(chr); | ||
| self.character_index_to_cell_map.push(column); | ||
| } |
There was a problem hiding this comment.
性能问题:self.fallback_font_family? 的提前返回检查发生在 select_font + glyph_for_char 之后(第 2734 行)。这意味着即使用户没有配置回退字体(fallback_font_family == None),每个字符仍然会触发一次 font_cache.select_font() 和一次 font_cache.glyph_for_char()。在 ligature 渲染路径中,append_character 对每行每列字符都会调用此函数,10,000 字符/帧的终端窗口就是 20,000 次额外哈希查找/帧,即便回退字体功能完全未启用。
建议将 ? 守卫前置:
fn fallback_font_family_for_char(&self, chr: char) -> Option<FamilyId> {
let fallback_font_family = self.fallback_font_family?; // 未配置时立即返回
let primary_font = self.font_cache.select_font(
self.current_style.font_family,
self.current_style.properties,
);
if self.font_cache.glyph_for_char(primary_font, chr, false).is_some() {
return None;
}
let fallback_font = self.font_cache.select_font(fallback_font_family, self.current_style.properties);
self.font_cache.glyph_for_char(fallback_font, chr, false).map(|_| fallback_font_family)
}这样未配置回退字体时,整个函数仅一次 Option 解包即可返回,不引入任何额外开销。
Generated by Claude Code
| } | ||
|
|
||
| let mut items = self | ||
| .available_families |
There was a problem hiding this comment.
潜在的过滤 bug:name != &MonospaceFontName::default_value() 过滤的是主字体的默认值("Hack"),而非回退字体的默认值("")。这会导致 "Hack" 从回退字体下拉列表中消失——用户如果主字体用 "Monaco Nerd Font Mono"、回退字体想选 "Hack" 来处理 CJK 以外的补充字符,就无法选择。
回退字体下拉列表应当能显示所有已安装字体(包括 "Hack");如果需要排除某项,应过滤 MonospaceFallbackFontName::default_value()(即空字符串),而空字符串本已通过 default_fallback_font_item() 在最顶部作为"系统默认"选项单独呈现,所以实际上不需要在 filter_map 里再额外排除任何字体。
Generated by Claude Code
| .glyph_cache | ||
| .entry((char, font_id)) | ||
| .or_insert_with(|| font_cache.glyph_for_char(font_id, char, true)) | ||
| *self.glyph_cache.entry((char, font_id)).or_insert_with(|| { |
There was a problem hiding this comment.
Question:缓存键是 (char, font_id)(主字体的 FontId),但当主字体没有该字形、回退字体有时,缓存值存储的是来自回退字体的 (GlyphId, FontId)。如果用户在设置中更换回退字体,CellGlyphCache 中针对 CJK 字符的条目仍指向旧回退字体的 FontId,可能导致渲染错误(字形 ID 来自已不再使用的字体)。
set_terminal_fallback_font_family 会调用 ctx.invalidate_all_views(),这应当触发终端视图重绘并重建 CellGlyphCache。请确认 CellGlyphCache 的生命周期是每次 render call 新建,还是作为 view 的持久字段——如果是后者,需要在 TerminalFallbackFontFamilyChanged 事件处理中显式清空缓存,否则回退字体切换后的第一帧会渲染错误的字形。
Generated by Claude Code
Review 总结整体判断:Request Changes 功能方向正确,实现覆盖面广(settings 持久化、渲染层非 ligature / ligature 双路径、事件通知、测试),但有一个性能回归和一个功能 bug 需要处理。 阻塞问题1.
2. 回退字体下拉列表错误过滤了
建议(不阻塞)Question — 缓存键为 看起来不错的地方
— 由 Claude Routine 自动生成;如需复评请 @ 维护者人工触发。 Generated by Claude Code |


关联Issue
#283
Describe the solution you'd like
OS: EndeavourOS x86_64
DE: KDE Plasma 6.7.0