[分享发现] 高德地图网页版在 macOS Safari 下 WebGL 检测能力有 bug
高德地图网页版存在 WebGL 能力检测误判:Safari UA 下,屏幕长边按缩放倍率折算后超过 4096 像素,就会被判为未开启 WebGL ,地图随之降级为低性能模式。
页面提示:
检查网页加载的 JS API 后发现,检测逻辑会将 Mac Safari 的可用尺寸限制为 4096 ,再与屏幕长边乘以 min(2, devicePixelRatio) 的结果比较。本机 2056×2=4112 ,超过这一上限,因而被判为不支持 WebGL 。
在 Chromium 内核浏览器中固定相同的屏幕参数,也能通过切换 UA 复现:
● 原生 Chrome UA:WebGL 创建成功,高德 AMap.Browser.isWebGL 为 true 。
● 改为 Safari UA:WebGL 仍创建成功,但高德 AMap.Browser.isWebGL 变为 false ,并出现上述降级提示。
两次测试的 GPU 渲染器均为 Apple M1 Max / Metal ,WebGL 最大渲染尺寸均为 16384 。此外,基于 WKWebView 的 Tauri/pake 应用也能复现,改用 Chrome UA 后提示消失。
via V2EX (author: HerbertGao)
高德地图网页版存在 WebGL 能力检测误判:Safari UA 下,屏幕长边按缩放倍率折算后超过 4096 像素,就会被判为未开启 WebGL ,地图随之降级为低性能模式。
页面提示:
当前浏览器未开启 WebGL本机屏幕参数为 2056×1329 ,devicePixelRatio = 2 ,折算后的长边是 4112 像素。但实际 WebGL 上下文可以正常创建,GPU 渲染正常,MAX_RENDERBUFFER_SIZE 和 MAX_VIEWPORT_DIMS 均为 16384 ,并未关闭硬件加速。
地图已降级为低性能模式,拖拽与缩放可能出现卡顿,以下功能暂不可用:3D 视角、指南针、卫星图、地图动画
开启浏览器硬件加速即可恢复完整体验
检查网页加载的 JS API 后发现,检测逻辑会将 Mac Safari 的可用尺寸限制为 4096 ,再与屏幕长边乘以 min(2, devicePixelRatio) 的结果比较。本机 2056×2=4112 ,超过这一上限,因而被判为不支持 WebGL 。
在 Chromium 内核浏览器中固定相同的屏幕参数,也能通过切换 UA 复现:
● 原生 Chrome UA:WebGL 创建成功,高德 AMap.Browser.isWebGL 为 true 。
● 改为 Safari UA:WebGL 仍创建成功,但高德 AMap.Browser.isWebGL 变为 false ,并出现上述降级提示。
两次测试的 GPU 渲染器均为 Apple M1 Max / Metal ,WebGL 最大渲染尺寸均为 16384 。此外,基于 WKWebView 的 Tauri/pake 应用也能复现,改用 Chrome UA 后提示消失。
via V2EX (author: HerbertGao)
[问与答] AI 订阅站 HuiAI, ChatGPT/Claude/Gemini, plus 今天特惠 128 起 可开票
今日特惠 ChatGPT plus128 起。。。 Plus 折扣码 HUIA@5 立减 5 元 Pro 5x 折扣 HUIAI@15 立减 15 元 Pro 20x 折扣 HUIAI@30 立减 30 元 ChatGPT Plus / Pro , Claude Pro / Max 、 微信、支付宝付款,不用海外信用卡付款后自动开通,订单进度和售后都能查开通失败全额退; 开上之后出问题优先修 下单:https://www.huiai.me/ 有问题直接回帖。
via V2EX (author: log226)
今日特惠 ChatGPT plus128 起。。。 Plus 折扣码 HUIA@5 立减 5 元 Pro 5x 折扣 HUIAI@15 立减 15 元 Pro 20x 折扣 HUIAI@30 立减 30 元 ChatGPT Plus / Pro , Claude Pro / Max 、 微信、支付宝付款,不用海外信用卡付款后自动开通,订单进度和售后都能查开通失败全额退; 开上之后出问题优先修 下单:https://www.huiai.me/ 有问题直接回帖。
via V2EX (author: log226)
[游戏] 分享一个免费网页游戏平台: https://www.xrhshui.com
不用下载或注册,有赛车、火柴人格斗、坦克、猫狗大战和下 100 层,部分支持同屏双人。想随手玩一局的可以试试,欢迎反馈体验~
via V2EX (author: Xrhshui)
不用下载或注册,有赛车、火柴人格斗、坦克、猫狗大战和下 100 层,部分支持同屏双人。想随手玩一局的可以试试,欢迎反馈体验~
via V2EX (author: Xrhshui)
[分享创造] 同型号的两台显示器,系统怎么分清谁是谁:聊聊按 EDID 认屏的几个坑
做 LayoutKeeper 的时候,我以为最难的是把窗口搬回原来的桌面(前面两篇日志写过这个)。后来发现,排第二难的是一个看起来很 trivial 的问题:**怎么认出"这是哪块屏"**。
LayoutKeeper 是个 macOS 菜单栏小工具(开源 GPL-3.0 ),干的事很简单:记住外接屏上每个窗口的位置和它所在的 Mission Control 桌面,拔线再插回来时一键还原。家里和公司各一块屏,就得各存一份布局——认错了屏,恢复出来的就是另一套布局,灾难。
macOS 给每个显示器分配的 `CGDirectDisplayID`,拔插一次就可能变,根本不能当身份证用。真正靠谱的是 EDID:显示器固件里的一小块数据,里面有厂商 ID 、型号、序列号。我一开始的做法是直接拿"厂商+型号+序列号"拼成 key ,每块屏一份布局文件,存在本机 `~/Library/Application Support/LayoutKeeper/` 里,JSON ,明文,谁都能打开看。
然后翻车了,而且是连环翻车:
**翻车一:有些屏的序列号是假的。** 不少便宜显示器 EDID 里的序列号直接填 0 ,两台同型号的屏插上去,key 一模一样,布局互相覆盖。后来加了 fallback:序列号为 0 或重复时,再叠加上端口信息和首次见到它的时间戳做区分,至少保证"这次插的这两台"不会打架。完美吗?不完美,但比覆盖强。
**翻车二:同一台屏,换根线/换个扩展坞,macOS 给的标识会变。** EDID 本体没变,但系统侧的 display UUID 变了。我最早只认系统 UUID ,结果用户(就是我自己)换了个扩展坞,布局"丢了"。0.6.7 把这块重写了:认屏以 EDID 为主,系统标识只当辅助,换线换坞不再丢布局,换一台没见过的显示器也能正常走"新屏"流程而不是报错。
**翻车三:窗口认错。** 认出屏只是第一步,还得认出窗口。Chrome 是个大坑:我公司和家里登的是不同 profile ,但进程名和 bundle id 一模一样。以前按 bundle id 匹配,经常把"公司 profile 的窗口"塞进"家里 profile 的位置"。0.6.7 改成按 Chrome 的用户配置( profile )目录匹配,世界清净了。同理,同名窗口实在分不清的,LayoutKeeper 会标"需要确认"让你手动选,绝不猜着移——这个原则从第一版就没变过。
布局数据本身长什么样?每块屏一个 JSON:窗口列表( bundle id 、窗口标题、frame 、所在桌面序号),外加最近 5 个历史版本自动轮换。恢复时先逐窗口预览,搬一个回读确认一个,没到位的回滚,整轮还能一键撤销(⌃⌥⌘Z )。数据只存本机,不收集任何东西,唯一的联网是去 GitHub 查更新(可关)。
局限照例写前面,不藏着:
- 只支持**一块**外接屏,多屏用户先别试。
- 跨桌面恢复要 macOS 26+(同桌面内的位置恢复 macOS 14+ 就行),用的是 SkyLight 私有接口,不用关 SIP 、不用注入 Dock ,只要"辅助功能"权限;系统大更新后可能失效,启动时自动检测,失效就自动关掉这个功能。
- Finder 窗口没法跨桌面移动(拿不到进程启动时间)。
仓库: https://github.com/tumingke0/LayoutKeeper
如果你也在写跟显示器打交道的 macOS 工具,EDID 解析这块欢迎交流——我踩过的坑,Issue 里基本都记着。上一帖有朋友说 AI 味重,这篇尽量说人话了,继续求拍砖。
via V2EX (author: tumk)
做 LayoutKeeper 的时候,我以为最难的是把窗口搬回原来的桌面(前面两篇日志写过这个)。后来发现,排第二难的是一个看起来很 trivial 的问题:**怎么认出"这是哪块屏"**。
LayoutKeeper 是个 macOS 菜单栏小工具(开源 GPL-3.0 ),干的事很简单:记住外接屏上每个窗口的位置和它所在的 Mission Control 桌面,拔线再插回来时一键还原。家里和公司各一块屏,就得各存一份布局——认错了屏,恢复出来的就是另一套布局,灾难。
macOS 给每个显示器分配的 `CGDirectDisplayID`,拔插一次就可能变,根本不能当身份证用。真正靠谱的是 EDID:显示器固件里的一小块数据,里面有厂商 ID 、型号、序列号。我一开始的做法是直接拿"厂商+型号+序列号"拼成 key ,每块屏一份布局文件,存在本机 `~/Library/Application Support/LayoutKeeper/` 里,JSON ,明文,谁都能打开看。
然后翻车了,而且是连环翻车:
**翻车一:有些屏的序列号是假的。** 不少便宜显示器 EDID 里的序列号直接填 0 ,两台同型号的屏插上去,key 一模一样,布局互相覆盖。后来加了 fallback:序列号为 0 或重复时,再叠加上端口信息和首次见到它的时间戳做区分,至少保证"这次插的这两台"不会打架。完美吗?不完美,但比覆盖强。
**翻车二:同一台屏,换根线/换个扩展坞,macOS 给的标识会变。** EDID 本体没变,但系统侧的 display UUID 变了。我最早只认系统 UUID ,结果用户(就是我自己)换了个扩展坞,布局"丢了"。0.6.7 把这块重写了:认屏以 EDID 为主,系统标识只当辅助,换线换坞不再丢布局,换一台没见过的显示器也能正常走"新屏"流程而不是报错。
**翻车三:窗口认错。** 认出屏只是第一步,还得认出窗口。Chrome 是个大坑:我公司和家里登的是不同 profile ,但进程名和 bundle id 一模一样。以前按 bundle id 匹配,经常把"公司 profile 的窗口"塞进"家里 profile 的位置"。0.6.7 改成按 Chrome 的用户配置( profile )目录匹配,世界清净了。同理,同名窗口实在分不清的,LayoutKeeper 会标"需要确认"让你手动选,绝不猜着移——这个原则从第一版就没变过。
布局数据本身长什么样?每块屏一个 JSON:窗口列表( bundle id 、窗口标题、frame 、所在桌面序号),外加最近 5 个历史版本自动轮换。恢复时先逐窗口预览,搬一个回读确认一个,没到位的回滚,整轮还能一键撤销(⌃⌥⌘Z )。数据只存本机,不收集任何东西,唯一的联网是去 GitHub 查更新(可关)。
局限照例写前面,不藏着:
- 只支持**一块**外接屏,多屏用户先别试。
- 跨桌面恢复要 macOS 26+(同桌面内的位置恢复 macOS 14+ 就行),用的是 SkyLight 私有接口,不用关 SIP 、不用注入 Dock ,只要"辅助功能"权限;系统大更新后可能失效,启动时自动检测,失效就自动关掉这个功能。
- Finder 窗口没法跨桌面移动(拿不到进程启动时间)。
仓库: https://github.com/tumingke0/LayoutKeeper
如果你也在写跟显示器打交道的 macOS 工具,EDID 解析这块欢迎交流——我踩过的坑,Issue 里基本都记着。上一帖有朋友说 AI 味重,这篇尽量说人话了,继续求拍砖。
via V2EX (author: tumk)