Displays, Client Bounds, Viewports和Back Buffers
此篇文章说明了display, client, viewport和back buffer大小属性的关系。
图1. 在此图中,Windows显示了一个不在全屏模式下运行的游戏,可以看出DisplayMode和ClientBounds大小的区别。另请注意相同的后备缓冲可能在Xbox 360上与Windows平台绘制结果有所不同,因为Xbox 360上后备缓冲的外部10%值20%不是"title safe"可能不可见。
DisplayMode的宽和高
DisplayMode的宽和高属性对应显示边界(bounds of the display)。 显示边界不同于游戏窗口边界(bounds of the game window),游戏窗口边界是从ClientBounds尺寸获得的。
当窗口全屏运行时,知道display mode的宽和高是很有用的,这样后备缓冲的大小就能被设置为匹配显示的分辨率。如果后备缓冲的大小没有被改变去匹配显示模式大小,那么当进入到全屏模式时分辨率会发生改变。
Xbox 360游戏必须在display modes的xy分辨率的80%范围内显示所有文本和菜单。这被称为title safe region。
ClientBounds的宽和高
ClientBounds宽和高属性对应游戏窗口的边界(bounds of the game window),如果游戏不是全屏的,则ClientBounds小于显示边界。 ClientBounds.X 和 ClientBounds.Y 表示游戏窗口对应display mode宽和高的左上角坐标。在Xbox 360上,ClientBounds宽 和 高 属性总是等于DisplayMode宽 a 和 高, 而ClientBounds.X 和 ClientBounds.Y 总是 (0, 0)。
Viewport(视口)的宽和高口)的宽和高
Viewport宽和Height属性对应当前视口大小,视口大小可以被看作视空间(view space)的宽和高。这些值通常被创建投影矩阵的方法使用,如CreatePerspectiveFieldOfView。当创建一个相机类时,你应将视口的宽和高设置为对应相机视口的大小。
视口大小默认为渲染目标(render target)的大小,但也有可能是渲染目标的一部分。例如,你会在一个渲染目标中绘制多个视口以实现一个分屏游戏。
视口大小不对应游戏窗口 (ClientBounds) 大小或显示 (DisplayMode)大小。
Back Buffer(后备缓冲)的宽和高
后后备缓冲是一个特定的渲染目标,当GraphicsDevice.Present被调用时,这个目标被指向下一个提交的渲染目标。要获得后备缓冲的大小,可以使用GraphicsDevice.PresentationParameters的 BackBufferWidth 和 BackBufferHeight属性。
在Windows平台上,后备缓冲默认匹配ClientBounds的大小。在Xbox 360游戏中,后备缓冲由用户指定。
当处于Windows平台的全屏模式时,经常会希望使后备缓冲大小匹配DisplayMode大小,这样当游戏切换到全屏模式时分辨率也不会改变。
Xbox 360平台上的图形后备缓冲可以和电视机的分辨率大小不同。Xbox 360会根据用户在System Blade中选择自动缩放输出的电视机分辨率。如果后备缓冲的宽高比(aspect ratio 与电视机的不同,那么当用户的显示器不是宽屏时Xbox 360会自动添加"黑带(black bars)"。
另外,如果你请求了一个输出设备不支持的后备缓冲分辨率,XNA framework会自动选择输出设备支持的最高分辨率。例如,一个有着1920x1080 (1080p或1080i)分辨率的图形后备缓冲被创建和显示在只有在480i分辨率的设备上,后备缓冲会自动将大小改变为480i。
发布时间:2009/2/12 上午10:03:05 阅读次数:6086