多分辨率
多分辨率问题
开发人员经常会遇到麻烦, 不知道如何在他们的游戏中最好地支持多种分辨率. 对于桌面和控制台游戏, 这或多或少是简单的, 因为大多数屏幕长宽比是16:9, 分辨率是标准的720p, 1080p, 1440p, 4K,.......
对于手机游戏来说,起初,这很容易。许多年来,iPhone 和 iPad 使用相同的分辨率。当实行 Retina 后,他们只是将像素密度提高了一倍;大多数开发商不得不以默认和双倍的分辨率提供资产。
如今, 情况已不再如此, 因为有很多不同的屏幕尺寸, 密度和长宽比. 非传统的尺寸也越来越受欢迎, 如超宽显示屏.
For 3D rendering, there is not much of a need to support multiple resolutions. Thanks to its vector-based nature, 3D geometry will just fill the screen based on the viewport size. For 2D and game UIs, this is a different matter, as art needs to be created using specific pixel sizes in software such as Photoshop, GIMP or 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 在项目设置中提供了一组参数来处理多种分辨率。
小技巧
To render 3D at a lower resolution than 2D elements (without needing separate viewports), you can use Godot's resolution scaling support. This is a good way to improve performance significantly in GPU-bottlenecked scenarios. This works with any stretch mode and stretch aspect combination.
拉伸设置
拉伸设置位于项目设置中, 提供了几个选项:
拉伸模式
拉伸模式设置定义了如何拉伸基本大小以适应窗口或屏幕的分辨率。下面的动画使用仅 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)。
您还可以通过 GUI > 主题 > 默认主题缩放比例 项目设置,调整默认项目主题生成时的缩放比例。这可用于在基础分辨率显著高于或低于默认值时,创建逻辑尺寸更合理的用户界面。但该设置无法在运行时更改,因为其值仅在项目启动时读取一次。
拉伸缩放模式
自 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,请将窗口宽度覆盖和窗口高度覆盖设置为较小的值,项目启动时就会将窗口调小。Alternatively, if you're targeting high-end devices primarily, set the base window width to
3840and window height to2160. This allows you to provide higher resolution 2D assets, resulting in crisper visuals at the cost of higher memory usage and file sizes. You'll also want to increase GUI > Theme > Default Theme Scale to a value between2.0and3.0to ensure UI elements remain readable.Note that this will make non-mipmapped textures grainy on low resolution devices, so make sure to follow the instructions described in 减少缩减取样的混叠.
将拉伸模式设置为
canvas_items(画布项)。将拉伸比例设置为
expand(扩展)。这样可以支持多种分辨率,并且能够更好地利用较长的智能手机屏幕(例如 18:9 和 19:9 的长宽比)。使用布局菜单将 Control 节点的锚点吸附到正确的角落。
For 3D games, consider exposing 分辨率缩放 in the game's options menu to allow players to adjust the 3D rendering resolution separately from UI elements. This is useful for performance tuning, especially on lower-end hardware.
像素风:
将基础窗口大小设置为你想要使用的视口尺寸。大多数像素风游戏使用的视口尺寸在 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。Alternatively, if you're targeting high-end devices primarily, set the base window width to
1920and window height to1080. This allows you to provide higher resolution 2D assets, resulting in crisper visuals at the cost of higher memory usage and file sizes. Many devices have even higher resolution displays (1440p), but the difference with 1080p is barely visible given the small size of smartphone displays. You'll also want to increase GUI > Theme > Default Theme Scale to a value between1.5and2.0to ensure UI elements remain readable.Note that this will make non-mipmapped textures grainy on low resolution devices, so make sure to follow the instructions described in 减少缩减取样的混叠.
将拉伸模式设置为
canvas_items(画布项)。将拉伸比例设置为
expand(扩展)。这样可以支持多种分辨率,并且能够更好地利用较长的智能手机屏幕(例如 18:9 和 19:9 的长宽比)。使用布局菜单将 Control 节点的锚点吸附到正确的角落。
小技巧
为了更好地支持平板和折叠屏手机(这些设备的显示器纵横比通常接近 4:3),请在按照其他步骤操作时考虑使用纵横比为 4:3 的基础分辨率。例如可以将基础窗口宽度设置为 1280、基础窗口高度设置为 960。
竖屏的手机游戏
将基础窗口宽度设置为
720、窗口高度设置为1280。Alternatively, if you're targeting high-end devices primarily, set the base window width to
1080and window height to1920. This allows you to provide higher resolution 2D assets, resulting in crisper visuals at the cost of higher memory usage and file sizes. Many devices have even higher resolution displays (1440p), but the difference with 1080p is barely visible given the small size of smartphone displays. You'll also want to increase GUI > Theme > Default Theme Scale to a value between1.5and2.0to ensure UI elements remain readable.Note that this will make non-mipmapped textures grainy on low resolution devices, so make sure to follow the instructions described in 减少缩减取样的混叠.
将显示 > 窗口 > 手持 > 朝向设置为
portrait(竖屏)。将拉伸模式设置为
canvas_items(画布项)。将拉伸比例设置为
expand(扩展)。这样可以支持多种分辨率,并且能够更好地利用较长的智能手机屏幕(例如 18:9 和 19:9 的长宽比)。使用布局菜单将 Control 节点的锚点吸附到正确的角落。
小技巧
为了更好地支持平板和折叠屏手机(这些设备的显示器纵横比通常接近 4:3),请在按照其他步骤操作时考虑使用纵横比为 3:4 的基础分辨率。例如可以将基础窗口宽度设置为 960、基础窗口高度设置为 1280。
非游戏应用
将基础窗口宽高设置为你想要支持的最小窗口尺寸。这不是必须的,但是可以保证你在设计 UI 时考虑较小的窗口尺寸。
保持拉伸模式为默认值
disabled(禁用)。Keep the stretch aspect to its default value,
keep(its value won't be used since the stretch mode isdisabled).You can define a minimum window size by setting
get_window().min_sizein a script's_ready()function. This prevents the user from resizing the application below a certain size, which could break the UI layout.在应用程序的设置中添加一个选项,用于调整根视口的 stretch scale,以便针对高 DPI 显示器放大用户界面。另请参阅下文关于高 DPI 支持的章节。
支持 hiDPI 高分辨率屏幕
By default, Godot projects are considered DPI-aware by the operating system. This is controlled by the Display > Window > DPI > Allow hiDPI project setting, which should be left enabled whenever possible. Disabling DPI awareness can break fullscreen behavior on Windows.
由于 Godot 项目具有 DPI 感知能力,因此在 hiDPI 显示器上启动时,它们可能会以非常小的窗口大小显示(与屏幕分辨率成比例)。对于游戏,解决该问题的最常见方法是默认将它们设置为全屏。或者,你可以根据屏幕大小在自动加载的 _ready() 函数中设置窗口大小。
为了确保 2D 元素在 hiDPI 显示屏上不会显得太小:
对于游戏,使用
canvas_items或viewport拉伸模式,以便 2D 元素根据当前窗口大小自动调整大小。For non-game applications, use the
disabledstretch mode and set the stretch scale to a value corresponding to the display scale factor in an autoload's_ready()function. The display scale factor is set in the operating system's settings and can be queried using screen_get_scale. This method is currently implemented on Android, iOS, Linux (Wayland only), macOS and Web. On other platforms, you'll have to implement a method to guess the display scale factor based on the screen resolution (with a setting to let the user override this if needed). This is the approach currently used by the Godot editor.
The Allow hiDPI setting is only effective on Windows and macOS. It's ignored on all other platforms.
备注
The Godot editor itself is always marked as DPI-aware. Running the project from the editor will only be DPI-aware if Allow hiDPI is enabled in the Project Settings.
减少缩减取样的混叠
如果游戏的基本分辨率很高(如 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)的智能手机将使用 更高 的视野, 这在这里更符合逻辑.
2D 和 3D 元素使用不同的缩放
若要以不同于 2D 元素(如 UI)的分辨率渲染 3D 内容,请使用 Godot 的:ref:resolution scaling <doc_resolution_scaling> 功能。该功能允许您直接控制 3D 渲染所使用的分辨率缩放因子,而无需额外使用独立的 Viewport 节点。这既可以用于通过降低 3D 分辨率来提升性能,也可以通过超采样(supersampling)来提升画质。