Screeps 中优化 Memory 储存

问题

在 Screeps 中,Memory 是很重要的存在,它让信息可以在Tick与Tick之间保存状态。但是每个Tick对Memory的第一次引用都会触发Memory的反序列化,我们来看一下官方原文。


可见,每次都进行反序列化,对CPU的开销是比较大的,官方也告诉我们,实际上使用RawMemory是一种更好的方式,但这需要我们自己去进行设定,并且这对很多人来说很难。

但接下来的方案您可以参考一下,在继续说之前我需要问自己几个问题。

注意:Memroy存在的意义是什么?

它让信息可以在Tick与Tick之间保存状态

注意:还有什么可以跨Tick之间保存状态?

没错,global,但是global会定时清空 这个问题在之后会得到解决

那么,我们只需要让 RawMemory 做到Tick与Tick之间保持状态就可以了,我们并不需要再去写一个RawMemory序列/反序列模块。

But, How?

  1. 我们让序列化的数据,保存在 RawMemory0 (以下简称Raw0)中
  2. 让global储存我们的反序列化数据,并建立Proxy监听
  3. 在Raw1(以下简称Cache)中记录好每个tick对global的更改,当变化时,写入到Cache
  4. 每当global清空时,立即从Raw0反序列化数据,通过合并Cache中的修改来还原数据的最后状态并恢复数据到global


如此一来,Cache中只会储存被经常修改的数据,例如状态机、坐标位置、寻路缓存等小量动态数据,这部分数据只有在Proxy监听到修改时会得到序列化与反序列化的同步更新,耗时取决于在一个global周期你做了多少事情;Raw0中的数据通常多的是大量静态数据,这部分数据的序列化与反序列化频率只取决于global被清空的频率。

Absolutely,我们在对每个Tick的修改进行监听时使用到了Proxy,您当然可以在Proxy中实现更加优美的反序列化逻辑。

Absolutely2,您可以在Raw0与Cache(Raw1)合并时加入Raw2,Raw3等,来扩容或者分类,并设置他们的合并逻辑。

关于global挂载这里有仙术,可以参考
https://www.jianshu.com/p/c6413d67893b

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 面试必背 会舍弃、总结概括——根据我这些年面试和看面试题搜集过来的知识点汇总而来 建议根据我的写的面试应对思路中的...
    luoyangzk阅读 6,810评论 6 173
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,923评论 18 139
  • multiprocessing --- 基于进程的并行源代码 Lib/multiprocessing/ 概述mul...
    青月教主阅读 606评论 0 0
  • Django知识点概述 Web应用 问题1:描述一个Web应用的工作流程。 问题2:描述项目的物理架构。(上图中补...
    领带衬有黄金阅读 721评论 0 1
  • 入门与进阶 第一章 进入编程 1,如何快速运行一段js代码? 方式1:浏览器开发者工具。可以使用快捷键option...
    潇潇潇潇潇潇潇阅读 890评论 0 0