Lunar 6.7.11 修复说明:Sync Mode 在 MacBook Air 与 iMac 上改用 nits 同步
桌面应用【免费下载链接】LunarIntelligent adaptive brightness for your external monitors项目地址https://gitcode.com/gh_mirrors/lu/Lunar点击查看免费下载Lunar 6.7.11 是一个针对Sync Mode同步模式的定向修复版本。此次更新修复了 Apple Silicon MacBook Air 与 iMac 上Sync Mode 未按 nits亮度单位进行同步的问题。本文将结合该版本 Release Notes 与仓库源码说明问题成因、修复机制、相关配置与排查方法。背景什么是 Sync ModeLunar 内置多种自适应亮度模式Sync Mode 是其中之一其核心思路是跟随一台源显示器Source Display的亮度同步调整其他外接显示器的亮度。例如当你在 MacBook 内置屏幕上调高亮度时外接显示器会随之同步变亮。在源码中Sync Mode 通过AdaptiveModeKey.sync标识其单例SyncMode.shared负责同步逻辑参见 Lunar/Modes/AdaptiveMode.swift 中的模式枚举与SyncMode.shared引用。Sync Mode 的源显示器选择逻辑位于 Lunar/Utils/DisplayController.swiftlet externalSource displays.filter { !$0.isBuiltin $0.isSource !$0.blackout } if let source externalSource.first(where: { $0.hasAmbientLightAdaptiveBrightness }) ?? externalSource.first(where: { $0.isNative }) ?? externalSource.first { return source } if let d displays.first(where: \.isBuiltin), d.isSource, !d.blackout { return d }即优先选择支持环境光自适应亮度hasAmbientLightAdaptiveBrightness的外接显示器其次选择原生native显示器最后可回退到内置屏幕。问题描述MacBook Air 与 iMac 未使用 nits 同步本版本修复的核心 bug 是Fix Sync Mode not using nits on MacBook Air and iMac (Apple Silicon only)在 Apple Silicon 的 MacBook Air 与 iMac 上Sync Mode 此前未按 nits尼特进行同步。为什么要按 nits 同步nitscd/m²是显示器亮度的绝对物理单位。macOS 中内置屏幕的亮度调节范围通常为 0500 nits部分支持 XDR 的机型可达 1600 nits而不同外接显示器的亮度范围各异。若仅按 0100 的百分比直接映射不同显示器的亮度曲线不一致同步效果会失真。Lunar 为此实现了 SDR 亮度与 nits 的双向换算函数位于 Lunar/Data/Display.swiftfunc sdrBrightnessToNits(_ brightness: Double, maxNits: Double) - Double { guard brightness 0 else { return 0 } if brightness 0.5 { return brightness * 2 * 140 } let t (brightness - 0.5) / 0.5 return 140 * pow(maxNits / 140, t) } func nitsToSdrBrightness(_ nits: Double, maxNits: Double) - Double { guard nits 0 else { return 0 } if nits 140 { return nits / 280 } return 0.5 0.5 * Foundation.log(nits / 140) / Foundation.log(maxNits / 140) }该换算基于 macOS 的 SDR 亮度曲线00.5 为线性段0140 nits0.51.0 为对数段140 nits 至 maxNits。这正是 Sync Mode 按 nits 同步的数学基础。修复机制isUsingNits() 与 nits 读取nits 读取链路在 Apple Silicon 上Lunar 通过 AppleNativeControl.swift 读取并推算 nits。核心逻辑在updateNits()第 L206-L247 行if display.enhanced, let maxHardwareNits display.maxHardwareNits, display.xdrBrightness 0 { nits display.xdrBrightness.d.map(from: (0, 1), to: (maxNits, maxHardwareNits)) } else { var brightness: Float 0.0 DisplayServicesGetLinearBrightness(display.id, brightness) nits maxNits * brightness.d }即通过DisplayServicesGetLinearBrightness获取线性亮度再乘以显示器的最大 nitsmaxNits得到当前 nits。若显示器处于增强XDR模式则基于xdrBrightness在 SDR 上限与硬件上限之间映射。isUsingNits() 的判定作用SyncMode.isUsingNits()用于判定当前是否按 nits 同步。代码库中该判定用于以下关键位置Lunar/SwiftUIViews/DisplayRowView.swiftnitsText()在SyncMode.isUsingNits()成立时显示显示器当前 nits 数值display.nits。Lunar/SwiftUIViews/NitsTextField.swift当syncMode SyncMode.isUsingNits()时显示可编辑的 min/max nits 输入框。Lunar/Data/Display.swift在isUserAdjusting()中当处于 Sync Mode 且isUsingNits()成立时通过nitsBrightnessMappingSaver/nitsContrastMappingSaver判断用户是否正在调整。本次修复正是让 MacBook Air 与 iMac 上的 Sync Mode 正确进入 nits 同步路径从而在 UI 中显示 nits、并基于 nits 做插值映射。相关配置syncNits 与 min/max nitssyncNits 开关syncNits是 Sync Mode 是否按 nits 同步的默认开关定义于 Lunar/Data/DataStore.swift.syncNits,其缓存键与发布者分别位于 DataStore.swift 第 802 行 与 第 935 行cacheKey(.syncNits) let syncNitsPublisher pub(.syncNits)UI 层通过Default(.syncNits)读取该设置见 Lunar/SwiftUIViews/UsefulInfo.swift。minNits / maxNits 的约束nits 同步依赖显示器的 min/max nits 数值其约束逻辑位于 Lunar/Data/Display.swiftminNits必须满足minNits maxNits minNits 0否则被钳制为 0 或maxNits - 1。maxNits必须满足maxNits minNits maxNits 0 maxNits 3000超过 3000 会被钳制回旧值。用户可通过 NitsTextField.swift 中的输入框自定义 min/max nits修改后通过display.minNits nits/display.maxNits nits持久化并触发nitsEditPublisher通知重算映射。源码中的插值映射Sync Mode 按 nits 同步时会将源显示器的 nits 映射到目标显示器的亮度百分比。相关映射定义于 Lunar/Data/Display.swiftfunc recomputeNitsMapping() { nitsToPercentageMapping Self.LUX_TO_NITS.sorted(by: { $0.key $1.key }).map { k, v in AutoLearnMapping(source: k, target: nitsToPercentage(v, minNits: minNits, maxNits: userMaxNits ?? maxNits) * 100) } }其中nitsToPercentage结合用户自定义的userMinNits/userMaxNits若未设置则回退到minNits/maxNits将 nits 转换为 0100 的亮度百分比。相关限制与边界条件仅 Apple Silicon本次修复标注为 Apple Silicon only。从源码看nits 相关的读取与显示逻辑大量使用#if arch(arm64)条件编译AppleNativeControl.swift 的updateNits()整体包裹于#if arch(arm64)。DisplayRowView.swift 的nitsText()同样仅在 arm64 下启用。Display.swift 中isUsingNits()分支也带#if arch(arm64)。因此Intel Mac 上 Sync Mode 仍按百分比0100同步nits 同步路径仅在 Apple Silicon 生效。禁用亮度观察器时的回退若disableBrightnessObservers为真设置见 DataStore.swiftLunar 无法通过系统回调监听亮度变化此时 Display.swift 的startBrightnessContrastRefreshers()会改用 2 秒间隔的Repeater轮询读取亮度Sync Mode 的同步仍可进行但响应存在延迟。合盖Clamshell模式的处理在 Clamshell 模式下Sync Mode 会自动切回 Manual Mode相关逻辑位于 DisplayController.swiftfunc disableAdaptiveInClamshellMode() { if adaptiveModeKey .sync { disabledAdaptiveInClamshellMode true disable() } }即检测到合盖时禁用 Sync Mode开盖后重新启用。如何验证与排查确认机型与模式仅 Apple Silicon MacMacBook Air / iMac在 Sync Mode 下生效。可查看 Lunar/Data/Display.swift 的isActiveSyncSource判断当前显示器是否为活动源。查看 nits 显示在 Sync Mode 下若修复生效显示行中会显示当前 nits 数值见 DisplayRowView.swift。调整 min/max nits通过 NitsTextField.swift 的弹窗自定义显示器的 min/max nits 值优化映射精度。检查设置确认syncNitsDataStore.swift为开启状态且未误开disableBrightnessObserversDataStore.swift。小结Lunar 6.7.11 通过让 Sync Mode 在 MacBook Air 与 iMacApple Silicon上正确走 nits 同步路径统一了内置屏与外接屏的亮度感知。nits 同步以 sdrBrightnessToNits 的 SDR 亮度曲线换算为基础配合syncNits开关、minNits/maxNits配置与 AutoLearnMapping 插值映射实现了更贴近人眼感知的跨屏亮度同步。赞分享桌面应用【免费下载链接】LunarIntelligent adaptive brightness for your external monitors项目地址https://gitcode.com/gh_mirrors/lu/Lunar点击查看免费下载相关推荐Lunar 6.7.5 技术解读Sync Mode 亮度同步平滑化、OSD 与 Full Range 稳定性修复Lunar 6.7.5 技术解读Sync Mode 亮度同步平滑化、OSD 与 Full Range 稳定性修复 本文以 Lunar 开源仓库的版本说明文档桌面应用Lunar 6.0.0 Beta 1 深度解析Apple Silicon EDID 修复、真实 Nits 同步模式与全新的 lunar edid 命令行Lunar 6.0.0 Beta 1 深度解析Apple Silicon EDID 修复、真实 Nits 同步模式与全新的 lunar edid 命令行 本篇桌面应用Lunar 5.9.3 修复解析无线传感器、Sync Mode 轮询、Apple 显示器亮度同步与快捷指令的八项源码级修复Lunar 5.9.3 修复解析无线传感器、Sync Mode 轮询、Apple 显示器亮度同步与快捷指令的八项源码级修复 Lunar 是一款为 macOS桌面应用上一篇GhostESP设备端OTA全解固件校验、回滚保护与SD卡更新背后的4重防护下一篇DGX Spark集群踩坑一次解决spark-vllm-docker故障排查与常见问题完整清单OOM、卡死、加载慢创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

MooTool Next-Compose 增量演进:MCP stdio 工具链、F03 格式化引擎与更新下载流的工程化落地

MooTool Next-Compose 增量演进:MCP stdio 工具链、F03 格式化引擎与更新下载流的工程化落地

桌面应用开发工具 【免费下载链接】MooTool Handy tool set for developers 项目地址: https://gitcode.com/gh_mirrors/mo/MooTool 点击查看 免费下载 导读 本篇以仓库中的增量开发记录 next-compose/docs/diff/561-mcp-reformat-update-env-net-vault-css-slice…

2026/10/16 6:27:53 阅读更多 →
AtCoder Beginner Contest 478

AtCoder Beginner Contest 478

AtCoder Beginner Contest 478 A - Grapes 题意:有N个人,编号为1到N,现在要把M颗葡萄分给他们。每次按照1, 2, …, N的顺序,每人分一颗,分到第N个人以后再从第1个人开始,直到所有葡萄分完。最后输出每个人分…

2026/10/16 6:27:53 阅读更多 →
google-api-nodejs-client 的 ondemandscanning 模块演进全解读:从 CHANGELOG 版本脉络到容器镜像漏洞扫描实战

google-api-nodejs-client 的 ondemandscanning 模块演进全解读:从 CHANGELOG 版本脉络到容器镜像漏洞扫描实战

后端 【免费下载链接】google-api-nodejs-client Googles officially supported Node.js client library for accessing Google APIs. Support for authorization and authentication with OAuth 2.0, API Keys and JWT (Service Tokens) is included. 项目地址: h…

2026/10/16 6:27:53 阅读更多 →

最新新闻

Win11地址栏拖拽失效:原因排查与替代方案指南

Win11地址栏拖拽失效:原因排查与替代方案指南

这事还得从上周整理文件说起。我在Win11的资源管理器里打开了一串多级目录,类似D盘-素材库-项目A-最终交付,手头有一份改完的压缩包要归位到上级的“项目A”目录。按照以前用Win10的习惯,我直接把文件往地址栏的面包屑路径上一拖就完事了&…

2026/10/16 7:15:04 阅读更多 →
PostgreSQL内核元数据核心:PG_CLASS系统表字段详解与实战排查指南

PostgreSQL内核元数据核心:PG_CLASS系统表字段详解与实战排查指南

维护基于 PostgreSQL 内核的数据库产品时,几乎每天都会和各种系统表打交道,而 PG_CLASS 是其中最绕不开的一张。HIGHGO 这个名字是我对某个基于 PG 内核的数据库项目的代号,它的目录体系和原生 PostgreSQL 保持一致,所以很多排查思…

2026/10/16 7:15:04 阅读更多 →
WinForms VS风格主界面框架:可继承可调试的桌面UI解决方案

WinForms VS风格主界面框架:可继承可调试的桌面UI解决方案

简介:这是一套高度仿Visual Studio界面风格的WinForms Docking框架源代码,面向C#桌面开发初学者与中级工程师,用于快速构建具备专业级停靠、浮动、标签页管理功能的MDI应用程序。资源包含230个文件,主体为95个C#核心逻辑文件&…

2026/10/16 7:15:04 阅读更多 →
分布式事务实战:8种方案的选型逻辑与踩坑指南

分布式事务实战:8种方案的选型逻辑与踩坑指南

1. 为什么“分布式事务”不是一道选择题,而是一场持续权衡的实战“8种常用的分布式事务解决方案”——这个标题听起来像一份技术选型清单,但在我过去十年参与过的二十多个中大型系统重构项目里,它从来不是“挑一个用”的简单动作。我见过某电…

2026/10/16 7:15:04 阅读更多 →
如何把电视盒子变成全屋打印服务器(Armbian + CUPS 完整实操)

如何把电视盒子变成全屋打印服务器(Armbian + CUPS 完整实操)

如何把电视盒子变成全屋打印服务器(Armbian CUPS 完整实操) 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905…

2026/10/16 7:15:04 阅读更多 →
面向对象核心知识详解:从类与对象到封装继承多态

面向对象核心知识详解:从类与对象到封装继承多态

最近重新翻出自己几年前记的一套面向对象基础笔记,边看边感慨。当年跟着一套讲得很细的Java基础课,逐行敲代码、抄概念、画内存图的日子,其实才是真正把编程底子打牢的阶段。面向对象这四个字,很多新手一听就觉得抽象,…

2026/10/16 7:14:04 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →