Project1

标题: 关于地图缓冲 [打印本页]

作者: 黑之翅膀    时间: 2011-11-4 06:22
标题: 关于地图缓冲
卡马克卷轴算法的引入
       上面的算法虽然在一定程度上解决了地图绘制的效率问题,但对于某些资源严重不足的手机,或者由于地图块比较小、循环次数过多的情况,仍然会造成画图时屏幕闪烁。因此,在这种情况下,仍然需要对上述算法做进一步的优化。

        不论采用哪种优化算法,一个基本的思路就是尽量减少绘制的次数,从而减少对系统资源的消耗。卡马克卷轴算法就是这样算法的一个经典例子。

单方向卷轴
        对于横版游戏来说,如果角色向右侧移动,则地图向左侧滚动。由于角色每次移动若干个步长,因此地图中新画出的区域宽度也为若干个像素,那么如果让系统重绘所有屏幕区域,很明显,大部分区域都是和上一屏幕区域相同的,如此造成成了资源的浪费。而卡马克算法的思路就是——如果上一次绘制过的地图也能够部分重用到本次地图绘制上来就好了。那么很容易想到在内存中建立一个和屏幕一样大或略大的缓冲区即可很好的完成这个设想。


       由上图可以看到,区域B为相同的地图区域,这个区域在下一次屏幕重绘时,可以被重新利用。区域A是在下一次屏幕重绘中不被采用的区域,这区域应当被舍弃,但是如果稍微留意一下的话,不难发现区域A和区域C的面积大小其实居然是一样的。
       那么如果建立一个和屏幕大小相同的缓冲,在其被舍弃掉的绘制区域A中画上新的区域C,再把区域B和区域C拼合到屏幕上,是不是就能达到减少系统资源消耗的目的了呢?卡马克卷轴的基本原理正是如此。


       图显示了卡马克卷轴的最基本原理,首先在内存中建立一块和屏幕一样大小(或略大)的缓冲区。然后在本应由于地图移动而被舍弃掉的区域1上面绘制,由于地图滚动而出现的新地图区域。最后把两个区域按照地图的实际位置拼合到屏幕上。

双轴滚动的卡马克卷轴
        对于俯视游戏,或者有Y轴卷动的游戏来说,单单一个方向的地图卷动并不够用。那么如果是出现两个方向的卷动会如何呢。不必担心,上面的思路算法一样能适应这种情况。


        由上图可以看到,区域D为相同的地图区域,这个区域在下一次屏幕重绘时,可以被重新利用。区域ABC是在下一次屏幕重绘中不被采用的区域,可以在这个3个区域上绘制上下一次需要重绘的区域A’B’C’。再将绘制好的四个区域拼合到屏幕的对应位置。

       上图显示了双轴滚动的卡马克卷轴的基本绘制原理,需要特别注意的是:在缓冲区的绘制顺序和在屏幕上拼合的顺序是完全相反的。

卡马克算法的实现
卡马克卷轴缓冲画法的一般步骤如下:
1. 初始化所有地图数据,并且全屏绘制初始的地图
2. 若人物移动,则调用摄像机算法,修正地图偏移量
3. 地图偏移量不满足地图的边界条件,就重绘缓冲区
4. 重绘缓冲区
5. 后台缓冲区的四个子区按照顺序画到屏幕上
作者: 后知后觉    时间: 2011-11-4 09:59
这种转载物发在这里合适么.
作者: 黑之翅膀    时间: 2011-11-4 14:33
看来我得去外国站,这里敌人太多了...
作者: 后知后觉    时间: 2011-11-4 15:25
你还是回火星去吧.那里对你来说是最安全的.
地球太小.每个角落都可能有你的敌人.这里不适合你.

版规第2条说得很清楚.这个板块是不接受【转载】的.
乱发帖还很拽.

作者: 苏小脉    时间: 2011-11-4 22:43
为什么会没有这个脚本

Tilemap、Sprite 的绘制都封装在底层引擎,并没有简单的方法证明 RM 没有进行这方面的优化,至少 RM 没有屏幕闪烁问题(所以至少是用了多缓存)。当系统资源极其紧张时,或许能观察到绘制规律。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1