即时图形用户界面-是或否?[关闭]


38

几年前,我一直在使用许多“保留的” GUI系统(以下是我的意思)进行应用程序开发,例如MFC,QT,Forms,SWING和多个Web-GUI框架。我总是发现大多数GUI系统的概念过于复杂和笨拙。与应用程序中的其他部分相比,大量的回调事件,侦听器,数据副本,从字符串到字符串的内容-转换(等等)始终是错误和头痛的来源。(即使“正确”使用了数据绑定/模型)。

现在我正在写电脑游戏:)。到目前为止,我使用的是一个GUI:Miyagi(不知名,但与所有其他系统基本相同的Idea。)

那太差了。

对于像游戏这样的实时渲染环境,我觉得“保留的” GUI系统已经过时了。用户界面通常不需要自动布局或动态调整窗口大小。相反,他们需要与不断变化的数据进行非常有效的交互(例如世界上模型的3D位置)

几年前,我偶然发现了“ IMGUI”,它基本上类似于即时图形模式,但是用于用户界面。我没有太在意,因为我仍在进行应用程序开发,而IMGUI本身似乎并不广泛也不成功。仍然,他们采用的方法似乎是如此性感和优雅,以至于让我想使用这种UI方式为下一个项目编写一些东西(我未能说服工作中的任何人:(...)

让我总结一下“保留”和“立即”的意思:

保留的GUI:在一个单独的初始化阶段,您将创建“ GUI控件”(如Labels,Buttons,TextBoxes等),并使用某种描述性(或编程性)方式将它们放置在屏幕上-始终在呈现任何内容之前。控件在内存中拥有大多数状态,例如X,Y位置,大小,边框,子控件,标签文本,图像等。您可以添加回调和侦听器,以了解事件并更新GUI控件中的数据。

即时GUI:GUI库由一次性“ RenderButton”,“ RenderLabel”,“ RenderTextBox” ...功能组成(编辑:不要被Render弄糊涂字首。这些功能还可以执行控件背后的逻辑,例如轮询用户输入,插入字符,在用户按住键时处理字符重复速度等...),您可以调用它们以“立即”呈现控件(doesn'不必立即将其写入GPU。通常会记住当前帧的GPU,并在以后将其分类。这些库不包含任何“状态”。如果要隐藏按钮...,请不要调用RenderButton函数。所有具有用户交互作用的RenderXXX函数(如按钮或复选框)都具有返回值,这些返回值指示例如用户是否单击了按钮。所以你的“ RenderGUI” 函数看起来像一个很大的if / else函数,您可以在其中调用或不调用RenderXXX函数,具体取决于游戏状态,并且所有数据更新逻辑(当按下按钮时)都将插入到流程中。所有数据存储都在gui的“外部”,并按需传递给Render函数。(当然,您可以将大功能分成几个功能,或使用一些类抽象来对gui的各个部分进行分组。我们不再像1980年那样编写代码了,对吗?))

现在,我发现Unity3D实际上对其内置GUI系统使用了完全相同的基本方法。也可能有两种使用这种方法的GUI?

仍然..环顾四周时,似乎对保留的GUI系统有强烈的偏见?至少我没有在Unity3D中找到这种方法,并且原始的IMGUI社区似乎相当安静。

因此,有人同时使用这两种想法并有强烈的见解?

编辑:我对来自现实经验的观点最感兴趣。我认为IMGUI论坛中有很多关于直接GUI方法的“理论缺陷”的热烈讨论,但是我总是发现了解现实中的缺陷会更具有启发性。



感谢您的链接。我想您指的是Kylotan的评论。有趣..;)
Imi 2012年

1
呵呵,当我发现自己的观点已经被看到时,我在下面写一个答案就已经中途了……尽管如此,我还是会贴出来。
Kylotan '02

2
这些问题快要结束了,真是遗憾!这些是我在遇到相同问题时所寻求的意见。
Harald Scheirich '16

Answers:


34

没错 我已经在糟糕的“保留模式” GUI和糟糕的“即时模式” GUI上完成了付费gamedev的工作,尽管两者都使我望而却步,但是保留模式方法显然仍然是更好的方法。

立即模式的缺点很多:

  • 它们使艺术家和设计师难以轻松配置布局;
  • 它们使您将逻辑与演示结合起来;
  • 它们使拥有单一一致的输入模型变得更加困难;
  • 他们不鼓励对动态数据进行复杂的控制(例如,列表视图);
  • 分层变得非常尴尬(例如,如果我调用RenderComboBox,则下拉框可能无法呈现,因为它需要位于窗口的其余部分上方-与工具提示相同)
  • 配置渲染样式最终需要使用全局变量(ick)或其他函数参数(ick)完成;
  • 性能可能很差,因为调用所有这些函数来查询可能已更改或未更改的值往往会创建许多小对象,从而给内存管理器造成压力;
  • ...而且我什至无法想象允许某人在GUI周围拖动并重新排序会是多么痛苦。您必须维护一个数据结构,告诉您在哪里渲染所有内容-就像您自己重写保留模式系统一样。

即时模式GUI吸引了想要快速HUD系统的独行程序员,因此,它们很棒。对于其他什么...只要说不。


1
@ImmanuelScholz:您是否考虑过保留的GUI实际上不是“那么丑”?
Nicol Bolas 2012年

1
GUI库通常不太雅致,因为它们解决了几个问题-输入,渲染和数据访问-并且每个问题都受到程序其余部分的严重影响。这意味着人们增加了抽象层,以使GUI在不同的程序,输入设备和渲染器之间可重复使用,但代价是使用起来更加复杂。
Kylotan

2
除此之外,就如何制作保留模式的GUI(MVC,MVP和MVVM是3种流行的方法),如何进行布局(从数据?从代码?)或如何附加输入行为(尚未达成共识)这一事实还没有达成共识。内联脚本,如Web?命名为信号/插槽?如IMGUI的就地结果?),并且这种标准化的缺乏阻碍了GUI的“一种真实的方式”的发展。
Kylotan

2
无论使用的是保留GUI还是直接GUI,由美工配置布局都需要编辑器。这一点是完全无效的。混合逻辑和表示形式是您使用即时模式GUI的原因,这不是缺陷,而是您想要的,这与保留更多GUI的混乱相对。你甚至都不了解。如果API设计合理,则该配置不需要全局变量或额外的参数。您提到的每个缺点都可以解决。不过,最重要的是,您正在编写游戏UI,而不是Photoshop。
德雷塔2014年

3
@dreta:关于艺术家配置,我的观点是,通过编辑器更改某些内容而根本不写自己的保留模式层是完全不切实际的(例如,单击按钮或重新排序时的操作)元素)。IMGUI适用于非常简单而琐碎的视觉效果,仅此而已。
Kylotan 2014年

31

作为在台式机上使用IMGUI有5到6年实际经验的人,我有义务捍卫它。所有答复(以及问题本身)都是基于对IMGUI的非常严格的定义,并且似乎有很多可疑的声明。

很多原因是因为IMGUI库无法在后台保留任何数据。这根本不是真的。实际上,复杂的IMGUI库将保留与等效RMGUI库一样多的数据。区别在于,IMGUI库主要缓存结果,而RMGUI库则维护权威状态。在IMGUI中,应用程序提供了一种功能,该功能采用当前模型状态并为该状态生成GUI。这是GUI的权威定义。该库负责确保屏幕上的GUI与该功能的结果匹配。这并不意味着它需要在每个框架上全面评估该功能并完全重建GUI。这就是缓存的重点。

使用IMGUI的这种视图,您实际上可以进行高级布局,并且性能相当合理。如果使界面更容易,您也可以保留实际的权威状态。IMGUI的目的不是要使应用程序保留所有内容。该应用程序可能不想存储每个滚动条的位置以及每个树节点的展开/折叠状态。关键是要能够在程序上指定这些树节点的内容及其存在。

我会逐点回答所有的IMGUI批评,但是我并不太了解。它们中的大多数似乎是基于一些基本的信念,即IMGUI是hackish的,而RMGUI是结构良好的,我想这是由于上述误解造成的。没有固有的原因,IMGUI库应该在复杂性方面遇到麻烦,或者必须在全局变量中杂乱无章或将逻辑与表示混合在一起。我要说的是,IMGUI的优点随着艺术家驱动的内容的增加而变得不那么重要,但是我不确定为什么对于艺术家驱动的内容它实际上会更糟。(除了样式表之外,我个人不使用艺术家驱动的内容,例如颜色,字体/边框大小等,但是我不明白为什么比RMGUI难实现。)

在我看来,IMGUI无疑是一件好事。它为您提供有关GUI推理的更好模型。它变得更具功能性和反应性,并且您可以将必须​​推理的可变状态量降至最低。另一方面,实现复杂的IMGUI库是一个挑战,而且绝对比实现等效的RMGUI库困难。这是库复杂性和应用程序复杂性之间的权衡。如果您打算构建复杂的应用程序(甚至很多简单的应用程序),那么权衡是非常好的。如果您要针对一个应用程序执行此操作,而且非常简单,那么使用RMGUI可能会更快地实现目标。

无论如何,祝你好运!


5
“没有固有的理由使IMGUI库在复杂性方面遇到麻烦,或者必须在全局变量中乱扔杂乱或将逻辑与表示混合在一起。” 很难看到通常的IMGUI按钮如何调用,例如。不能将“如果Button(x,y)则Action”称为带有表示的混合逻辑。如果不将呈现详细信息传递给调用,则无法定位或设置其样式(全局或静态除外),并且如果不立即处理按钮逻辑,则它实际上不是即时模式GUI。你能提供一个例子来解释吗?
Kylotan '02

4
由于共享状态的数量,OpenGL上下文是大量错误的来源,但是即使使用该API,多年来也一直朝保留模式迈进,因为即时模式既不能提供所需的灵活性也不能提供所需的性能。
Kylotan '02

1
问题不是并发,而是共享了一大块状态。保留模式GUI会将相关状态与其所应用的控件一起封装,并且这种封装通常被认为是好的,因为不需要在这里重复。我的具体问题在上面的答案中列出,我还没有看到没有所有这些问题都困扰过的IMGUI方法。
Kylotan '02

3
CSS样式表是否也符合“共享的一大块状态”的条件?无论如何,我都不知道您在IMGUI方面的特殊经验,但是如果您对不受这些问题困扰的IMGUI方法感兴趣,建议您阅读上面的答案,并通读以下内容:关于Molly Rocket的IMGUI论坛。的确,没有一个完美的现成的IMGUI库可供您在几分钟内下载并开始使用,但是,如果您有兴趣构建一个库,那么这里有可用的信息,人们愿意提供帮助。
汤姆(Tom)

1
CSS样式表是静态的;完全不同于动态变化的OpenGL上下文!
Kylotan'2

12

GUI库由一个一次性的“ RenderButton”,“ RenderLabel”,“ RenderTextBox” ...组成,您可以调用这些函数“立即”呈现一个控件(不必立即写入GPU。通常记住它(目前的画面),稍后再分类。

我什至可以说这不构成GUI库。这只是一堆渲染功能。

渲染GUI是制作GUI 最简单的部分。以一个文本框为例。我将假设最简单的情况:一个简单的单行输入文本框。

RenderTextBox只会绘制一个文本框。它将执行一些简单的文本测量并在屏幕上绘制字形。它不会

  • 检测用户已单击控件中的鼠标,然后将光标移动到字符串中的适当位置。
  • 检测到用户双击控件中的鼠标并选择一个文本块。
  • 检测到用户按下“ Home”键,然后将光标移到文本的前面。
  • 检测到用户按下了有效键,并相应地修改了字符串。如果选择了文本,则所选部分将被插入的文本替换。

我可以继续前进,但我认为我的观点很明确。如果要用来RenderTextBox绘制文本框,您将得到的只是一个静态的,无法正常工作的文本框。任何实际功能都必须由您实现。

做文字测量和绘制字形吗?那是GUI工作的简单部分。GUI代表“图形用户界面”。最后两个词是您很难的部分,您可以从用户那里获取输入并对其进行处理。

游戏玩家期望GUI控件能够正常工作。在PC风格的环境中(例如:鼠标和键盘),如果玩家看到一个文本框,他们希望它像普通的文本框一样工作。他们希望能够使用箭头键在其中移动,跳转到前端并以home结束并删除,选择其中的字母等。

这意味着您将必须实现所有这些UI代码。您必须测试单击了哪个控件。然后,您必须根据单击的控件来执行某些操作。您必须具有“活动”控件的概念,该控件需要键盘输入。不同的控件必须对不同类型的用户交互做出不同的响应。

基本上,您将需要一TextBoxWindow堂课。

假设您正在实现游戏选项屏幕。因此,您有不同的选项组:游戏性,图形,声音,控件等。因此,在屏幕的左侧有一个不同组的列表。每个组调出一系列用户可以操纵的控件。当用户按下Tab键时会发生什么?

好吧,这取决于激活的控件。如果组控件中的一个处于活动状态(最近被单击),则它将移至下一个组。相反,如果该组中的一个控件处于活动状态,则它将移至该组中的下一个控件。这就是系统的预期工作方式。

因此,活动控件不仅必须处理键盘输入,而且现在还必须将所有未处理的输入都添加到拥有它的控件中。要么,要么控件必须在某种形式的链接列表中,以便它可以来回移动。这意味着每个控件中都必须有默认行为。

这听起来越来越像保留的GUI,不是吗?唯一的区别是…… 是努力工作的人。使用别人的GUI 应该是减少工作量的一种方法。但是使GUI响应用户期望所付出的努力是不平凡的。

请记住:用户界面不适合您,它适合您的用户。是给玩家的。它应该表现出预期的效果。如果没有,那么就失败了。

用户界面通常不需要自动布局或动态调整窗口大小。

那是一个有限而有限的思想。

我可以说一些关于具有不同UI需求的不同游戏,某些游戏确实需要可调整大小的窗口等的内容。但是,还有一个更大的问题。

您的这种思维方式会导致“无偿太空战”问题。

如果您从未玩过该游戏,那么它会是一款便宜,独立且非常GUI繁重的游戏。实际的游戏玩法全部在GUI中完成(这是一种“设置单位并观看它们战斗”的游戏)。问题?

不能取消GUI!

哦,如果您使用的是普通显示器或视力正常,这很好。但是,例如,如果您是我,却运行着一个可笑的巨大监视器(一个如此大的监视器,以至于Windows可以放大所有文本的大小,因此您实际上可以阅读它),那就太糟糕了。文字是微观的。无法更改字体大小。

当然,GSB是一款基于GUI的游戏,因此对他们来说绝对不可原谅。一个GUI精简版的游戏可能可以摆脱它。

永远不要以为您的用户完全按照自己的意愿看他们的游戏。这样做是愚蠢的。

真正的分辨率独立的GUI拥有可以自行调整以适应用户分辨率的GUI系统,因此需要将布局作为GUI系统本身的一部分。如果您不打算提供该功能,那么您的文字将在某人的巨型显示器上显得很小。这不是一件好事。

因此,我想说您对此问题的看法是短视的。您确实需要这些东西。您需要保留的GUI提供的内容。哦,您可能不需要任何特定GUI系统提供的一切。但是您需要一些。

将数据获取到系统所需要做的样板工作,是在合理保证用户可以与控件正确交互并且可以调整大小以适应播放器需求的同时,付出的代价很小。

如果您不从播放器中获取太多用户输入,则可能可以使用即时模式GUI。但是就这样。


5
请不要采取这种错误的方式,但是我可以再问一问,您是否从现实世界的经验中谈过在游戏开发中实际使用即时GUI方法的情况(以及我所读的观点:很可能在开发中途将其替换)沮丧;))?顺便说一句:您可以在RenderTextBox类中实现(如在UnityGui.TextField中)文本框的所示功能。另外,即时GUI方法中的任何内容都不允许库设计者使用适合的类来进行GUI控件。只是用途会有根本的不同。
Imi 2012年

1
@Immanuel:“顺便说一句:您可以在RenderTextBox类中实现(如在UnityGui.TextField中)文本框的图示功能。” 您说的RenderTextBox是一个函数,而不是一个类。因此,您在“立即模式”和“保留模式”之间的划分似乎是在存储数据的地方,而不是谁来管理数据。如果是这样,您需要在问题中更清楚地区分,因为这表明“即时模式GUI”只是在屏幕上绘制内容。它无法获取输入(因为这将需要持久状态)等。那是什么呢?
Nicol Bolas 2012年

1
@ImmanuelScholz:“在这种情况下,我看不到反对一般的“立即GUI方法”的论点”,我想我解释得很好:有人必须编写代码。必须有人输入,移动光标,管理当前控件,处理布局等。您对“即时模式GUI”的描述将失去所有这些,并且对于所有基于最简单输出的内容而言,这都是非常重要的GUI。所以,我看不到你的论点,即“立即GUI办法”有什么上升空间任何责任。
Nicol Bolas 2012年

1
对不起,我的错。“ ...在RenderTextBox函数中实现”(不是类)。它一个函数,处理用户输入,并且库确实保留一些状态(例如当前的焦点控件)。请,没有冒犯的意图,但是我可以假设您从我在此处的发帖中仅知道“即时GUI”,并且都没有研究IMGUI或Unity3D gui吗?我肯定不会在这里详细描述“即时图形用户界面”包含的内容,我只是想总结一下,所以我们不会在谈论完全不同的事物(例如,不要与“即时图形模式”相混淆)。
Imi 2012年

2
@ImmanuelScholz:“我肯定在这里无法详细描述“即时GUI”包含的内容”,那么您的问题是不完整的。确实,这很容易引起误解,因为“立即模式”意味着缺乏状态。术语“保留”来自确实具有状态的事实。因此,如果“立即模式GUI”保留状态...则不是立即模式。
Nicol Bolas 2012年

8

不久前,IMGUI也引起了我的兴趣,作为测试,我编写了一些教程以使自己熟悉这些技术(如果您感兴趣,请从此处开始,但不超过C#/ XNA + 此处的原始“教程” )。 。

我真的很喜欢IMGUI一会儿,因为它们显示的信息始终是最新且正确的(因为没有状态,因此您始终会输入实际数据)。但是最后我失去了兴趣,所以现在通常我会再次使用保留的GUI。

最后,我认为GUI的即时性使GUI与数据的分离变得更加困难,有时我试图通过引入某种状态来打破事物之间的联系,从而打破IMGUI的风格。我也不认为为保留的GUI编写代码比为IMGUI编写代码更省力,我喜欢保留的GUI可以被触发并忘记,我真的很喜欢事件:)。

但是,每次有人提到IMGUI时,我内心都会想再尝试一次,并尽力将其改正,因为其中确实有一些优雅之处,我不确定百分百是否总是会让您的工作变得更轻松。我会说尝试一下,也许像我一样尝试并写一些教程(我发现学习新技术的最好方法是向他人解释新技术)。


8

我在Unity3D GUI系统上做了很多工作,该系统正如您所描述的那样工作。我必须说,我充满激情地讨厌它。

在某些情况下,“立即”方法确实有效。首先,当您只需要几个按钮和标签时​​-例如以射击游戏HUD为例。用“保留”方法创建它们并不是很难,但是使用UnityGUI则非常容易。第二种情况是您需要在屏幕上填充很多控件,但实际上并不关心布局。特别是在仅在运行时才知道确切的控件时。这实际上在任何游戏中都没有用,但是在使工具在Unity编辑器中运行时确实有用。

但是,任何半复杂的GUI(例如,用于(MMO)RPG或策略游戏的)都不可避免地会变成难以理解的可怕代码,充满特殊情况并以多种方式破坏。在构建这样的GUI时,通常具有非常特定的布局,该布局必须适用于任何分辨率,并且能够显示您发送的任何数据。例如,您需要将某些按钮移至较低位置以腾出较长的文本。使用“保留” GUI,您可以拥有一个自动执行此操作的控件。在“立即”模式下,没有控件,因此您必须明确地进行所有操作。

UnityGUI的另一个问题(不确定是否在所有即时模式的GUI中都发生)是,例如,Button()调用在不考虑任何其他GUI调用的情况下起作用。因此,如果一个按钮位于另一个按钮的顶部,则单击将同时按下两个按钮。这绝对不是用户期望的,因此这增加了另一个特殊情况要处理。

为了解决所有这些问题,我一直围绕着UnityGUI编写自己的包装程序,将其变成“保留”模式系统:存储自己状态的控件,只GUI为我每帧调用所需的函数。

我不能说“立即”模式肯定比“保留”模式差,但是在“保留”模式下工作肯定会好得多。


1
是的,我在Unity GUI中遇到了所有这些问题,因此很讨厌。这对于快速的静态HUD非常有用,但对其他任何事情来说都是真正的麻烦。
Kylotan '02

6

我将在这里为IMGUI辩护,因为如果您愿意为其编写代码,则可以解决前面列出的一些问题。另外,如果您确实为其编写了代码,那么您将拥有一个可重用的健壮的库,并且很少需要修改。

  • 从架构加载GUI

也许一开始,艺术家似乎对IMGUI没有太多灵活性,这可以通过从xml或JSON模式加载GUI布局来解决或改进。

  • 菜单层绘制调用

通过排序解决了此问题,您应该创建对绘制顺序进行排序的UI Manager类,我在C#XNA中使用可移动的,可单击的面板相互重叠的方式解决了此问题。如果需要,我可以发布伪代码。

  • 列表框

你可以从数组中绘制字符串吗?可以从这些字符串的字体的高度和宽度定义矩形区域吗?您是否可以创建滚动按钮的大小与所有这些矩形加在一起的高度之比?然后,您将创建带有向上或向下滚动按钮的列表框。我以为这会很困难,但是事实却比我想的要简单得多。没有缓冲区,没有状态,没有回调。

  • 从GUI分离数据

不要让各个面板,按钮,盒子保存数据。我知道IMGUI的第一次尝试是即时的,但仅在图形意义上。我犯了在UI上保留数据的错误。通过UI更改对放置和修改数据的位置进行不同的思考几乎是一个哲学上的转变。

  • SDK的GUI

这是SDK代码的限制和功能,而不是您的。我发现无论如何,SDK UI(Hammer,Unity,UDK)几乎都是一种新的语言。实际上,它们与我的Windows.Forms相似,都是为了最大可能而设置的,因此在复杂性方面有一些额外的权重。

最后看这个> http://mollyrocket.com/861


4

用户界面通常不需要自动布局或动态调整窗口大小。相反,他们需要与不断变化的数据进行非常有效的交互(例如世界上模型的3D位置)

这取决于所讨论的类型和游戏。一个好的库存管理系统对于大多数RPG都是至关重要的。您将需要一些可以为您处理布局的东西,支持滚动条,拖放,工具提示以及使用“保留的GUI”更易于实现的其他功能。

我想不出一种方法来拖拽即时图形用户界面(GUI),而无需花费太多时间或节省用户状态,例如临时更改Z缓冲区和存储时间信息以排除发生移动鼠标的点击。一点。

但是从设计角度来看,我很难想象没有GUI事件的世界。另外,即时GUI与OOP不兼容,迫使您诉诸程序编程。

即时图形用户界面(GUI)提供的简单性以代码的额外复杂性为代价,随着UI要求的复杂性的增加,代码的复杂性也迅速增加。一个好的保留GUI最初本来就比较复杂,但是扩展性更好。因此,在一定的复杂度以下,立即使用GUI即可满足要求,但对于大多数情况,我宁愿保留GUI。


1
我想问你:您的观点是来自实际的实际经验还是来自对两种系统的理论思考?嗯,这听起来比预期的要难,对不起。。我的意思是:我从理论上分享您的观点和评价。类似于IMGUI的系统很可能导致较少的OOPish代码(如果这是个问题),它们在需要某些状态的控件方面存在问题。它只是......正常的GUI系统也非常庞大和复杂已被自理,所以你有很多的复杂性增加,直到你甚至接近这些系统..
伊米

1
伊曼纽尔(Immanuel),您无需具有现实世界的开发经验即可知道许多游戏确实需要自动布局和可调整大小的窗口。
Kylotan '02

1
@Immanuel Scholz我承认我对保留的UI有更多的经验。维护一个OSS项目,并通过我的运营商(当然还很年轻)与他们合作。但是,我使用Unity3D的UI系统并在移至XNA时对其进行了复制。开发我保留的UI是因为我厌倦了在项目之间复制粘贴相同的hack,以实现统一的功能。
ClassicThunder12年

@Kylotan通过“可调整大小的窗口”来表示我可以通过拖动(或其他方式)并通过自动布局来主动调整UI元素的大小,以便在调整它们的大小时,UI以“精巧”的方式进行适应,例如显示滚动条,分配多个按钮栏的线条等等。是的,有时我会在游戏中看到这种现象,但在台式机应用程序中更为普遍。此外,对于保留的GUI系统来说,我认为创建良好的可调整大小的UI也不是最容易的事情。
Imi 2012年

1
可调整大小的窗口和自动布局是一回事。在保留模式的GUI中,每个控件都知道其大小(无论它是否在运行时更改),而自动布局基本上是一种递归的大小检查。可以说它在游戏中比台式机应用程序更重要,因为我们希望全屏GUI具有各种纵横比和不同平台。
Kylotan '02
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.