大地图分块加载处理

  现在flash网页游戏大地图和一般都采用菱形格子tile的方式来处理,好处是节省资源,地图是由素材拼接而成,灵活,可以用素材拼出多种地图等等,当然今天要记录的并不是各种地图处理方式的优劣,只是因为近段时间接触的全是这种方式,包括看别人的,也包括自己的项目,所以想把其中的一些技术要点记下来,免得忘了。

  这次先写个对于N多格子为节省效率而采用的方式:

  首先,不要一个格子一个格子去绘,格子太小,数目太多,很影响效率,而应该把几个格子合成一个大的块,然后再按块来处理,这里就说一下blockManager,这里面记录总共有多少个块,哪些块块在可视区内,哪些块需要重绘,即:blocks.<Block>, blockInView.<Block>, blockNeedReDraw.<Block>, 而每个block需要是一个可以提供画板(一般会用一个BitmapData)的东西来在重绘的时候展示绘的内容,但这个画板是可以节省的,因为不需要显示的block完全可以没有这个东西,因此可以定义一个画板池sharedBlockBD.<SharedBlockBD>,其中存放继承自BitmapData的一个扩展类,然后现在就可以进入按需绘块的流程了

  首先是一个拖动来触发更新需要重绘的块,主要是根据屏幕当前的状况来决定在重绘发生时哪些块是需要重绘的,然后push进blockNeedReDraw.<Block>,并且有个小窍门,在moveTo方法最后调用stage.invalidate()来触发Event.RENDER事件使操作延后重绘,当重绘事件到达后需要做三件事:1)blockInView.<Block>中所有block.isInView = false;2)为blockNeedReDraw.<Block>中的每个块从画板池sharedBlockBD.<SharedBlockBD>中配一个画板,当然有的就不需要了,因为这一次要重绘的很可以是上次重绘的,然后将blockNeedReDraw.<Block>中的块搞进blockInView.<Block>,当然是已有的就只修改下属性.isInView = true,没有就push进去;3)从现在的blockInView.<Block>中剔除掉假inView的block,使该数组中全部是真正需要重绘的块。最后对于inView中的block做内容绘制工作。

  随后上代码

 

  最后总结,需要注意几点,1)合理利用数据处理的优势,先把要渲染的数据全部处理好,其实flex框架也是这么搞的,什么显示列表失效啦,属性失效啦,样式失效啦都是一个道理;2)合理利用stage.invalidate()来延后渲染;3)资源池是利用,能节省点资源就节省点

posted on 2010-04-17 01:12  fancle  阅读(1836)  评论(1)    收藏  举报

导航