为什么 ChromeOS 中的 Linux 应用程序中的字体模糊?

为什么 ChromeOS 中的 Linux 应用程序中的字体模糊?

我连接了 4k 显示器,ChromeOS 本身的字体看起来非常出色且清晰:

在此处输入图片描述 在此处输入图片描述

但是在 Linux VM 上运行的所有应用程序都有丑陋、模糊的字体:

在此处输入图片描述

有什么方法可以让 Linux 应用程序的字体与主 ChromeOS 系统上的字体相同?

答案1

显然您的虚拟机没有设置为原始分辨率。

在虚拟机中,您必须确保物理显示器的功能传递到虚拟机中,以便 Linux 的自动检测可以完成剩下的工作。

如果这不是问题,则可能是高 DPI 补偿功能处于活动状态:

您应该查看虚拟机中 Linux 中的“显示设置”配置。通常有一些可用的缩放设置(可用性和外观取决于您的 Linux 发行版):

  • “用户界面比例”(设置为 100% 或“正常”)
  • 分数缩放控件

您可以在命令行上检查

xrandr --query

了解更多信息。

一些示例输出xrandr --query:(
“当前”值是感兴趣的。)

Screen 0: minimum 320 x 200, current 1920 x 2160, maximum 16384 x 16384
eDP-1 connected primary 1920x1080+0+1080 (normal left inverted right x axis y axis) 346mm x 194mm
   3840x2160     60.00*+  59.98    59.97  
   3200x1800     59.96    59.94  
   2880x1620     59.96    59.97  
   2560x1600     59.99    59.97  
   2560x1440     59.99    59.99    59.96    59.95  
   2048x1536     60.00  
   1920x1440     60.00  
   1856x1392     60.01  
   [...]
更新:容器

正如您所写,您使用的不是 VM,而是 CromeOS'容器运行 Linux 应用程序的功能 VM 内的设置与您的问题无关。

X-apps 和 Wayland-apps 由 ChromOS 自己的嵌套 Wayland 合成器提供服务,称为“侍酒师“。

为了获得控制权,您可以使用 ChromeOS 终端命令行上的 Sommelier 启动 Linux 应用程序,并提供环境和参数:

sommelier -X --scale=0.75 --dpi="120" inkscape

--scale=0.75将缩放显示。大于的值1将倾向于模糊容器内的字体和对象。此参数仅影响之内容器的窗口

SOMMELIER_SCALE=0.75是与参数表示相同的环境变量--scale=0.75。参数应覆盖环境设置。

GDK_SCALE=2影响 Gnome 桌面。这是 Gnome 桌面中所有应用程序的 Hi-DPI 补偿,因此 Sommelier/Wayland/X11 也是包装 Sommelier 结果的“洋葱壳”。

许多 Linux 应用程序会读取 DPI(每英寸点数)并补偿其内部尺寸,以提供原生、流畅和清晰的体验,解决 Hi-DPI 问题。为每个连接的显示器设置适当的 DPI 可以让应用程序在所有连接的显示器上以几乎相同的尺寸显示其内容。

--dpi=""或者不提及它将向在 Sommelier 中运行的 Linux 应用程序提供 ChromeOS 已知的显示器的精确 DPI 设置。

--dpi=120将覆盖 ChromeOS 提供的 DPI 值。

--dpi=75,96,120,160,200,240将为 Sommelier 提供有效 DPI 值的“存储桶”。将向 Linux 应用程序172传递实际 DPI 值160。这有时是必要的,因为某些 Linux 应用程序仅接受一些离散值作为有效 DPI 设置。当您在不同的 Linux 应用程序中遇到意外的大小时,您必须找出这些值并将其写入“存储桶”。


要“消除”Linux应用程序中的模糊,您应该首先从开始--scale=1。并且只使用这个单一的缩放因子。

由于未设置GDK_SCALE此变量的全局设置将处于活动状态,因此此参数提供的模糊在所有 ChromeOS 应用和 Sommelier 应用中都应该相同。

如果模糊消失,您应该判断 Linux 应用程序内对象的大小与其他 ChromeOS 应用程序的大小进行比较。

  1. 如果所有应用中的对象都太小/太大,那么就是GDK_Scale需要调整的正确参数。但由于这是像素的缩放,任何大于本国的 GDK_Scale=1.0会导致或多或少的模糊。有用的是直接因素,例如1.52
    请注意,仅GDK_Scale在终端中更改不会影响其他 CromeOS 应用程序。您必须在全局设置中更改这一点。

  2. 如果只是 Linux 应用程序的大小让人不舒服,那么你就必须权衡--scale=...和的优缺点--dpi=...

    • --scale=<value>(或SOMMELIER_SCALE=<value>)大于本国的 1.0会开始模糊。这里还有直接因素,例如 1.5或 ,2有助于使模糊变得不那么明显。
    • --dpi=<value>将修复应用程序使用的 DPI,并且在多显示器设置下更改显示可能会导致显示尺寸出现不必要的跳跃。但它提供了禁止模糊并获得所需尺寸的机会。

请对您的测试结果和决定提供一些反馈。

答案2

我在使用外接 4K 显示器时也遇到了这个问题,但我学到了一个解决该问题的技巧。

如果我合上 Chromebook 的盖子,只使用 LG HDR 4K (3840x2160),首次发射Linux 容器(和应用程序)则结果为模糊文本。如果我在 Chromebook 打开的情况下启动应用程序,然后合上盖子,文字就清晰了。

在我看来,Linux 容器在“启动时”存在与 DPI 相关的设置,除非内置笔记本电脑屏幕也打开(或仅在某些情况下打开),否则无法正确自动配置。

有一次我有一个用于启动 VS Code 的脚本,该脚本强制使用正确的 DPI,但现在我似乎无法挖掘它,sommelier当我运行如下脚本时,上述内容对我来说不起作用:

sommelier -X --scale=1.0 --dpi=120 code

结果:

sommelier_scope_timer: init wayland channel: 0.000484 seconds
sommelier_scope_timer: drm device: 0.008052 seconds
sommelier_scope_timer: connect display: 0.000026 seconds
sommelier_scope_timer: client create: 0.000030 seconds
sommelier_scope_timer: display implementation: 0.000001 seconds
sommelier_scope_timer: spawn xwayland: 0.000295 seconds
_XSERVTransSocketUNIXCreateListener: ...SocketCreateListener() failed
_XSERVTransMakeAllCOTSServerListeners: server already running
_XSERVTransSocketUNIXCreateListener: ...SocketCreateListener() failed
_XSERVTransMakeAllCOTSServerListeners: server already running
The XKEYBOARD keymap compiler (xkbcomp) reports:
> Warning:          Unsupported maximum keycode 569, clipping.
>                   X11 cannot support keycodes above 255.
> Error:            Key <CAPS> added to map for multiple modifiers
>                   Using Mod3, ignoring Lock.
Errors from xkbcomp are not fatal to the X server
Got error or hangup (mask 5) on X connection, exiting
eweplay9@penguin:~$ sommelier -X --scale=1.0 --dpi=120 edge

相关内容