我有一个大型的Flash项目,我正在试图找出处理它的最佳方法。我想加载组及其成员的XML文件,以及与每个组及其各自成员相关的一组属性 - 但这些组和成员仅在用户单击其父组后显示在屏幕上。我的第一个想法是只为组织和用户的整个树提取XML,然后为组分配影片剪辑,并附加与其显示相关的属性以及用户如何与它们交互 - 但是如果它们可能永远不会出现在屏幕,这样做是没有意义的吗?我如何最好地构建这个项目?构建一个对象并仅将属性附加到该对象,然后仅在单击时添加显示数据?
我已经尝试过一次这样的建筑,但是在中途变得太笨重了,所以我想以坚实的方式开始新鲜事。任何建议都表示赞赏。
答案 0 :(得分:2)
我要做的是加载XML并将其缓存在未解析的模型级别上,以消除用户交互的加载时间,但是在点击时进行所有解析,创建和渲染以按需进行。
答案 1 :(得分:1)
因此,对这类问题没有“一个真实的答案”;但是我可以就如何处理这个问题给你一些建议。
首先,您需要加载和解析整个XML文档;您将希望在一次传递中将数据转换为ActionScript 3对象(也称为模型对象),然后丢弃XML对象;这样做的原因是因为accessing properties of an XML Object in AS3 is very, very slow。编写解析器非常简单; (顺便说一句:我在marshalling data to and from XML上写了一篇相当深入的博客文章);为了这个答案,让我们假设你有一个看起来像这样的XML文档:
<group name="AS3 Developers">
<member name="jonnyreeves" rep="440" />
<member name="mheavers" rep="243" />
</group>
最本地的模型对象图将包含Group
模型和Member
模型,例如:
public class Group {
public var name : String;
public var members : Array; /* of Member objects */
}
public class Member {
public var name : String;
public var rep : uint;
}
一旦你的解析器在XML文档上发挥了作用,你应该留下一个Group对象数组;然后应该将其存储在一个新的模型中,该模型可以让您快速方便地访问它包含的数据:
public class GroupListModel {
private var _groups : Array;
public function GroupListModel(groups : Array) {
_groups = groups;
}
public function getGroup(name : String) : Group {
// TODO Use a lookup table here instead.
for each (var group : Group in _groups) {
if (group.name == name) {
return group;
}
}
return null;
}
public function getMembersWithRepGreaterThan(value : uint) : Array {
const result : Array = [];
for each (var group : Group in _groups) {
for each (var member : Memeber in group) {
if (member.rep > value) {
result.push(member);
}
}
}
return results;
}
}
这样,您可以将所有检索(和修改)方法保留在GroupListModel中;改进encapsulation。
所以,至于显示它们 - 这取决于你计划如何向用户展示它们。我同意你不要过分夸大并提前创建与会员相关的所有DisplayObject,如果它们有很多,或者由于其复杂性而导致DisplayObject的制作成本很高。
您可以采取一些方法,通过对内容进行分页,您可以使用ItemRenderer样式方法,只在需要时才创建实例。另一种选择是使用具有可重置的View对象,可将其放入ObjectPool以供以后重复使用。你最终会采用哪种方法,我会建议牢记黄金法则 - 保持简单 - 让它先工作然后再担心性能和内存使用情况。
最后,如果没有提到有适当的框架来帮助解决这些类型的架构问题,那将是我的疏忽,最受欢迎的两个问题是PureMVC和RobotLegs;如果你有兴趣改进你的手艺,我建议你花点时间学习它们的工作原理。