Conversation
- 添加 roseau.yaml 配置文件定义排除规则 - 在 gradle 脚本中注册 roseauConfig 变量 - 将配置参数传递给 roseauCheck 任务 - 定义废弃和实验性注解的排除列表 - 配置报告输出格式和路径 - 设置基础版本依赖和执行配置
- 实现异步字形创建,避免渲染线程阻塞 - 添加布局缓存机制,减少重复计算开销 - 修复基线偏移问题,解决降部字母裁剪 - 修正cellSize计算,确保完整容纳字形 - 使用ConcurrentHashMap替代HashMap提高并发性能 - 添加单线程执行器处理后台字形创建任务 - 实现字形页同步机制避免读写冲突 - 优化纹理上传时的图像数据转换 - 添加字形布局缓存失效和清理机制 - 修正awtHeight返回实际字体度量高度
- 将SdfGlyphAtlas.getOrCreate方法改为使用专用线程池执行异步任务 - 在AnvilLibFont初始化时预先启动SDF图集构建以避免首帧文字不可见 - 当构建失败时移除失败的Future并重新开始构建以防止瞬态错误永久禁用图集 - 为SdfTextRenderer添加辅助方法以统一获取准备就绪的图集 - 修复多线程环境下的内存可见性和同步问题
- 移除atlas方法的空值检查,改为直接阻塞等待图集就绪 - 在模组初始化时预构建基础字体及常用样式变体的SDF图集 - 修复配置界面中字体下拉框的设置方法调用 - 添加详细的日志记录以跟踪SDF图集的构建过程 - 简化渲染器中的空值检查逻辑,确保图集就绪后再进行渲染 - 调整图集上传时机以避免渲染线程阻塞
- 移除单线程执行器,改用每个任务一个虚拟线程的执行器 - 利用现有的synchronized块提供必要的互斥保护 - 使用虚拟线程提高字形创建的并发性能 - 保持字形或批次处理的独立线程隔离
- 为绿色文本添加删除线样式 - 为紫色斜体文本添加下划线样式 - 添加混淆文字测试用例 - 修复SDF文本渲染器中的Y轴位置计算偏差 - 简化文本布局和绘制管道的坐标传递逻辑
- 使用 Lombok @slf4j 注解替换手动创建 Logger 实例 - 移除冗余的 import org.slf4j 语句 - 优化方法参数格式化以提高可读性 - 调整数组初始化语法以符合编码规范 - 将部分 info 级别日志调整为 debug 级别以减少运行时输出
- 设置roseauBaselineConfig.transitive = false以阻止传递依赖 - 防止不必要的依赖项被引入到项目中
- 在ALFont类上添加@beta注解标记为实验性功能 - 在多个字体模块核心组件上添加@ApiStatus.Internal注解 - 包括ALFPipelines、AnvilLibFontConfigManager等关键类 - 为Sdf相关的纹理、图集、渲染器等添加适当的API状态标记 - 统一管理内部实现与公共接口的可见性边界
- 计算最大高度时向下舍入到行高的倍数 - 确保最后一个可见行填满整个区域而不留空白 - 避免下拉菜单出现尾随空白空间的问题
- 将图片哈希计算替换为原子版本号,避免每像素遍历 - 使用getRaster().getDataElements()批量复制像素数据 - 缓存图片宽高减少重复查询 - SdfGlyphPage使用AtomicInteger版本计数器 - 更新TODO文档说明性能优化详情
- 在同步块中统一读取版本号和图像数据,避免异步字形创建线程的竞态访问 - 重新实现toNativeImage方法,将逐像素getRGB调用回滚到逐像素处理方式 - 更新TODO文档记录NativeImage批量复制优化的回滚原因 - 修正纹理脏检查逻辑,确保版本变更时正确触发上传 - 修复因Java2D颜色空间转换差异导致的SDF纹理GPU采样残影问题
🌿 Roseau API Breaking Change Report
🔴 font — 1 breaking change(s)
|
- 为gradlew脚本添加执行权限 - 修改roseauCheck步骤以确保正确的文件权限 - 保持继续执行错误的配置选项
- 引入Matrix3x2fStack用于矩阵变换操作 - 添加矩阵推入和缩放操作以支持正确的坐标变换 - 修正删除线下标计算公式,确保在缩放后正确显示 - 修正下划线位置计算公式,避免渲染位置偏移 - 在绘制完成后弹出矩阵以恢复变换状态
- 下载 Roseau 报告到本地 roseau-reports 目录 - 为每个受影响模块追加详细的破坏性变更详情 - 在 PR 评论中显示具体的变更类型、符号和兼容性状态 - 更新文档链接指向完整的 CSV 报告文件
Gugle2308
approved these changes
Jun 20, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
1. 字形布局缓存(P0)
【ac15602】 每帧对相同文本重复计算码点→字形查询、UV计算、按页面分桶及新建对象。改为
(atlasKey, text, scale)缓存SdfTextLayout结果,消除重复CPU 开销。配额满时驱逐半数条目。
2. 异步字形创建 + 虚拟线程(P0)
【ac15602, 2f61da7, 5079f4b】 原来渲染线程同步调用
createGlyph(),CJK 文本可能阻塞多帧。改为:null,异步入队后台创建pendingGlyphs集合防止重复创建请求synchronized图集级互斥,纹理上传用synchronized页面级互斥Executors.newThreadPerTaskExecutor(Thread.ofVirtual()...)) 替代单线程平台线程池3. 纹理上传顺序修复(关键 Bug)
【b5457d6, c6fe2cb】
SdfTextRenderer.flushFormattedSegment()和drawStringWithAtlas()中SdfTextLayout.fromAtlas()在SdfAtlasTexture.ensureUploaded()之前调用,导致PageQuads捕获null的atlasTexture,布局被缓存后文字永久不可见。改为先上传再计算布局。4. 纹理上传竞态条件修复(关键 Bug)
【7ec5af5】 版本号替代哈希后引入的竞态:
uploadPage在synchronized (page)块外读版本号,在后面清除dirty。若后台线程在中间创建了新字形(version++、dirty=true),
dirty被错误覆盖为false,下一帧跳过上传。修复:dirty清除三者移入synchronized (page)块内原子执行ensureUploaded增加版本号比对兜底 (entry.version != page.version.get()),即使dirty竞态被覆盖也能检测到变更5. 版本号替代图像哈希(P1)
【718ebf3】
SdfGlyphPage用AtomicInteger version替代int hash。updateHash()从遍历 1,048,576 像素的hashImage()改为version.incrementAndGet()。SdfAtlasTexture.uploadPage()和PageEntry全部改用版本号比较。已删除hashImage()方法。6. Y 轴基线位置修正
【8b4aedf】 旧代码把渲染 API 的
y当作 baseline 处理 (quadY = y - ascent*scale),但 Minecraft vanilla 约定y= 文字顶部。去掉 ascent减法 →
quadY = y,使 SDF 文字与同屏 vanilla 文字在垂直方向对齐。7. API 状态注解
【82e470d】 为所有类添加适当的 API 可见性标记:
@BetaSdfTextRenderer,GuiGraphicsExtractorExtension,ALFont,FontManager@ApiStatus.InternalALFPipelines,SdfGlyphAtlas,SdfGlyphPage,SdfAtlasTexture,SdfTextLayout,SdfTextRenderState,GuiGraphicsExtractorMixin,FontConfigScreen,FontTestScreen,Dropdown,AnvilLibFontData,AnvilLibFontConfigManager8. 日志优化
【c6fe2cb】
SdfGlyphAtlas用@Slf4j替换手动LoggerFactory.getLogger(),将 "Starting SDF atlas build" 降为debug级别,删除每帧打印的 "SDF atlas build done" 冗余日志。
9. 下拉菜单修复
【2b11adb】
Dropdown.calcMaxHeight()末尾加(maxHeight / getHeight()) * getHeight()向下取整到行高倍数,消除列表底部空白区域。