Flash游戏大场景管理与四叉树
作者 佚名技术
来源 服务器技术
浏览
发布时间 2012-07-07
Flash游戏开发不得不面对的问题是Flash Player渲染性能较低(与传统桌面游戏相比较),这个问题在场景较大时显得尤为突出。 Facebook上最近新出了一款Zynga开发的游戏 Roller Coaster Kingdom ,场景较大,人物较多,在我的机器上就跑的惨不忍睹。 最常见的渲染优化手段是关闭DisplayObject的一些属性如mouseEnabled = false,使用cacheAsBitmap,scrollRect等等。但是性能提升并不明显。第二种手段是使用Bitmap来渲染游戏。这是最传统的做法,利用双缓冲画布、脏矩形等技术可以做到十分平滑高效的渲染,通常能获得2-3倍的性能提升。缺点是可扩展性和维护成本较大,一些鼠标事件也会丢失。 这些渲染都是针对最终输出到屏幕上的大量可视元素所做的。对于一张3000×3000px, 放满了建筑跑满了人的地图而言,我们只能采取更高级的手段去优化它——想想3D引擎是怎么做的?视锥剪裁。其基本原理是将不需要渲染的点从屏幕上去掉。 设想你的地形是一个非常大的方格,在一个X和Z的面上扩展。我们有一个摄象机在地形的右下角,它的可视截面(蓝三角)扩展为在相同方向上的小单元,这样在优化前,绘制地形的程序代码看 起来象这样: for(vari:int=0;i<size;i++){drawCell();//...} 采用剪裁手段后,我们就只需要绘制剪裁后的部分,代码变为: varresult:Array=cullMap(); varlen:uint=result.length; for(vari:int=0;i<len;i++){drawCell();//...} 剪裁的手段有很多种,在不同的场景下有各种实现手段,如BSP树、四叉树/八叉树等。四叉树对于特大场景是一个不错的选择。其基本思想是将一幅地形数据等分为4部分,逐块检查其网格属性值;如果某个子区的所有格网值都具有相同的值,则这个子区就不再继续分割,否则还要把这个子区分割为四个子区;这样依次分割,直到每个子块都只含有相同的属性值为止。 详细介绍请点击此处 我的例子中,单机鼠标左键会渲染以鼠标为原点,150×150矩形范围内的随机矩形。而整个场景有10 000个矩形分布在5000*3000的屏幕中。 Flash Player文件: Actionscript3版四叉树的插入与查询: publicfunctionquery(queryArea:Rectangle):Array { varresult:Array=[]; foreach(varitem:IQuadNodeItemincontents) { if(queryArea.intersects(item.getRectangle())) result.push(item); } foreach(varnode:QuadNodeinnodes) { if(node.isEmpty)continue; if(node.bounds.containsRect(queryArea)) { result=result.concat(node.query(queryArea)); break; } if(queryArea.containsRect(node.bounds)) { result=result.concat(node.subTreeContents); continue; } if(node.bounds.intersects(queryArea)) result=result.concat(node.query(queryArea)); } returnresult; } publicfunctioninsert(item:IQuadNodeItem):void { if(!bounds.containsRect(item.getRectangle()))return; if(nodes.length==0) createSubNodes(); foreach(varnode:QuadNodeinnodes) { if(node.bounds.containsRect(item.getRectangle())) { node.insert(item); return; } } this.contents.push(item); } 关键词: |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: Flash CS4 3D工具打造滚动照片的立方体模型下一篇: 随机运动小球的源码解析
关于Flash游戏大场景管理与四叉树的所有评论