在长宽比问题之后,我很想听听其他人在2D UI系统(最有可能是他们自己开发的解决方案)上工作时正在使用什么。具体来说,如何处理坐标系。我认为有三种选择:
- 硬编码的坐标(例如:0-> 720,0-> 576)
- 归一化的坐标(0.0-> 1.0,0.0-> 1.0),在渲染之前映射到真实坐标
- 虚拟坐标(例如:0-> 1600、0-> 1000),在渲染之前已映射到真实坐标
硬编码显然仅在以下情况下有用:在固定平台上并且事先知道屏幕空间坐标是什么,或者准备为每组可能的屏幕尺寸编写屏幕布局。
归一化的坐标很好,但是当屏幕的宽高比不固定时(例如0.75映射到宽屏而不是4:3时,则0.75映射到不同的物理坐标)会产生歧义。同样,对于作者来说,将UI元素声明为(0.2 x 0.2)真的违反直觉,只是发现渲染时它实际上不是正方形。
虚拟坐标是明确的,但在重新映射阶段遇到与标准化坐标相同的问题:很小的十进制差异会导致偏离一对一的错误,这意味着应该平铺的UI元素之间现在有接缝。
同样,当您有固定分辨率的屏幕时,归一化坐标和虚拟坐标都意味着很难保证UI图像中艺术家的精细像素与屏幕上像素之间的1:1映射,这意味着您存在以下风险:令人讨厌的缩放伪影(假设您在屏幕上渲染为带纹理的四边形)。
我们采用了虚拟坐标方法,特别是为了避免对宽高比产生歧义。因此,当渲染到16:10屏幕时,UI空间为(0,0)->(1600,1000),但是当渲染为4:3时,可用的UI空间实际上为(133,0)->(1467 ,0)。
有我不知道的更好的解决方案吗?有什么好的策略可以最小化这三种方法的问题?