游戏设计小议:三 绘制层次与帧同步运算(上)

本篇讨论绘制层次与帧同步运算中的绘制层次部分

  对于display函数的抽象表述如下:

  

  display包括了两大部分,即绘制和运算,作为上篇将讨论绘制模型(也即图中draw完成的任务),而在下篇中将讨论运算的各种问题(calculate完成的部分),并提供一个小巧的程序实例。

  在上一篇当中,我们使用JAVA编写了一个以60帧每秒的速度绘制一个画面的程序,虽然大部分由OPENGLAPI完成了,而且没有绘制任何图形,那么今天我们在此基础上进行一个扩充,我们将设计出绘制基本的图形的结构。

  在开始绘制之前,我们先引入一个重要的概念:绘图对象

  由于是面向对象的程序设计,屏幕上的图形可以抽象为一个绘图对象类的实例,这个绘图对象类应当包括图形的各种属性(位置、角度、颜色、透明度等等)和用于绘制的各种方法(画圆、画方或是绘制纹理等等)。

  之后引入一个同样重要的概念:层次绘制

  如果把一个游戏的显示部分概括为一层画纸的话,它显然应该由多层组成。比如打飞机这种常见的纵向卷轴游戏,首先,飞机相对于屏幕是固定的(你不控制的话),之后要有一个背景自上而下的滚动以让你产生飞机向前飞的直观感觉,然后是敌人以及弹幕从顶部或其他地方铺天盖地的飞过来.....这里,背景的绘制层次显然与飞机的绘制层次不同,我们可以总结一下一个游戏应具备的基本层次:

  背景层:最底层的当然负责背景的绘制,在这个层次的绘图对象承担背景绘制的工作。

  游戏对象层:背景之上的是游戏对象(或者是游戏引擎中常说的精灵)层,这层中的绘图对象往往是玩家控制的游戏实体或具有对等关系的道具、敌人、NPC等等。

  UI层:用于展示信息的层次,包括按钮、菜单、进度条、计分板等等。

  以上三个层次已经可以还原大部分FC游戏的绘制结构了,但是对于计算机游戏来讲,三个层次并木能满足大部分的需要,而我们的CPU和GPU也有余力去进行更多层次的绘制,那么,我们也介绍一下其他常见的层次:

  效果层:对于一个现代的粒子特效,粒子源可能成百上千之多,因此有必要和游戏对象层次进行分离。(关于粒子特效将在随后章节进行详细讨论)

  操作符层:这个层次的提出有些奇怪,但有些场合确实必不可少,在一些RTS中,鼠标对单位的范围选取往往使用拖拽出一个矩形区域的方案,这个矩形应该单独绘制成一层,也许您在怀疑把它放置在UI层更为合理,但是有些矩形这时会贴近游戏地图的地表进行绘制(这时它更贴近于游戏对象而非UI,而显然它并不具备游戏对象的性质),所以单独拿出作为一层,用于各种鼠标或键盘的响应信号及操作符号的绘制。

  总之,层次这个东西是可以灵活设置的,根据游戏开发需要合理的设置层次可以有效地提高效率。

  也许游戏人在这里会有疑问,设想我们不设置层次的概念,而在绘图对象中添加一个绘制深度的概念,这样可以把离散的层次连续化,不是更为方便吗?事实上,这个绘制方案确实具有一定可行性,而OPENGL也提供了深度检测技术使绘图对象不需纠结于按深度排序绘制,但是设想这样一个情况,常见于一些RTS(如星际II)中,我们对当前的场景进行一些变换(转换视角或是进行屏幕缩放)时,那些UI模块(如建造栏、地图等)是不会跟着改变的,在这种情况下,判断哪些深度下的绘制对象需要改变以及对应的改变算法都过于复杂,而使用层次绘制时只需要对背景及游戏对象层中的绘图对象进行统一的算法调度即可。

----------------------------------------------------------------分割线-----------------------------------------------------------------------------

  有了绘制层次绘图对象的概念,我们可以对Painter中display方法的绘制模型进行构造了。

  我们可以将一开始图中抽象的draw概括如下:

  首先,我们有绘图对象类:PObj,每一个PObj都代表着屏幕上的一个图形。

  之后,用于绘图对象的的控制,我们有一个PObjController,它用于提供对PObj的增删功能,并提供对应层次的容器和它们的并发安全支持。

  最后,在Painter的display方法里,调用PObjController的方法依次获得并发安全的各个层次容器,并对其中的绘图对象进行遍历与绘制。

  以上完成了draw的任务,在下篇中将讨论运算的各种问题(calculate完成的部分),并提供一个小巧的程序实例。

转载于:https://www.cnblogs.com/ThrBlock/p/3535188.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值