Action Script 3.0 使对象仅在场景中可见

Action Script 3.0 Making objects visible only in scene

我的应用程序中有数千个对象。我想让物体只在我看到的场景中可见,而让物体在场景外不可见。我写了一个代码,但它运行缓慢。这是我的代码:

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

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

非常感谢!

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

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

等等。这样你只需要切换当前场景的可见性。但正如我所见,您正在根据与 »scene rect« 的交集对对象进行排序,如果您要检查那么多对象,这是一个代价高昂的过程。如果您无法添加数据结构以将对象关联到场景,那么您可以尝试缓存结果并 运行 仅当某些内容发生变化时才进行搜索…

最后但同样重要的是,您可以基于 space 分区实施改进的搜索算法,以便尽可能减少相交测试的数量。但这在很大程度上取决于您的应用程序,如果一切都在移动很多并且您需要经常更新分区树,那可能不是一个改进。

编辑

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

描述很好的一本书是 this and a result of a quick and dirty googling is here

该算法基于包含对象坐标的二叉树。如果对象不移动,这对您的应用程序来说是完美的,因为树只需要初始化一次,并且后续范围查询非常快。确切地说,它们的速度取决于查询区域的大小。所以改进会越大,查询区域的大小与整个世界的大小相比越小。

祝你好运!

编辑#2

我曾经有过类似的事情要处理,那是一维的(仅限 x 轴),但据我所知,在二维中进行这项工作应该不会太复杂(从书,上面有链接)。你可以看看问题 here.