Wayland

类UNIX系统的显示服务器协议

Wayland是一种类UNIX系统的显示服务器协议。它是X11窗口系统协议和架构的替代品,旨在更易于开发、扩展和维护。

简介
Wayland是X11窗口系统协议和架构的替代品,旨在更易于开发、扩展和维护。它是一种语言(协议),应用程序可以使用它与显示服务器进行通信,从而实现自身可见并从用户(人)那里获取输入。Wayland服务器被称为“合成器”。应用程序是Wayland客户端。
原理及区别
理解Wayland架构以及它与X的不同之处的一个好方法是从输入设备跟踪一个事件,直到它所影响的变化出现在屏幕上。
这是我们现在的X Window:
内核从输入设备获取一个事件,并通过evdev输入驱动程序将其发送给X。内核在这里通过驱动设备并将不同设备特定的事件协议转换为linux evdev输入事件标准来完成所有艰苦的工作。
X服务器确定事件影响哪个窗口,并将其发送给为该窗口上的事件选择的客户端。X服务器实际上并不知道如何正确地做到这一点,因为窗口在屏幕上的位置是由合成器控制的,并且可能以X服务器不理解的方式进行转换(缩小、旋转、抖动等)。
客户端查看事件并决定做什么。通常情况下,用户界面必须根据事件发生变化——可能是单击了复选框,或者指针进入了需要高亮显示的按钮。因此,客户端将呈现请求发送回X服务器。
当X服务器接收到呈现请求时,它将其发送给驱动程序,让它对硬件进行编程以完成呈现。X服务器还计算渲染的边界区域,并将其作为damage事件发送给合成器。
damage事件告诉合成器窗口发生了变化,合成器必须重新合成窗口所在的屏幕区域。合成器负责根据它的场景和X窗口的内容渲染整个屏幕内容。然而,它必须通过X服务器来渲染它。
X服务器接收来自合成器的渲染请求,然后将合成器的后缓冲区复制到前缓冲区,或者进行页翻转。在一般情况下,X服务器必须执行此步骤,以便它可以考虑重叠窗口,这可能需要裁剪并确定是否可以翻页。然而,对于总是全屏的合成器来说,这又是一个不必要的上下文切换。
如上所述,这种方法有一些问题。X服务器没有决定哪个窗口应该接收事件的信息,也不能将屏幕坐标转换为窗口局部坐标。尽管X已经将屏幕最终绘制的责任交给了合成管理器,X仍然控制着前端缓冲区和模式设置。X服务器过去用来处理的大多数复杂性现在都可以在内核或自包含库(KMS、evdev、mesa、fontconfig、freetype、cairo、Qt等)中使用。一般来说,X服务器现在只是一个中间人,在应用程序和合成程序之间以及合成程序和硬件之间引入了一个额外的步骤。
在Wayland中,合成器是显示服务器。我们将KMS和evdev的控制权转移到合成器。Wayland协议允许合成器将输入事件直接发送给客户端,并允许客户端将damage事件直接发送给合成器:
内核获取一个事件并将其发送给合成器。这类似于X的情况,这很好,因为我们可以在内核中重用所有输入驱动程序。
合成器查看它的scenegraph来确定哪个窗口应该接收事件。scenegraph对应于屏幕上的内容,合成器了解它可能对scenegraph中的元素应用的转换。因此,合成器可以选择正确的窗口,并通过反向变换将屏幕坐标转换为窗口局部坐标。对窗口应用的变换类型仅限于合成器能做的事情,只要它能计算输入事件的逆变换。
与X的情况一样,当客户端接收到事件时,它会更新UI。但是在Wayland的情况下,渲染发生在客户端,客户端只是向合成器发送一个请求来指示更新的区域。
合成器收集客户端的损坏请求,然后重新合成屏幕。合成器接下来可以直接发出ioctl,用KMS调度页翻转。
Wayland渲染
在上面的概述中遗漏了一个细节,那就是客户端如何在Wayland下进行渲染。通过从图片中删除X服务器,我们也删除了X客户机通常使用的渲染机制。但是我们已经在X下的DRI2中使用了另一种机制:直接渲染。通过直接渲染,客户端和服务器共享一个视频内存缓冲区。客户端链接到一个渲染库,比如OpenGL,它知道如何对硬件进行编程并直接渲染到缓冲区中。合成器反过来可以将缓冲区作为纹理来合成桌面。在初始化后,客户端只需要告诉合成器使用哪个缓冲区以及何时何地渲染了新内容。
这给应用程序留下了两种更新窗口内容的方法:
将新内容渲染到新的缓冲区中,并告诉合成器使用新缓冲区而不是旧缓冲区。应用程序可以在每次需要更新窗口内容时分配一个新的缓冲区,也可以保留两个(或更多)缓冲区并在它们之间循环。缓冲区管理完全在应用程序的控制之下。
将新内容渲染到之前告诉合成器使用的缓冲区中。虽然可以直接渲染到与合成器共享的缓冲区中,但这可能会与合成器竞争。可能发生的情况是,重新绘制窗口内容可能会因为合成器重新绘制桌面而中断。如果应用程序在清除窗口后但在渲染内容之前被中断,合成器将从空白缓冲区进行纹理。结果是应用程序窗口将在空白窗口或半渲染的内容之间闪烁。避免这种情况的传统方法是将新内容渲染到后端缓冲区,然后从那里复制到合成表面。可以动态分配后端缓冲区,其大小刚好可以容纳新内容,或者应用程序可以保留一个缓冲区。同样,这是应用程序控制的。
无论哪种情况,应用程序都必须告诉合成器表面的哪个区域保存了新内容。当应用程序直接渲染到共享缓冲区时,合成器需要注意到有新内容。而且,当交换缓冲区时,合成器不会假设有任何变化,并且在重绘桌面之前需要来自应用程序的请求。即使应用程序传递了一个新的缓冲区给合成器,也只有一小部分可能是不同的,比如闪烁的光标或微调框。
硬件支持Wayland
通常,硬件启用包括模型设置/显示和EGL/GLES2。最重要的是,Wayland需要一种在进程之间有效共享缓冲区的方法。它有两个方面,客户端和服务器端。
在客户端,我们定义了一个Wayland EGL平台。在EGL模型中,它由原生类型(EGLNativeDisplayType, EGLNativeWindowType和EGLNativePixmapType)和创建这些类型的方法组成。换句话说,它是将EGL堆栈及其缓冲区共享机制绑定到通用Wayland API的粘合代码。EGL协议栈有望提供Wayland EGL平台的实现。完整的API在wayland-egl.h头文件中。mesa EGL堆栈中的开源实现在platform_wayland.c中。
在底层,为了共享缓冲区,EGL堆栈被期望定义一个特定于供应商的协议扩展,它允许客户端EGL堆栈与合成器通信缓冲区细节。h API的重点是将其抽象出来,只让客户端为Wayland表面创建EGLSurface并开始渲染。开源堆栈使用drm Wayland扩展,它允许客户端发现要使用的drm设备并进行身份验证,然后与合成器共享drm (GEM)缓冲区。
Wayland的服务器端是垂直应用的合成器和核心用户体验,通常将任务切换器、应用启动器和锁定屏幕集成在一个单体应用中。服务器运行在模型设置API(内核模型设置,OpenWF显示或类似)之上,并使用EGL/GLES2合成器和硬件叠加(如果可用)的混合来组合最终UI。启用模型设置,EGL/GLES2和覆盖应该是标准硬件启动的一部分。启用Wayland的额外要求是EGL_WL_bind_wayland_display扩展,它允许合成器从通用Wayland共享缓冲区创建EGLImage。它类似于EGL_KHR_image_pixmap扩展,可以从X像素映射创建egimage。
这个扩展有一个设置步骤,必须将EGL显示绑定到Wayland显示。然后,当合成器从客户端接收通用的Wayland缓冲区时(通常当客户端调用eglSwapBuffers时),它将能够将结构体wl_buffer指针传递给eglCreateImageKHR作为EGLClientBuffer参数,并将EGL_WAYLAND_BUFFER_WL作为目标。这将创建一个EGLImage,然后可以被合成器用作纹理或传递给modessetting代码用作叠加平面。同样,这是由供应商特定的协议扩展实现的,它在服务器端将接收有关共享缓冲区的驱动程序特定细节,并在用户调用eglCreateImageKHR时将其转换为EGL映像。
特点介绍
Wayland还是一种系统架构。它不只是合成器与应用程序之间的服务器 - 客户端关系。与X11的Xorg不同,Wayland没有一个通用的服务器,而是每个图形环境都自带众多合成器实现方案中的一种。窗口管理和最终用户体验通常与合成器绑定,而非可互换的组件。
Wayland架构的核心部分是libwayland——一个进程间通信库,它将XML格式的协议定义转换为C语言的API。该库并不实现Wayland,它仅仅对Wayland消息进行编码和解码。实际的实现存在于各种合成器和应用程序工具包项目中。
Wayland并不限制其使用的位置和方式。Wayland组合器可以是独立的显示服务器,运行在Linux内核模式设置和evdev输入设备上,或者运行在许多其他操作系统上,也可以是嵌套的组合器,其本身是X11或Wayland应用程序(客户端)。Wayland甚至可以在应用程序内部通信中使用,就像某些网络浏览器所做的那样。
附属功能
Wayland有一些特定的调试工具:
合成器功能
运行wayland-info将会列出合成器所发布的所有全局接口。它还会提供有关其了解且有内容可报告的接口的更多信息,例如显示器的品牌和型号、wl_seat 功能以及wl_shm像素格式。wayland-info随wayland-utils提供,并且适用于任何合成器。
OpenGL
在Wayland下,OpenGL(所有版本)的功能可以通过Waffle提供的wflinfo进行查询。只需使用-p wayland参数即可。
协议转储工具
当使用 export WAYLAND_DEBUG=1(或 WAYLAND_DEBUG=client 或 WAYLAND_DEBUG=server)仍不够时,以下工具可能会有所帮助。
wayland-tracker
一个遵循MIT许可协议、用 Haskell 编写的Wayland协议转储工具,可生成二进制、文本和JSON格式的输出。作为单个客户端的中间人运行。
wayland-tracer
一个遵循MIT许可协议、用C语言编写的Wayland协议转储工具,可生成二进制和人类可读的输出。可以作为单个客户端的中间人运行,也可以充当中间人Wayland服务器。
wlanalyzer / wldump
一个遵循MIT许可协议、用C++编写的Wayland协议转储工具,可生成人类可读的输出。作为单个客户端的中间人运行。
wldbg
一个遵循MIT许可协议、用C语言编写的Wayland连接处理器。可以在服务器和客户端之间传递的消息上运行给定的函数,或者以类似 gdb 的模式运行。可以监听对合成器的新连接并接管它们。作为单个/多个客户端的中间人运行。
内省工具
GammaRay
一款针对Qt应用程序的软件内省工具,包括一个用于QtWayland合成器的模块。它利用libwayland-server内省API和QtWayland API,能够查看当前连接的客户端列表、它们的资源以及基于资源类型的相关信息,以及客户端与合成器之间的协议流。
wlhax
是一个终端用户界面应用程序,类似于Wayland代理。它监控并显示Wayland连接状态,例如当前的表面树。
应用
2023年5月16日,Deepin V23 Beta版发布,其中DDE Wayland 已经实现了对Wayland显示协议的支持。
2023年12月13日,基于Ubuntu的桌面发行版Linux Mint释出了 21.3 Beta,它的默认桌面环境Cinnamon释出了6.0版本,加入了对Wayland显示服务器的实验性支持。
2023年12月19日,Mozilla基金会发布了Firefox 121稳定版更新,这是2023年的最后一个主要版本更新。此次更新涵盖了Linux、AndroidWindowsmacOS平台,带来了多项改进和新增功能。其中包括Linux平台默认支持Wayland Compositor。
2024年1月16日,Wine团队宣布推出Wine 9.0正式版。此版本代表了该团队一年的开发努力和7000多项更改。Wine 9.0正式版的主要亮点是新的WoW64架构和实验性的Wayland驱动程序支持。
2024年12月17日,Xfce团队正式发布了Xfce 4.20版本,标志着这一轻量级桌面环境经过两年努力的重大进展。本次更新不仅引入了实验性支持Wayland,还对多个核心组件进行了显著改进,特别是默认文件管理器Thunar的升级,吸引了广大开源用户的关注。
发展历史
最新版本1.39发布于2024年12月20日。
全国各地天气预报查询

上海市

  • 市辖区
  • 云南省

  • 临沧市
  • 云南省

  • 丽江市
  • 云南省

  • 保山市
  • 云南省

  • 大理白族自治州
  • 云南省

  • 德宏傣族景颇族自治州
  • 云南省

  • 怒江傈僳族自治州
  • 云南省

  • 文山壮族苗族自治州
  • 云南省

  • 昆明市
  • 云南省

  • 昭通市
  • 云南省

  • 普洱市
  • 云南省

  • 曲靖市
  • 云南省

  • 楚雄彝族自治州
  • 云南省

  • 玉溪市
  • 云南省

  • 红河哈尼族彝族自治州
  • 云南省

  • 西双版纳傣族自治州
  • 云南省

  • 迪庆藏族自治州
  • 内蒙古自治区

  • 乌兰察布市
  • 内蒙古自治区

  • 乌海市
  • 内蒙古自治区

  • 兴安盟
  • 内蒙古自治区

  • 包头市
  • 内蒙古自治区

  • 呼伦贝尔市
  • 内蒙古自治区

  • 呼和浩特市
  • 内蒙古自治区

  • 巴彦淖尔市
  • 内蒙古自治区

  • 赤峰市
  • 内蒙古自治区

  • 通辽市
  • 内蒙古自治区

  • 鄂尔多斯市
  • 内蒙古自治区

  • 锡林郭勒盟
  • 内蒙古自治区

  • 阿拉善盟
  • 北京市

  • 市辖区
  • 吉林省

  • 吉林市
  • 吉林省

  • 四平市
  • 吉林省

  • 延边朝鲜族自治州
  • 吉林省

  • 松原市
  • 吉林省

  • 白城市
  • 吉林省

  • 白山市
  • 吉林省

  • 辽源市
  • 吉林省

  • 通化市
  • 吉林省

  • 长春市
  • 四川省

  • 乐山市
  • 四川省

  • 内江市
  • 四川省

  • 凉山彝族自治州
  • 四川省

  • 南充市
  • 四川省

  • 宜宾市
  • 四川省

  • 巴中市
  • 四川省

  • 广元市
  • 四川省

  • 广安市
  • 四川省

  • 德阳市
  • 四川省

  • 成都市
  • 四川省

  • 攀枝花市
  • 四川省

  • 泸州市
  • 四川省

  • 甘孜藏族自治州
  • 四川省

  • 眉山市
  • 四川省

  • 绵阳市
  • 四川省

  • 自贡市
  • 四川省

  • 资阳市
  • 四川省

  • 达州市
  • 四川省

  • 遂宁市
  • 四川省

  • 阿坝藏族羌族自治州
  • 四川省

  • 雅安市
  • 天津市

  • 市辖区
  • 宁夏回族自治区

  • 中卫市
  • 宁夏回族自治区

  • 吴忠市
  • 宁夏回族自治区

  • 固原市
  • 宁夏回族自治区

  • 石嘴山市
  • 宁夏回族自治区

  • 银川市
  • 安徽省

  • 亳州市
  • 安徽省

  • 六安市
  • 安徽省

  • 合肥市
  • 安徽省

  • 安庆市
  • 安徽省

  • 宣城市
  • 安徽省

  • 宿州市
  • 安徽省

  • 池州市
  • 安徽省

  • 淮北市
  • 安徽省

  • 淮南市
  • 安徽省

  • 滁州市
  • 安徽省

  • 芜湖市
  • 安徽省

  • 蚌埠市
  • 安徽省

  • 铜陵市
  • 安徽省

  • 阜阳市
  • 安徽省

  • 马鞍山市
  • 安徽省

  • 黄山市
  • 山东省

  • 东营市
  • 山东省

  • 临沂市
  • 山东省

  • 威海市
  • 山东省

  • 德州市
  • 山东省

  • 日照市
  • 山东省

  • 枣庄市
  • 山东省

  • 泰安市
  • 山东省

  • 济南市
  • 山东省

  • 济宁市
  • 山东省

  • 淄博市
  • 山东省

  • 滨州市
  • 山东省

  • 潍坊市
  • 山东省

  • 烟台市
  • 山东省

  • 聊城市
  • 山东省

  • 菏泽市
  • 山东省

  • 青岛市
  • 山西省

  • 临汾市
  • 山西省

  • 吕梁市
  • 山西省

  • 大同市
  • 山西省

  • 太原市
  • 山西省

  • 忻州市
  • 山西省

  • 晋中市
  • 山西省

  • 晋城市
  • 山西省

  • 朔州市
  • 山西省

  • 运城市
  • 山西省

  • 长治市
  • 山西省

  • 阳泉市
  • 广东省

  • 东莞市
  • 广东省

  • 中山市
  • 广东省

  • 云浮市
  • 广东省

  • 佛山市
  • 广东省

  • 广州市
  • 广东省

  • 惠州市
  • 广东省

  • 揭阳市
  • 广东省

  • 梅州市
  • 广东省

  • 汕头市
  • 广东省

  • 汕尾市
  • 广东省

  • 江门市
  • 广东省

  • 河源市
  • 广东省

  • 深圳市
  • 广东省

  • 清远市
  • 广东省

  • 湛江市
  • 广东省

  • 潮州市
  • 广东省

  • 珠海市
  • 广东省

  • 肇庆市
  • 广东省

  • 茂名市
  • 广东省

  • 阳江市
  • 广东省

  • 韶关市
  • 广西壮族自治区

  • 北海市
  • 广西壮族自治区

  • 南宁市
  • 广西壮族自治区

  • 崇左市
  • 广西壮族自治区

  • 来宾市
  • 广西壮族自治区

  • 柳州市
  • 广西壮族自治区

  • 桂林市
  • 广西壮族自治区

  • 梧州市
  • 广西壮族自治区

  • 河池市
  • 广西壮族自治区

  • 玉林市
  • 广西壮族自治区

  • 百色市
  • 广西壮族自治区

  • 贵港市
  • 广西壮族自治区

  • 贺州市
  • 广西壮族自治区

  • 钦州市
  • 广西壮族自治区

  • 防城港市
  • 新疆维吾尔自治区

  • 乌鲁木齐市
  • 新疆维吾尔自治区

  • 伊犁哈萨克自治州
  • 新疆维吾尔自治区

  • 克孜勒苏柯尔克孜自治州
  • 新疆维吾尔自治区

  • 克拉玛依市
  • 新疆维吾尔自治区

  • 博尔塔拉蒙古自治州
  • 新疆维吾尔自治区

  • 吐鲁番市
  • 新疆维吾尔自治区

  • 和田地区
  • 新疆维吾尔自治区

  • 哈密市
  • 新疆维吾尔自治区

  • 喀什地区
  • 新疆维吾尔自治区

  • 塔城地区
  • 新疆维吾尔自治区

  • 巴音郭楞蒙古自治州
  • 新疆维吾尔自治区

  • 昌吉回族自治州
  • 新疆维吾尔自治区

  • 自治区直辖县级行政区划
  • 新疆维吾尔自治区

  • 阿克苏地区
  • 新疆维吾尔自治区

  • 阿勒泰地区
  • 江苏省

  • 南京市
  • 江苏省

  • 南通市
  • 江苏省

  • 宿迁市
  • 江苏省

  • 常州市
  • 江苏省

  • 徐州市
  • 江苏省

  • 扬州市
  • 江苏省

  • 无锡市
  • 江苏省

  • 泰州市
  • 江苏省

  • 淮安市
  • 江苏省

  • 盐城市
  • 江苏省

  • 苏州市
  • 江苏省

  • 连云港市
  • 江苏省

  • 镇江市
  • 江西省

  • 上饶市
  • 江西省

  • 九江市
  • 江西省

  • 南昌市
  • 江西省

  • 吉安市
  • 江西省

  • 宜春市
  • 江西省

  • 抚州市
  • 江西省

  • 新余市
  • 江西省

  • 景德镇市
  • 江西省

  • 萍乡市
  • 江西省

  • 赣州市
  • 江西省

  • 鹰潭市
  • 河北省

  • 保定市
  • 河北省

  • 唐山市
  • 河北省

  • 廊坊市
  • 河北省

  • 张家口市
  • 河北省

  • 承德市
  • 河北省

  • 沧州市
  • 河北省

  • 石家庄市
  • 河北省

  • 秦皇岛市
  • 河北省

  • 衡水市
  • 河北省

  • 邢台市
  • 河北省

  • 邯郸市
  • 河南省

  • 三门峡市
  • 河南省

  • 信阳市
  • 河南省

  • 南阳市
  • 河南省

  • 周口市
  • 河南省

  • 商丘市
  • 河南省

  • 安阳市
  • 河南省

  • 平顶山市
  • 河南省

  • 开封市
  • 河南省

  • 新乡市
  • 河南省

  • 洛阳市
  • 河南省

  • 漯河市
  • 河南省

  • 濮阳市
  • 河南省

  • 焦作市
  • 河南省

  • 省直辖县级行政区划
  • 河南省

  • 许昌市
  • 河南省

  • 郑州市
  • 河南省

  • 驻马店市
  • 河南省

  • 鹤壁市
  • 浙江省

  • 丽水市
  • 浙江省

  • 台州市
  • 浙江省

  • 嘉兴市
  • 浙江省

  • 宁波市
  • 浙江省

  • 杭州市
  • 浙江省

  • 温州市
  • 浙江省

  • 湖州市
  • 浙江省

  • 绍兴市
  • 浙江省

  • 舟山市
  • 浙江省

  • 衢州市
  • 浙江省

  • 金华市
  • 海南省

  • 三亚市
  • 海南省

  • 三沙市
  • 海南省

  • 儋州市
  • 海南省

  • 海口市
  • 海南省

  • 省直辖县级行政区划
  • 湖北省

  • 十堰市
  • 湖北省

  • 咸宁市
  • 湖北省

  • 孝感市
  • 湖北省

  • 宜昌市
  • 湖北省

  • 恩施土家族苗族自治州
  • 湖北省

  • 武汉市
  • 湖北省

  • 省直辖县级行政区划
  • 湖北省

  • 荆州市
  • 湖北省

  • 荆门市
  • 湖北省

  • 襄阳市
  • 湖北省

  • 鄂州市
  • 湖北省

  • 随州市
  • 湖北省

  • 黄冈市
  • 湖北省

  • 黄石市
  • 湖南省

  • 娄底市
  • 湖南省

  • 岳阳市
  • 湖南省

  • 常德市
  • 湖南省

  • 张家界市
  • 湖南省

  • 怀化市
  • 湖南省

  • 株洲市
  • 湖南省

  • 永州市
  • 湖南省

  • 湘潭市
  • 湖南省

  • 湘西土家族苗族自治州
  • 湖南省

  • 益阳市
  • 湖南省

  • 衡阳市
  • 湖南省

  • 邵阳市
  • 湖南省

  • 郴州市
  • 湖南省

  • 长沙市
  • 甘肃省

  • 临夏回族自治州
  • 甘肃省

  • 兰州市
  • 甘肃省

  • 嘉峪关市
  • 甘肃省

  • 天水市
  • 甘肃省

  • 定西市
  • 甘肃省

  • 平凉市
  • 甘肃省

  • 庆阳市
  • 甘肃省

  • 张掖市
  • 甘肃省

  • 武威市
  • 甘肃省

  • 甘南藏族自治州
  • 甘肃省

  • 白银市
  • 甘肃省

  • 酒泉市
  • 甘肃省

  • 金昌市
  • 甘肃省

  • 陇南市
  • 福建省

  • 三明市
  • 福建省

  • 南平市
  • 福建省

  • 厦门市
  • 福建省

  • 宁德市
  • 福建省

  • 泉州市
  • 福建省

  • 漳州市
  • 福建省

  • 福州市
  • 福建省

  • 莆田市
  • 福建省

  • 龙岩市
  • 西藏自治区

  • 山南市
  • 西藏自治区

  • 拉萨市
  • 西藏自治区

  • 日喀则市
  • 西藏自治区

  • 昌都市
  • 西藏自治区

  • 林芝市
  • 西藏自治区

  • 那曲市
  • 西藏自治区

  • 阿里地区
  • 贵州省

  • 六盘水市
  • 贵州省

  • 安顺市
  • 贵州省

  • 毕节市
  • 贵州省

  • 贵阳市
  • 贵州省

  • 遵义市
  • 贵州省

  • 铜仁市
  • 贵州省

  • 黔东南苗族侗族自治州
  • 贵州省

  • 黔南布依族苗族自治州
  • 贵州省

  • 黔西南布依族苗族自治州
  • 辽宁省

  • 丹东市
  • 辽宁省

  • 大连市
  • 辽宁省

  • 抚顺市
  • 辽宁省

  • 朝阳市
  • 辽宁省

  • 本溪市
  • 辽宁省

  • 沈阳市
  • 辽宁省

  • 盘锦市
  • 辽宁省

  • 营口市
  • 辽宁省

  • 葫芦岛市
  • 辽宁省

  • 辽阳市
  • 辽宁省

  • 铁岭市
  • 辽宁省

  • 锦州市
  • 辽宁省

  • 阜新市
  • 辽宁省

  • 鞍山市
  • 重庆市

  • 重庆市

  • 市辖区
  • 陕西省

  • 咸阳市
  • 陕西省

  • 商洛市
  • 陕西省

  • 安康市
  • 陕西省

  • 宝鸡市
  • 陕西省

  • 延安市
  • 陕西省

  • 榆林市
  • 陕西省

  • 汉中市
  • 陕西省

  • 渭南市
  • 陕西省

  • 西安市
  • 陕西省

  • 铜川市
  • 青海省

  • 果洛藏族自治州
  • 青海省

  • 海东市
  • 青海省

  • 海北藏族自治州
  • 青海省

  • 海南藏族自治州
  • 青海省

  • 海西蒙古族藏族自治州
  • 青海省

  • 玉树藏族自治州
  • 青海省

  • 西宁市
  • 青海省

  • 黄南藏族自治州
  • 黑龙江省

  • 七台河市
  • 黑龙江省

  • 伊春市
  • 黑龙江省

  • 佳木斯市
  • 黑龙江省

  • 双鸭山市
  • 黑龙江省

  • 哈尔滨市
  • 黑龙江省

  • 大兴安岭地区
  • 黑龙江省

  • 大庆市
  • 黑龙江省

  • 牡丹江市
  • 黑龙江省

  • 绥化市
  • 黑龙江省

  • 鸡西市
  • 黑龙江省

  • 鹤岗市
  • 黑龙江省

  • 黑河市
  • 黑龙江省

  • 齐齐哈尔市