多分辨率

多分辨率问题

开发人员常常很难理解如何在他们的游戏中最好地支持多种解决方案。对于桌面和控制台游戏,这或多或少是简单的,因为大多数屏幕的纵横比是16:9,分辨率是标准的(720p,1080p,1440p,4K,…)。

对于移动游戏来说,一开始很容易。多年来,iPhone和iPad使用相同的分辨率。什么时候? 视网膜 实现后,它们的像素密度增加了一倍;大多数开发人员必须以默认和双分辨率提供资产。

现在,情况已经不再是这样了,因为有很多不同的屏幕尺寸、密度和纵横比。非传统尺寸也越来越流行,如超宽显示器。

对于3D游戏,不需要支持多个分辨率(从美学角度来看)。3D几何图形将根据视场填充屏幕,而不考虑纵横比。在这种情况下,人们可能希望支持这一点的主要原因是 性能 原因(以低分辨率运行以提高每秒帧数)。

对于二维和游戏uis,这是另一回事,因为需要在软件中使用特定的像素大小创建艺术,如photoshop、gimp或krita。

由于布局、纵横比、分辨率和像素密度会发生如此大的变化,因此无法再为每个特定屏幕设计uis。必须使用其他方法。

一刀切

最常见的方法是使用 base 解决方案,然后将其与其他所有内容相匹配。这个解决方案是大多数玩家在游戏中的预期方式(考虑到他们的硬件)。对于手机来说,谷歌很有用 stats 在线,桌面,蒸汽 also does .

例如,蒸汽显示 主显示分辨率 是1920×1080,所以一个明智的方法是为此分辨率开发一个游戏,然后处理不同大小和纵横比的缩放。

Godot提供了几个有用的工具来轻松完成这项工作。

底座尺寸

可以在下面的项目设置中指定窗口的基本大小 显示→窗口 .

../../_images/screenres.png

然而,它所起的作用并不十分明显;引擎会 not 尝试将监视器切换到此分辨率。相反,将此设置视为“设计尺寸”,即在编辑器中使用的区域的尺寸。此设置直接对应于二维编辑器中蓝色矩形的大小。

通常需要支持屏幕和窗口大小与此基本大小不同的设备。Godot提供了许多方法来控制视区如何调整大小和拉伸到不同的屏幕大小。

调整大小

有几种类型的设备,有几种类型的屏幕,反过来又有不同的像素密度和分辨率。处理所有这些问题可能需要很多工作,所以Godot试图让开发人员的生活更轻松一些。这个 Viewport 节点具有多个处理大小调整的功能,场景树的根节点始终是一个视区(加载的场景作为其子级进行实例化,并且可以通过调用 get_tree().get_root()get_node("/root")

在任何情况下,虽然更改根视区参数可能是处理问题最灵活的方法,但它可能需要大量的工作、代码和猜测,因此Godot在项目设置中提供了一组简单的参数来处理多个分辨率。

拉伸设置

拉伸设置位于项目设置中,它只是一组配置变量,提供了几个选项:

../../_images/stretchsettings.png

拉伸模式

这个 拉伸模式 设置定义如何拉伸基础大小以适应窗口或屏幕的分辨率。

../../_images/stretch.png

下面的动画使用16×9像素的“基本尺寸”来演示不同拉伸模式的效果。一个sprite,也就是16×9像素的大小,覆盖了整个视区,以及一个对角线 Line2D 在其上添加:

../../_images/stretch_demo_scene.png
  • Stretch Mode = Disabled (默认):不进行拉伸。场景中的一个单元对应于屏幕上的一个像素。在这种模式下, 拉伸纵横比 设置无效。

    如果你想完全控制每一个屏幕像素,这是一个很好的选择,而且可能是3D游戏的最佳选择。

    ../../_images/stretch_disabled_expand.gif
  • Stretch Mode = 2D :在此模式下,项目设置中“显示/宽度和显示/高度”中指定的大小被拉伸以覆盖整个屏幕(采用 拉伸纵横比 计入)。这意味着所有内容都直接以目标分辨率呈现。3D在很大程度上不受影响,而在2D中,精灵像素和屏幕像素之间不再存在1:1的对应关系,这可能导致缩放伪影。

    这是一个好的选择,如果你的二维艺术品有足够高的分辨率,不需要像素完美的渲染。考虑在二维纹理和字体上启用纹理过滤和mipmapping。

    ../../_images/stretch_2d_expand.gif
  • Stretch Mode = Viewport :视区缩放意味着根的大小 Viewport 精确设置为项目设置中指定的基本大小' 显示 第节。首先将场景渲染到此视区。最后,将缩放此视区以适应屏幕(使用 拉伸纵横比 计入)。

    此模式在处理像素精确的游戏时很有用,或者为了渲染到较低的分辨率以提高性能。

    ../../_images/stretch_viewport_expand.gif

拉伸纵横比

第二种设置是拉伸方面。请注意,这仅在以下情况下生效: 拉伸模式 设置为除 残疾人 .

在下面的动画中,您会注意到灰色和黑色区域。黑色区域由引擎添加,无法绘制。灰色区域是场景的一部分,可以绘制到。灰色区域对应于在二维编辑器中看到的蓝色框架之外的区域。

  • Stretch Aspect = Ignore :拉伸屏幕时忽略纵横比。这意味着,即使屏幕更宽或更窄,原始分辨率也将被拉伸以完全填满屏幕。这可能导致不均匀拉伸:物体看起来比设计的要宽或高。

    ../../_images/stretch_viewport_ignore.gif
  • Stretch Aspect = Keep :拉伸屏幕时保持纵横比。这意味着无论屏幕分辨率如何,视区都保持其原始大小,并且黑条将添加到屏幕的顶部/底部(“字母框”)或侧面(“枕头氧化”)。

    如果事先知道目标设备的纵横比,或者不想处理不同的纵横比,这是一个很好的选择。

    ../../_images/stretch_viewport_keep.gif
  • Stretch Aspect = Keep Width :拉伸屏幕时保持纵横比。如果屏幕宽度大于底部尺寸,则在左侧和右侧添加黑色条(柱氧化)。但是,如果屏幕高于基本分辨率,则视区将沿垂直方向增长(底部将看到更多内容)。您也可以将其视为“垂直展开”。

    这通常是创建可缩放的GUI或HUD的最佳选项,因此某些控件可以锚定在底部。 (尺寸和锚

    ../../_images/stretch_viewport_keep_width.gif
  • Stretch Aspect = Keep Height :拉伸屏幕时保持纵横比。如果屏幕比底部高,则在顶部和底部添加黑条(字母框)。但如果屏幕比基础分辨率宽,则视区将沿水平方向增长(右侧将看到更多内容)。您也可以将其视为“水平展开”。

    这通常是水平滚动的二维游戏的最佳选择(如跑步者或平台)。

    ../../_images/stretch_viewport_keep_height.gif
  • Stretch Aspect = Expand :拉伸屏幕时保持纵横比,但不要保持底部宽度和高度。视屏幕纵横比而定,视区在水平方向(如果屏幕比基础尺寸宽)或垂直方向(如果屏幕比原始尺寸高)将更大。

    ../../_images/stretch_viewport_expand.gif

拉伸收缩

这个 收缩 设置允许您在 伸展 以上选项已提供。默认值1表示不发生缩放。

例如,如果 收缩 到4号然后离开 拉伸模式残疾人 ,场景中的每个单元将对应于屏幕上的4×4像素。

如果 拉伸模式 设置为除 残疾人 ,根视区的大小按 收缩 因子和输出中的像素按相同的比例放大。这对二维游戏很少有用,但可以通过以较低的分辨率渲染来提高三维游戏的性能。

从脚本

要在运行时从脚本配置拉伸,请使用 get_tree().set_screen_stretch() 函数(见) SceneTree.set_screen_stretch()

降低采样时的混叠

如果游戏具有很高的基本分辨率(例如3840×2160),则当将采样降低到相当低的值(如1280×720)时,可能会出现混叠。加载时,通过将所有图像缩小2倍,可以使混叠变得不可见。这可以通过在加载游戏数据之前调用以下方法来完成:

VisualServer.texture_set_shrink_all_x2_on_set_data(true)

处理纵横比

一旦考虑到不同分辨率的缩放比例,请确保 用户界面 还可以缩放不同的纵横比。可以使用 anchors 和/或 containers .

视场缩放

3D摄像机节点 保持纵横比 属性默认为 保持高度 缩放模式(也称为 Hor+ )在横向模式下,这通常是桌面游戏和移动游戏的最佳价值,因为宽屏显示将自动使用更宽的视野。

但是,如果您的3D游戏打算以纵向模式播放,则使用它可能更有意义。 保持宽度 相反(也叫 Vert- )这样,纵横比高于16:9(例如19:9)的智能手机将使用 更高的 视野,这里更符合逻辑。