澳门新葡亰信誉平台游戏为什么微软 WSL 的默认终端输入体验比其他同类的应用好?

by admin on 2020年2月3日

一名开发者(下用 Nick 代称)在 Windows Terminal 的 GitHub repo
中发表了一个不是反馈问题的 issue ——
他只是好奇该终端拥有这种如此顺滑输入的效果是如何实现的。

本项目包含:

澳门新葡亰信誉平台游戏 1

  • Windows Terminal
  • Windows 控制台主机 (conhost.exe)
  • 上述两项目的共享组件
  • ColorTool
  • 示例项目 将展示如何使用 Windows Console APIs

Nick 觉得这种顺滑感是其他 Windows
应用都不具备的,甚至是最轻量的 notepad.exe 都未能提供这种输入体验。他还问到,这种 UI
增强功能将来是否会应用于所有 Windows 应用程序。

Windows Terminal

很快,负责此项目的 Windows
开发团队成员(@miniksa)对 Nick
的疑问进行了解答。

Windows Terminal
是一个全新的、流行的、功能强大的命令行终端工具。包含很多来社区呼声很高的特性,例如:多
Tab 支持、富文本、多语言支持、可配置、主题和样式,支持 emoji 和基于 GPU
运算的文本渲染等等。

miniksa 表示,保持在 WSL
默认终端输入内容的速度比其他应用快,这实际上就是他们唯一的工作!除此之外,也可能是因为他们必须使用
Windows 最旧和最低级别的 API 来完成此项工作。

同时该终端依然符合我们的目标和要求,以确保它保持快速、高效,并且不会消耗大量内存和电源。

WSL 的默认终端不像 Electron
等框架那样涉及到许多其他的层或框架,它有一个并不特别的裸窗口,并且没有任何附加组件。他们会从窗口消息(window
messages)而不是某种事件框架((WPF, WinForms, UWP,
Electron))来处理键入的内容,而这些内容是通过内核传输过来的。接着,他们使用
GDI 的 PolyTextOut 将文本直接转储到窗口而不带多余的装饰。

澳门新葡亰信誉平台游戏 2

miniksa 解释道,notepad.exe
确实很轻量,不过在其窗口上也具有多个控件,并且可能在编辑控件中使用某种库、框架来确定其文本布局(也可能正在使用其他库或框架进行国际化支持…),这些都使得它们的输入速度比不上
WSL 默认终端。当然,WSL
也需要进行权衡取舍,它不像其他应用那样提供完全的国际化支持。

澳门新葡亰信誉平台游戏 3

为什么要这样做?第一,conhost.exe
已十分陈旧。它必须使用所有内容的裸机底层,因为它是在创建其他大多数框架之前创建的。第二,它需要保持尽可能底层的级别,而且它是用
C/C++ 编写的,它需要尽可能保持底层的状态以方便提供给第三方使用。

Windows 控制台主机

至于其他 Windows 应用是否有机会用上这种顺滑的输入效果,miniksa
觉得几乎是没机会。这些应用能够以一种简单的方式用任何一门语言来调用一种方法和布局文本(layout
text),而无需手动计算像素或关心它们的字体该采用哪种样式。而恰好 miniksa
手动计算像素、滑动区域和数学应用区域等的方式正是使得 WSL
默认终端输入速度更快的原因。

Windows 控制台主机程序 conhost.exe是 Windows 原生的命令行体验,它实现了
Windows 的命令行基础架构,同时提供 Windows Console API,
输入引擎、渲染引擎和用户配置信息。本项目中的控制台主机代码实际上是
Windows 中的 conhost.exe 的源码。

(文/开源中国)    

控制台的主要目的是对已有控制台应用保持向后兼容性。

自从 2014 年有了 Windows
命令行以来,开发团队已经给控制台增加了很多新特性,包括窗口透明化、基于行的选择以及支持
ANSI / 虚拟终端序列 Virtual Terminal sequences, 24-bit color, 以及一个
Pseudoconsole 等等。

但是由于控制台主要的目标是维护向后兼容性,所以尽管这么多年社区一直希望我们能添加一些特性,但是我们不可能再增加这些特性。

诸多限制让我们决定开发一个全新的 Windows Terminal。

共享的组件

在对控制台进行大修的同时,我们对其代码库进行了大量的改进。主要是将逻辑实体清晰地划分为模块和类,引入了一些关键的扩展点,用更安全、更高效的STL容器替换了几个旧的、自制的集合和容器,并通过使用微软的
Wil header 库使代码更简单、更安全。

这项大修工作导致创建了几个对 Windows
上的任何终端实现都有用的关键组件,包括一个新的基于 DirectWrite
的文本布局和渲染引擎、一个能够存储 UTF-16 和 UTF-8
的文本缓冲区以及一个VT解析器/发射器。

构建一个全新终端

当开始构建全新终端应用程序时,我们探索并评估了几种方法和技术堆栈。最终决定继续使用
C++ 开发,并通过共享上述的现代化组件来实现我们的目标,并基于现代 Windows
应用程序平台和 UI 框架之上进行开发。

此外,我们意识到终端的渲染器和输入堆栈可以构建成可重用的 Windows UI
控件,方便其他人可以将其合并到其他应用程序中。

源码构建

该项目使用 git submodules
包含一些相关依赖,要确保子模块被更新,请在构建器使用如下命令检查:

git submodule update --init --recursive

OpenConsole.sln 需要在 Visual Studio 构建或者是使用 MSBuild
在命令行中构建。命令行构建的方法如下:

nuget restore OpenConsole.sln
msbuild OpenConsole.sln

我们还在 tools
目录下提供了一组常用的脚本可以帮助自动化处理构建和运行测试的过程。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图