我的应用中有数千个对象。我想让对象只在我看到的场景中可见,并使对象在场景中不可见。我写了一段代码,但它的工作时间很长。这是我的代码:
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
每次拖动场景时都要检查所有数千个对象。我该如何解决这个问题?
非常感谢!
答案 0 :(得分:1)
我会在每个场景中创建一个Sprite并将属性对象添加到它们中。因此显示列表可能如下所示:
+root
+-+scene1
+obj1
+obj2
.
.
+objN
+-+scene2
等等。这样您只需要切换当前场景的可见性。但是正如我所看到的,你正在根据与“场景矩形”的交集对对象进行排序,如果你要检查那么多的对象,这是一个昂贵的过程。如果您无法添加数据结构以将对象关联到场景,那么您可以尝试缓存结果并仅在更改内容时运行搜索...
最后但并非最不重要的是,您可以实现基于空间分区的改进搜索算法,以便尽可能减少交叉点测试的数量。但这在很大程度上依赖于您的应用程序,如果一切都在变化,并且您需要经常更新分区树,那可能不会有所改进。
修改强>
用于有效查找区域中的对象的一种可能的算法可以是正交范围搜索。这里的解释太过分了,不是问题的主题。
包含精美描述的书籍this,快速而肮脏的Google搜索结果为here。
该算法基于二进制树,其中包含对象的坐标。如果对象移动不适合您的应用程序,那么树只需要初始化一次并且后续范围查询非常快。确切地说,它们的速度取决于要查询的区域的大小。因此,改进的幅度会越大,所查询区域的面积与整个世界的尺寸相比就越小。
祝你好运!编辑#2
我曾经有类似的东西需要处理,这是一维的(仅限x轴),但据我所知,它不应该太复杂,不能使这个工作在二维(从书中得到,以上链接)。您可以查看问题here。