快速业务通道

Flash游戏大场景管理与四叉树

作者 佚名技术 来源 服务器技术 浏览 发布时间 2012-07-07

  Flash游戏开发不得不面对的问题是Flash Player渲染性能较低(与传统桌面游戏相比较),这个问题在场景较大时显得尤为突出。

Facebook上最近新出了一款Zynga开发的游戏 Roller Coaster Kingdom ,场景较大,人物较多,在我的机器上就跑的惨不忍睹。

最常见的渲染优化手段是关闭DisplayObject的一些属性如mouseEnabled = false,使用cacheAsBitmap,scrollRect等等。但是性能提升并不明显。第二种手段是使用Bitmap来渲染游戏。这是最传统的做法,利用双缓冲画布、脏矩形等技术可以做到十分平滑高效的渲染,通常能获得2-3倍的性能提升。缺点是可扩展性和维护成本较大,一些鼠标事件也会丢失。

这些渲染都是针对最终输出到屏幕上的大量可视元素所做的。对于一张3000×3000px, 放满了建筑跑满了人的地图而言,我们只能采取更高级的手段去优化它——想想3D引擎是怎么做的?视锥剪裁。其基本原理是将不需要渲染的点从屏幕上去掉。 Flash游戏大场景管理与四叉树 设想你的地形是一个非常大的方格,在一个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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号