OS.min_window_size 如何在 iOS 视网膜屏幕上工作

How does OS.min_window_size work on iOS retina screens

我知道您可以在 gdscript 中设置最小和最大 window 大小,适用于您的应用程序在台式机或笔记本电脑上 运行 并且可以调整大小的情况。即

OS.min_window_size = Vector2(500, 500)
OS.max_window_size = Vector2(6000, 4000)

这如何在视网膜屏幕上转化为 iOS。最小和最大尺寸代表物理像素宽度,还是逻辑像素宽度?文档没有说清楚:

首先,项目设置中有一个名为“允许 Hidpi”的选项,您应该启用它才能使用 OS 缩放。 它并没有真正引起问题,但由于向后兼容,它在 Godot 3.x 中默认被禁用。

现在,您可以查询 OS.get_screen_dpi()OS.get_screen_scale()OS.get_screen_max_scale() 以了解游戏当前的缩放比例。

而且,你是对的,文档没有说明 min_window_sizemax_window_size 是在缩放之前还是之后……

答案:我确信min_window_sizemax_window_size是在缩放之后(在任何缩放中,而不是在当前缩放中)。其中 - 如果我理解正确的话 - 是物理像素。


求答案

从这里开始,这个答案就是在弄清楚我上面所说的。

现在,我相信 iOS Godot 将始终处于全屏模式。在这种情况下 min_window_sizemax_window_size 将被忽略。

因此,不是查看 iOS,而是 set_max_window_size for OSX (source):

void OS_OSX::set_max_window_size(const Size2 p_size) {
    if (is_no_window_mode_enabled()) {
        return;
    }

    if ((p_size != Size2()) && ((p_size.x < min_size.x) || (p_size.y < min_size.y))) {
        ERR_PRINT("Maximum window size can't be smaller than minimum window size!");
        return;
    }
    max_size = p_size;

    if ((max_size != Size2()) && !zoomed) {
        Size2 size = max_size / get_screen_max_scale();
        [window_object setContentMaxSize:NSMakeSize(size.x, size.y)];
    } else {
        [window_object setContentMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];
    }
}

那么,让我们看看……

  • 全屏时忽略
  • 最大尺寸必须大于或等于最小尺寸。

到目前为止一切顺利。

然后我们有这个 zoomed 字段。据我所知,它在全屏时设置为 true,否则设置为 false。

因此,这就是我们要寻找的逻辑:

Size2 size = max_size / get_screen_max_scale();
[window_object setContentMaxSize:NSMakeSize(size.x, size.y)];

是这样的(伪代码):OS_max_size = max_size / max_scaling.


好的,现在我想看setContentMaxSize:

The maximum size of the window’s content view in the window’s base coordinate system.


好的,有四种可能:

  1. setContentMaxSize 设置缩放前的最大尺寸(以像素为单位)。 max_window_size 是缩放前的最大像素大小。

    如果是这样的话,我们就直接设置了。所以,事实并非如此。

  2. setContentMaxSize 设置缩放前的最大尺寸(以像素为单位)。 max_window_size 是缩放后的最大尺寸(以像素为单位)。

    如果是这种情况,我们将不得不将 max_window_size 除以缩放比例。所以,可能就是这样。

  3. setContentMaxSize 设置缩放后的最大尺寸(以像素为单位)。 max_window_size 是缩放前的最大像素大小。

    如果是这种情况,我们必须将 max_window_size 乘以缩放比例。所以,我不这么认为。

  4. setContentMaxSize 设置缩放后的最大尺寸(以像素为单位)。 max_window_size 是缩放后的最大尺寸(以像素为单位)。

    如果是这样的话,我们就直接设置了。所以,事实并非如此。

因此,除非这是一个错误max_window_size 是缩放后的像素大小。这是任何缩放比例下的最大像素大小,而不是当前缩放比例,因为它使用 get_screen_max_scale() 而不是 get_screen_scale()min_window_size 的工作方式相同。 *