动作脚本3.0使对象仅在场景中可见

时间:2015-01-20 09:39:13

标签: actionscript-3 flash gpu cpu render

我的应用中有数千个对象。我想让对象只在我看到的场景中可见,并使对象在场景中不可见。我写了一段代码,但它的工作时间很长。这是我的代码:

for(var i:int = 0; i<container.numChildren; i++){
    var obj:MovieClip = container.getChildAt(i) as MovieClip;
    rectScene.x = -container.x + 25; // position things...
    rectScene.y = -container.y + 25;
    if(rectScene.intersects(new Rectangle(obj.x-40,obj.y-43,obj.width,obj.height))){
        obj.visible = true;
    }else{
        obj.visible = false;
    }
}

示例图片:http://i.stack.imgur.com/GjUG8.png

每次拖动场景时都要检查所有数千个对象。我该如何解决这个问题?

非常感谢!

1 个答案:

答案 0 :(得分:1)

我会在每个场景中创建一个Sprite并将属性对象添加到它们中。因此显示列表可能如下所示:

+root
+-+scene1
  +obj1
  +obj2
    .
    .
  +objN
+-+scene2

等等。这样您只需要切换当前场景的可见性。但是正如我所看到的,你正在根据与“场景矩形”的交集对对象进行排序,如果你要检查那么多的对象,这是一个昂贵的过程。如果您无法添加数据结构以将对象关联到场景,那么您可以尝试缓存结果并仅在更改内容时运行搜索...

最后但并非最不重要的是,您可以实现基于空间分区的改进搜索算法,以便尽可能减少交叉点测试的数量。但这在很大程度上依赖于您的应用程序,如果一切都在变化,并且您需要经常更新分区树,那可能不会有所改进。

修改

用于有效查找区域中的对象的一种可能的算法可以是正交范围搜索。这里的解释太过分了,不是问题的主题。

包含精美描述的书籍this,快速而肮脏的Google搜索结果为here

该算法基于二进制树,其中包含对象的坐标。如果对象移动不适合您的应用程序,那么树只需要初始化一次并且后续范围查询非常快。确切地说,它们的速度取决于要查询的区域的大小。因此,改进的幅度会越大,所查询区域的面积与整个世界的尺寸相比就越小。

祝你好运!

编辑#2

我曾经有类似的东西需要处理,这是一维的(仅限x轴),但据我所知,它不应该太复杂,不能使这个工作在二维(从书中得到,以上链接)。您可以查看问题here