在 AS3 中为游戏存储 XML 数据的最佳方式
Posted
技术标签:
【中文标题】在 AS3 中为游戏存储 XML 数据的最佳方式【英文标题】:Best way to store XML data for a game in AS3 【发布时间】:2016-05-26 09:59:19 【问题描述】:我正在为 AS3 编写一个游戏,它从 XML 文件中提取数据,对其进行解析并将其组织成不同的对象(自定义 AS3 类)。当我尝试思考如何存储图像数据以及以后如何初始化它时,它开始变得有点棘手。目前我将角色的显示对象存储在自定义角色精灵类中。然而,我认为拥有一个巨大的 AssetLoader 类实际上可能会更好,而不是将数据存储在 Character 类中,而是将它存储在 AssetLoader 类中的一个大数组中。
考虑到可能有数百个角色资产,这将是最有效的方法。
【问题讨论】:
这主要是基于意见。您应该使用您认为最舒适/最有用的东西。每种方法都有其优点和缺点。 资产的数量无关紧要,它们需要的内存空间是。如果您将拥有数百个资产并且它们加在一起需要大量内存,请不要将资产保存在内存中。 @BotMaster 我想我唯一能想到的就是每个级别都有单独的 XML 文件,并且只加载与每个级别相关的资产。然后当关卡结束时,从内存中刷新所有内容并加载下一组资产。 【参考方案1】:在 XML 中存储图像数据可能不是一个好主意。以二进制格式单独存储图像数据,并且仅将 ID 或 URL 存储在 XML 中。就个人而言,我更喜欢以 AMF 格式存储所有对象数据,这使得编码和解码变得容易且非常快速。
【讨论】:
您不能将图像数据存储在 xml 中。在快速资产访问方面,AMF 也不是一个奇迹解决方案。如果资产存储在本地,那么 AMF 将使该过程变慢,因为它需要额外的解析,当用于通过 http 传递数据时,它需要测试证明更快,因为后端必须压缩和客户端解压缩,这会增加总时间。 可以,例如 base64 编码。 是的 base64 存储为字符串并需要字节加载,您在 xml 中这样做的唯一原因是故意使整个过程尽可能慢。 对不起,@Aaron - 我应该解释得更好一点。 URL 存储在 XML 中,然后我解析数据并使用加载器将二进制数据存储在自定义对象中 - 然后我稍后会引用它们。为每张图像存储二进制数据仍然感觉非常消耗内存。 @JCoulam 如果没有更多细节,很难知道最好的权衡是什么,但是是的,为了获得流畅的游戏体验,我通常发现预加载所有资产是最好的,否则你运行在需要时出现口吃/冻结的风险(或者,根据游戏类型,这可能没什么大不了的)。如果您的游戏实际上存在达到内存限制的风险(例如,有很多非常大的位图),那么最好避免将它们全部预加载。这一切都取决于。抱歉,这个答案与您的问题无关。干杯。【参考方案2】:如果可能,按级别组织资产通常是个好主意。根据关卡的大小,您可能能够实现更精细的粒度(例如:关卡分为多个区域;假设玩家从区域 A 开始,因此您加载区域 A 的所有资产;现在假设他从通过某个连接门从 A 到 B;您从内存中删除所有区域 A 资产和对象-您为垃圾收集准备它们-现在为区域 B 加载资产-您可以有一个小的加载消息或其他东西来表示过渡,想想像暗黑破坏神这样的游戏有类似的关卡加载和区域导航方法)。
如果没有更多细节,很难说您是否需要这种细粒度的加载。我建议您从更简单的方法(每级资产)开始,如果真的需要,从那里开始改进。记住:“过早的优化是万恶之源。”
PS:您不应该只组织每个级别的图像数据,理想情况下,您应该像这样组织所有级别的信息。如果在实际到达所述级别之前不需要显示特定于级别的信息,那么预加载它是一种浪费。
PPS:根据游戏的运行位置和大小,您可能需要考虑放弃 XML 方法并使用数据库(例如:用于桌面的 SQLite 和/或用于web ) 用于存储游戏相关数据(包括图像)。 XML 往往很快就达不到要求,而且维护起来很容易变得很麻烦,更不用说您最终可能想要添加可以真正受益于集中式数据库的新功能(例如:记分牌、用户统计信息、成就等)。
【讨论】:
【参考方案3】:我正在使用这个静态类在 100 多个游戏类之间共享大型配置 XML、一些运行时变量和一些对象: https://github.com/inruntime/AS3-Global-Object
【讨论】:
以上是关于在 AS3 中为游戏存储 XML 数据的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章