如何制作独立于分辨率的系统?


10

我正在对此空白。我当然可以将东西固定在边缘上,这将使我的UI分辨率独立...直到它变化太大以致图形太小。如何在需要时适当缩放?缩放时如何保持图形正确比例?如果分辨率与16:10的比例不同,我不希望它们拉伸。

是否有一种经过验证的真实方法?由于此问题,视频播放器显示黑色边框,这是否可以适当解决?


1
参见[this] [1]问题。我的回答解释了一些细节。[1]:gamedev.stackexchange.com/questions/34/…–
工程师,

Answers:


5

首先要记住,从光栅上讲,技术上没有真正的分辨率独立性。放大倍数足够高时,单个纹理像素将开始变得可见。唯一的解决方案是编写矢量图形系统。

话虽如此,创建基于分辨率的独立于栅格的鲁棒系统有几个步骤:调整大小,协调坐标系和布局。

为了确定尺寸和位置,我们需要使用一些与实际应用分辨率保持一定比例的单位。在这种情况下,请使用英寸,因为我是美国人,您可以使用DPI(每英寸的点数)缩放元素。例如,假设您的应用程序以800x600运行。默认的Windows DPI为96,这意味着应用程序的分辨率为(800/96)x(600/96)英寸或8.33x6.25英寸。

由于您至少需要能够使用4:3和16:9的宽高比,因此如何处理屏幕坐标系会有些棘手。我建议您将(0,0)放在显示区域(以及窗口和控件)的中央。这样做之所以有效,是因为如果将(0,0)放在一个角上,则随着该角根据分辨率和纵横比移动,它将平移所有sprite,而屏幕的中心将始终是屏幕的中心。与设备无关。以800x600继续我们的示例,这将导致坐标系为(从左到右)-4.165in至4.165in和(从上到下)3.125in至-3.125in。

因此,目前您拥有独立于DPI的UI系统,其项目始终相对于屏幕中心位于同一位置-并非完全独立于分辨率。幸运的是,DPI独立性允许您执行的操作是通过基于某种启发式方法缩放DPI来缩放UI。例如,我们可以使用垂直分辨率作为启发式方法来缩放DPI。如果800x600是96 DPI,那么对于1024x768,我们将使用123 DPI;对于1280x720,我们将使用115 DPI。

最后,您将需要构建一个同时处理绝对定位和相对定位的布局系统。WPF和Web就是很好的例子。您可以指定控件/框填充父元素的某些百分比,同时将其与许多其他有用的自动布局选项一起停靠到边缘。所有这些都将导致一个UI系统能够在许多不同的分辨率和宽高比下看起来几乎相同。

总而言之,我强烈建议您学习WPF,因为它几乎可以完成所有这些工作,除了它在左上角的坐标系中保持原点并且不会根据垂直分辨率自动缩放DPI。


-1

通常,您想做什么取决于游戏。

一种选择是,如果长宽比(比例)不同(可能是最简单的,仅渲染为纹理,然后渲染为屏幕,并适当调整大小),则使用黑色边框。

另一种选择是为不同的宽高比设置不同的渲染路径。您可能有一个用于宽屏,一个用于“正常”。

另一个选择是分别缩放事物,例如根据分辨率使UI消息框更大或更小。每当您需要确定要绘制到的位置时,而不是使用精确的像素,请执行0.2向下,0.8跨度,宽度0.1,高度0.3之类的操作。在这种情况下,您可能会拉伸一些东西,尽管这取决于您如何绘制可能会很好的东西(即拉伸UI背景,而不是文本)。

就3D而言,只要正确设置了视口,最终宽屏播放器将比非宽屏设置看到更多的内容。(或者绘制黑色边框/或拉伸视图)。


“只渲染为纹理,然后渲染为屏幕,并适当调整其大小”。这将创建出真正模糊和奇怪的图像。如果分辨率太低怎么办?一切将变得不可读。
塔拉2015年

继续阅读,这是几种选择之一。您肯定也不会得到您描述的问题(尽管如果简单/错误地进行操作,则是的,它会变得模糊不清等)
George Duckett 2015年

我一直在读书。但是您的答案非常不明确。另外,您肯定会遇到我所描述的问题,因为您不能仅将所有内容渲染为低分辨率,并希望文本保持完美的可读性。
塔拉

我并不是说以低于目标的分辨率进行渲染,尽管显然以更高的分辨率进行渲染也会产生伪像。我的答案也可以充实,但是由于已经有一个很好的接受答案,所以我不会再回答这个问题了。我确实提到了文本渲染,因为它与选择绘制对象的位置(和大小)略有不同,但是确实简短,可以详细说明。
乔治·达基特

我也没有说要以比目标更低的分辨率进行渲染。您根本无法采用1:1的UI并将其渲染到比设计的目的更低的分辨率(这就是我所说的更低的分辨率)。
塔拉
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.