多分辨率
多分辨率问题
开发人员经常会遇到麻烦, 不知道如何在他们的游戏中最好地支持多种分辨率. 对于桌面和控制台游戏, 这或多或少是简单的, 因为大多数屏幕长宽比是16:9, 分辨率是标准的720p, 1080p, 1440p, 4K,.......
对于手机游戏来说,起初,这很容易。许多年来,iPhone 和 iPad 使用相同的分辨率。当实行 Retina 后,他们只是将像素密度提高了一倍;大多数开发商不得不以默认和双倍的分辨率提供资产。
如今, 情况已不再如此, 因为有很多不同的屏幕尺寸, 密度和长宽比. 非传统的尺寸也越来越受欢迎, 如超宽显示屏.
对于3D游戏来说, 没有太大的必要支持多种分辨率(从审美角度来看).3D几何图形将根据视场填充屏幕, 而不考虑长宽比. 在这种情况下, 人们可能想要支持的主要原因是为了 性能 的原因(以较低的分辨率运行以增加每秒的帧数).
对于2D和游戏UI, 这是一个不同的问题, 因为设计需要在Photoshop, GIMP或Krita等软件中使用特定的像素尺寸来创建.
由于布局, 长宽比, 分辨率和像素密度会有很大的变化, 因此不再可能为每个特定的屏幕设计UI. 必须使用另一种方法.
万全之策
最常见的方法是使用一个单一的 基础 分辨率, 然后将其适用于其他所有情况. 这个分辨率是大多数玩家预期的玩游戏的方式, 鉴于他们的硬件. 对于移动设备, 谷歌在网上有有用的 统计资料 , 对于桌面设备,Steam 也有 .
举个例子,Steam显示最常见的 主要显示分辨率是 1920×1080, 所以明智的做法是为这个分辨率开发一个游戏, 然后期处理不同尺寸和长宽比的缩放.
Godot 还提供了一系列通用的容器.
参见
你可以使用多分辨率和纵横比演示项目,来了解 Godot 对多分辨率的支持如何实际工作。
基本大小
窗口的基本尺寸可以在项目设置中的 Display → Window 下指定.

然而, 它的作用并不完全明显; 引擎将 不 尝试将显示器切换到此分辨率. 相反, 将此设置视为 "设计大小", 即你在编辑器中使用的区域的大小. 此设置直接对应于2D编辑器中蓝色矩形的大小.
通常需要支持具有与该基本大小不同的屏幕和窗口大小的设备. Godot提供了许多方法来控制视口的大小调整和拉伸到不同的屏幕大小.
备注
在该页面上,窗口指的是系统分配给你的游戏的屏幕区域,而视口指的是游戏控制以填充该屏幕区域的根对象(可从 get_tree().root
访问)。该视口是一个 Window 实例。回想一下《前言》,所有 Window 对象都是视口。
To configure the stretch base size at runtime from a script, use the
get_tree().root.content_scale_size
property (see
Window.content_scale_size).
Changing this value can indirectly change the size of 2D elements. However, to
provide a user-accessible scaling option, using
拉伸缩放 is recommended as it's easier to
adjust.
备注
Godot遵循了现代多种分辨率的方法. 引擎永远不会自行改变显示器的分辨率. 虽然改变显示器的分辨率是最有效的方法, 但这也是最不可靠的方法, 因为如果游戏崩溃, 它可能会让显示器卡在一个低分辨率上. 这在macOS或Linux上很常见, 因为它们对分辨率变化的处理不如Windows.
更改显示器的分辨率还会取消游戏开发者对过滤和纵横比拉伸的控制, 这对于确保像素游戏的正确显示画面非常重要.
最重要的是, 更改显示器的分辨率会使游戏的Alt-Tab键切换速度变慢, 因为每次切换时显示器都必须更改分辨率.
调整大小
设备有多种类型,其屏幕也有多种类型,而屏幕又具有不同的像素密度和分辨率。处理所有这些可能是一项艰巨的工作,因此 Godot 试图让开发人员的生活更轻松一些。Viewport 节点有多个函数来处理调整大小,并且场景树的根节点始终是一个视口(加载的场景实例化为其子节点,并且始终可以通过调用 get_tree().root
或 get_node("/root")
来访问它)。
无论如何,虽然更改根视口参数可能是解决问题最灵活的方法,但它可能需要大量的工作、代码和猜测,因此 Godot 在项目设置中提供了一组参数来处理多种分辨率。
拉伸设置
拉伸设置位于项目设置中, 提供了几个选项:

拉伸模式
拉伸模式设置定义了如何拉伸基本大小以适应窗口或屏幕的分辨率。下面的动画使用仅 16×9 像素的“基本大小”来演示不同拉伸模式的效果。同样为 16×9 像素的单个精灵覆盖整个视口,并在其上添加一条对角线 Line2D:

Stretch Mode = Disabled(默认):不发生拉伸。场景中的一个单位对应屏幕上的一个像素。在这种模式下,拉伸纵横比设置无效。
Stretch Mode = Canvas Items:在这种模式下,项目设置中以宽度和高度指定的基本大小将被拉伸以覆盖整个屏幕(会考虑拉伸纵横比设置)。这意味着所有内容都直接以目标分辨率渲染。3D 不受影响,而在 2D 中,精灵像素和屏幕像素之间不再是 1:1 的对应关系,这可能会导致缩放伪影。
Stretch Mode = Viewport : 视口缩放意味着根 Viewport 的尺寸被精确地设置为在项目设置的 Display 部分指定的基本尺寸. 场景首先被渲染到这个视口. 最后, 这个视口被缩放以适应屏幕(考虑 Stretch Aspect 的设置).
要在运行时从脚本配置拉伸模式,请使用 get_tree().root.content_scale_mode
属性(参见 Window.content_scale_mode 和 ContentScaleMode 枚举)。
拉伸比例
第二个设置是拉伸纵横比. 请注意, 只有在 Stretch Mode 被设置为 Disabled 以外的情况下, 这才会生效.
在下面的动画中, 你会注意到灰色和黑色区域. 黑色区域由引擎添加, 无法绘制. 灰色区域是场景的一部分, 可以绘制. 灰色区域对应于你在2D编辑器中看到的蓝色框架外的区域.
Stretch Aspect = Ignore : 在拉伸屏幕时忽略长宽比. 这意味着原始分辨率将被拉伸以完全填满屏幕, 即使它更宽或更窄. 这可能会导致不均匀的拉伸, 事物看起来比设计的更宽或更高.
Stretch Aspect = Keep : 在拉伸屏幕的时候保持长宽比. 这意味着无论屏幕分辨率如何, 视口都会保留原来的尺寸, 黑条会被添加到屏幕的顶部或底部("宽屏模式 ")或侧面(" 竖屏模式").
如果你事先知道目标设备的宽高比, 或者你不想处理不同的宽高比, 这是一个不错的选择.
Stretch Aspect = Keep Width : 在拉伸屏幕时保持长宽比. 如果屏幕比基本尺寸宽, 则会在左右两边添加黑条(竖屏模式). 但如果屏幕比基本分辨率高, 视口将在垂直方向上增长(更多的内容将在底部可见). 你也可以把它看作是 "垂直扩展" .
这通常是创建可扩展的GUI或HUD的最佳选择, 因此一些控件可以锚定到底部( 大小和锚点).
Stretch Aspect = Keep Height : 在拉伸屏幕时保持长宽比. 如果屏幕比基本尺寸高, 则会在顶部和底部添加黑条(宽屏模式). 但如果屏幕比基本分辨率宽, 视口将在水平方向上增长(更多的内容将在右边可见). 你也可以把它看作是 "水平扩展" .
这通常是水平滚动的2D游戏的最佳选择(如跑步者或平台游戏者).
Stretch Aspect = Expand : 在拉伸屏幕时保持长宽比, 但既不保持基本宽度也不保持高度. 根据屏幕的长宽比, 视口将在水平方向(如果屏幕比基本尺寸宽)或垂直方向上变大(如果屏幕比原始尺寸高).
小技巧
为了以类似的自动确定的比例系数支持纵向和横向模式,请将你的项目的基本分辨率设置为 方形 (1:1长宽比)而不是矩形。例如,如果你希望以1280×720为基本分辨率进行设计,但又希望同时支持纵向和横向模式,那么在项目设置中使用720×720作为项目的基本窗口尺寸。
To allow the user to choose their preferred screen orientation at runtime,
remember to set Display > Window > Handheld > Orientation to sensor
.
要在运行时从脚本配置拉伸纵横比,请使用 get_tree().root.content_scale_aspect
属性(参见 Window.content_scale_aspect 和 ContentScaleAspect 枚举)。
拉伸缩放
设置设置允许你在上面拉伸选项已提供的内容之上添加额外的缩放系数。默认值 1.0
意味着不会发生额外的缩放。
例如,如果你将 Scale 设置为 2.0
并将 Stretch Mode 保留为 Disabled,则场景中的每个单元将对应屏幕上的 2×2 像素。这是为非游戏应用程序提供缩放选项的好方式。
如果将 Stretch Mode 设置为 canvas_items,2D 元素将相对于基本窗口大小进行缩放,然后乘以 Scale 设置。这可以向玩家公开,以允许他们根据自己的喜好调整自动确定的比例,从而获得更好的可访问性。
如果将 Stretch Mode 设置为 viewport,则视口的分辨率将除以 Scale。这会使像素看起来更大,并降低渲染分辨率(在给定窗口大小的情况下),从而可以提高性能。
要从脚本在运行时配置拉伸比例,请使用 get_tree().root.content_scale_factor
属性(参见 Window.content_scale_factor)。
拉伸缩放模式
自 Godot 4.2 起,拉伸比例模式设置允许你将自动确定的比例系数(以及手动指定的拉伸比例设置)限制为整数值。默认情况下,该设置设置为 fractional
,允许应用任何比例系数(包括如 2.5
等小数值)。设置为 integer
时,该值将向下舍入为最接近的整数。例如,不使用比例系数 2.5
,而是向下舍入为 2.0
。这对于防止显示像素艺术时出现失真很有用。
比较使用 viewport
拉伸模式显示的像素艺术,其拉伸比例模式设置为 fractional
:

棋盘看上去并不“均匀”。徽标和文本中的线宽也存在大幅变化。
该像素艺术也以 viewport
拉伸模式显示,但这次拉伸比例模式设置为 integer
:

棋盘看上去就非常均匀了。线宽也是一致的。
打个比方,如果视口的基础大小为 640×360 而窗口大小为 1366×768:
使用
fractional
时,视口会以 1366×768 的分辨率显示(缩放系数大约是 2.133×),占用整个屏幕空间。视口中的每个像素都对应 2.133×2.133 像素的显示区域。不过因为显示器只能显示“完整”的像素,就会导致不均匀的像素缩放,造成像素画的显示异常。使用
integer
时,视口会以 1280×720 的分辨率显示(缩放系数为 2×)。四周的剩余空间使用黑条填充,这样视口中的每个像素都对应 2×2 像素的显示区域。
这个设置在所有拉伸模式下均会生效。不过使用 disabled
拉伸模式时只会影响拉伸缩放设置,将其向下取整。可用于使用像素风 UI 的 3D 游戏,此时 3D 视口的可见区域并不会减少(而在 canvas_items
和 viewport
拉伸模式下启用 integer
缩放模式时就会减少)。
小技巧
游戏应该使用独占全屏窗口模式,而不是全屏,后者旨在防止 Windows 自动将窗口视为独占全屏。
全屏旨在供想要使用每像素透明度而又不存在被操作系统禁用的风险的 GUI 应用程序使用。它通过在屏幕底部留下一条 1 像素的线来实现这一点。相比之下,独占全屏使用实际屏幕大小,并允许 Windows 减少全屏游戏的抖动和输入延迟。
当使用整数缩放时,这一点尤为重要,因为全屏模式下 1 像素的高度减少可能导致整数缩放使用比预期更小的比例系数。
常见使用场景
如果要适配多种分辨率和纵横比,推荐使用以下设置。
桌面游戏
非像素风:
将基础窗口宽度设置为
1920
、窗口高度设置为1080
。如果你的显示器小于 1920×1080,请将窗口宽度覆盖和窗口高度覆盖设置为较小的值,项目启动时就会将窗口调小。或者如果你主要针对的是高端设备,那么就把基础窗口宽度设置为
3840
、窗口高度设置为2160
。这样你就可以提供更高分辨率的 2D 资产,用更高的内存占用和文件大小换取更清晰的画面。注意,这样做会让未做 mipmap 的纹理在低分辨率设备上具有颗粒感,请参考 减少缩减取样的混叠 进行操作。将拉伸模式设置为
canvas_items
(画布项)。将拉伸比例设置为
expand
(扩展)。这样可以支持多种分辨率,并且能够更好地利用较长的智能手机屏幕(例如 18:9 和 19:9 的长宽比)。使用布局菜单将 Control 节点的锚点吸附到正确的角落。
像素风:
将基础窗口大小设置为你想要使用的视口尺寸。大多数像素风游戏使用的视口尺寸在 256×224 和 640×480 之间。640×360 是不错的基准,因为使用整数缩放时无论是缩放到 1280×720、1920×1080、2560×1440 还是 3840×2160 都不会出现黑条。视口尺寸越大,所需资产的分辨率也就越高,除非你想要能够显示更大的游戏世界区域。
将拉伸模式设置为
viewport
(视口)。将拉伸比例设置为
keep
(保持)可以(通过添加黑条的方式)强制使用固定的长宽比。如果你想支持不同长宽比的话,也可以把拉伸模式设置为expand
(扩展)。如果选用
expand
拉伸比例,使用布局菜单将 Control 节点的锚点吸附到正确的角落。将拉伸缩放模式设置为
integer
。这样就能够防止出现非整数倍的像素缩放,让像素画保持原样显示。
备注
viewport
拉伸模式会先以较低分辨率渲染,然后拉伸到最终窗口的大小。如果你能够接受精灵可以移动或者旋转到“次像素”位置,或者希望有高分辨率的 3D 视图,可以把 viewport
拉伸模式换成 canvas_items
模式。
横屏的手机游戏
Godot 默认使用横屏模式,所以你无需在项目设置中调整显示方向。
将基础窗口宽度设置为
1280
,窗口高度设置为720
。或者如果你主要针对的是高端设备,那么就把基础窗口宽度设置为
1920
、窗口高度设置为1080
。这样你就可以提供更高分辨率的 2D 资产,用更高的内存占用和文件大小换取更清晰的画面。很多设备拥有更高分辨率的显示屏(1440p),但因为智能手机的屏幕比较小,所以很难看出和 1080p 的区别。注意,这样做会让未做 mipmap 的纹理在低分辨率设备上具有颗粒感,请参考 减少缩减取样的混叠 进行操作。将拉伸模式设置为
canvas_items
(画布项)。将拉伸比例设置为
expand
(扩展)。这样可以支持多种分辨率,并且能够更好地利用较长的智能手机屏幕(例如 18:9 和 19:9 的长宽比)。使用布局菜单将 Control 节点的锚点吸附到正确的角落。
小技巧
为了更好地支持平板和折叠屏手机(这些设备的显示器纵横比通常接近 4:3),请在按照其他步骤操作时考虑使用纵横比为 4:3 的基础分辨率。例如可以将基础窗口宽度设置为 1280
、基础窗口高度设置为 960
。
竖屏的手机游戏
将基础窗口宽度设置为
720
、窗口高度设置为1280
。或者如果你主要针对的是高端设备,那么就把基础窗口宽度设置为
1080
、窗口高度设置为1920
。这样你就可以提供更高分辨率的 2D 资产,用更高的内存占用和文件大小换取更清晰的画面。很多设备拥有更高分辨率的显示屏(1440p),但因为智能手机的屏幕比较小,所以很难看出和 1080p 的区别。注意,这样做会让未做 mipmap 的纹理在低分辨率设备上具有颗粒感,请参考 减少缩减取样的混叠 进行操作。将显示 > 窗口 > 手持 > 朝向设置为
portrait
(竖屏)。将拉伸模式设置为
canvas_items
(画布项)。将拉伸比例设置为
expand
(扩展)。这样可以支持多种分辨率,并且能够更好地利用较长的智能手机屏幕(例如 18:9 和 19:9 的长宽比)。使用布局菜单将 Control 节点的锚点吸附到正确的角落。
小技巧
为了更好地支持平板和折叠屏手机(这些设备的显示器纵横比通常接近 4:3),请在按照其他步骤操作时考虑使用纵横比为 3:4 的基础分辨率。例如可以将基础窗口宽度设置为 960
、基础窗口高度设置为 1280
。
非游戏应用
将基础窗口宽高设置为你想要支持的最小窗口尺寸。这不是必须的,但是可以保证你在设计 UI 时考虑较小的窗口尺寸。
保持拉伸模式为默认值
disabled
(禁用)。保持拉伸比例为默认值
ignore
(因为拉伸模式是disabled
,所以这里的值不会被用到)。你可以通过在脚本的
_ready()
函数中调用get_window().set_min_size()
来定义最小窗口大小。这可以防止用户将应用程序调整到低于某个大小,否则可能会破坏 UI 布局。
备注
Godot 尚未支持手动设置 2D 缩放比例,所以无法在非游戏应用中支持 hiDPI。因此,推荐为非游戏应用禁用 Allow Hidpi 选项,操作系统会回退到低 DPI。
支持 hiDPI 高分辨率屏幕
默认情况下,操作系统会将 Godot 项目视为 DPI 感知项目。这由显示 > 窗口 > DPI > 允许 HiDPI项目设置控制,该设置应尽可能保持启用状态。禁用 DPI 感知可能会破坏在 Windows 上的全屏行为。
由于 Godot 项目具有 DPI 感知能力,因此在 hiDPI 显示器上启动时,它们可能会以非常小的窗口大小显示(与屏幕分辨率成比例)。对于游戏,解决该问题的最常见方法是默认将它们设置为全屏。或者,你可以根据屏幕大小在自动加载的 _ready()
函数中设置窗口大小。
为了确保 2D 元素在 hiDPI 显示屏上不会显得太小:
对于游戏,使用
canvas_items
或viewport
拉伸模式,以便 2D 元素根据当前窗口大小自动调整大小。对于非游戏应用程序,请使用
disabled
拉伸模式,并在 autoload 的_ready()
函数中将拉伸比例设置为与显示比例系数相对应的值。显示比例系数在操作系统的设置中设置,可以使用 screen_get_scale 进行查询。该方法目前仅在 macOS 上实现。在其他操作系统上,你需要实现一种方法来根据屏幕分辨率猜测显示比例系数(使用设置让用户在需要时覆盖该设置)。这是 Godot 编辑器当前使用的方法。
允许 HiDPI 设置仅在 Windows 和 macOS 上有效。所有其他平台都会忽略该设置。
备注
Godot 编辑器本身是打开了这个选项,与 DPI 相关的。但在编辑器中运行项目时,只有在项目设置里启用 Allow Hidpi 才会让项目与 DPI 相关。
减少缩减取样的混叠
如果游戏的基本分辨率很高(如 3840×2160),当采样降到相当低的分辨率(如 1280×720)时,可能会出现锯齿。
To resolve this, you can enable mipmaps on all your 2D textures. However, enabling mipmaps will increase memory usage which can be an issue on low-end mobile devices.
处理纵横比
一旦考虑到不同分辨率的缩放, 请确保你的 user interface 也能为不同的长宽比进行缩放. 这可以使用 anchors 和/或 containers 来完成.
视场角缩放
3D相机节点的 Keep Aspect 属性默认为 Keep Height 缩放模式(也称为 Hor+ ). 在横屏模式下, 这通常是桌面游戏和手机游戏的最佳选择, 因为宽屏显示器会自动使用更宽的视野.
然而, 如果你的3D游戏打算使用纵向模式, 那么使用 Keep Width保持宽度 称为( Vert- )可能会更有意义. 这样, 宽高比大于16:9(例如19:9)的智能手机将使用 更高 的视野, 这在这里更符合逻辑.
使用 Viewport 以不同的方式缩放 2D 和 3D 元素
使用多个视图窗口节点, 可以对不同的元素使用不同的比例. 例如, 你可以使用此选项以低分辨率渲染3D世界, 同时将2D元素保持在原生分辨率. 这可以显著提高性能, 同时保持HUD和其他2D元素的清晰度.
这是通过仅对 2D 元素使用根 Viewport 节点,然后创建一个 Viewport 节点来显示 3D 世界,并使用 SubViewportContainer 或 TextureRect 节点显示该 Viewport 节点来实现的。最终项目中实际上会有两个视口。使用 TextureRect 而不是 SubViewportContainer 的一个好处是它允许启用线性过滤。这会使缩放的 3D 视口在许多情况下看起来更好。
有关示例, 请参见 3D 视口缩放演示 .