首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有一种方法可以保存对象的状态,以便稍后更快地重新加载?

有没有一种方法可以保存对象的状态,以便稍后更快地重新加载?
EN

Stack Overflow用户
提问于 2009-08-15 15:22:26
回答 5查看 306关注 0票数 4

我正在编写的一段代码必须分析另一个软件生成的外来文件格式--更准确地说,是游戏中的“回放”。在这个回放中,玩家产生的每个动作都用可变数量的参数保存。

我的软件会对用户的动作进行分析,比如在整个游戏中每分钟生成一个他们动作的图表,等等。为了在内部给出详细的信息,每个动作都会用它自己的方法转换成一个对象,但是即使对于最简单的游戏,由于有成千上万的动作,这种分析也需要时间,我现在正在寻找一种方法,当回放已经分析过一次时,可以加速它。

我有几个想法,但我不确定我应该应用哪一个:

1-某种序列化来将操作的对象状态保存在磁盘上,以便可以直接从磁盘重新加载对象?我不确定这是否会对性能产生重大影响,因为它仍然需要创建所有的对象

2-预先创建每个对象类型的大型池,并在用户从重放移动到重放时重用它们,避免创建时间?

我不确定如何在这里进行,所以如果你有任何好的想法,如何以一种快速的方式设计,请随时分享。请注意,在分析之后,使用磁盘空间来保存重放状态并不是问题,而且这些都是“高端”游戏玩家的计算机,所以我可以自由地决定我消耗了多少资源,只要它加快了过程。

提前感谢您的帮助

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-08-15 16:20:17

  • 派生每个对象要将一个组件保存为owner的所有属性
  • 使用TFileStream<
  • >e217或TMemoryStream来存储和加载根<
  • >H220<>F221
票数 8
EN

Stack Overflow用户

发布于 2009-08-15 16:30:38

您当前拥有

代码语言:javascript
运行
复制
GameRecordOnDisk {contains many action defintions } 
                             ---> RepresentionOfActionsInMemory

你知道进行这种转变的时间花在哪里了吗?从磁盘读取?解析数据?创建对象?设置操作之间的链接(也许搜索事物列表?)。

我认为你需要获得一些性能工具,并分析发生了什么。性能调优是出了名的不直观。你经常会发现一行看起来无伤大雅的代码非常昂贵。

然后,您可能会被驱使设计更优化的磁盘表示,或者使您的数据结构更有效率,或者诸如此类。但在没有事实的情况下,你会冒着小心地将一段代码的性能提高1000%的风险,结果却发现你只删除了总开销的1%。

票数 4
EN

Stack Overflow用户

发布于 2009-08-15 16:31:31

乌维·拉贝表达的很棒的想法。

作为另一种选择:

如果您知道要预先创建的对象的数量:在一个包中创建它们,然后访问即可。

如果它每次都是可变的数字,但你知道它是10,000的数量级,那么一次创建100个包中的对象。这将会提高你的工作效率,但仍然如此。我不认为创建对象是您的主要瓶颈。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1282123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档