化学引擎-设计说明

化学引擎-设计说明

化学引擎-是什么?

  1. 化学引擎是对虚拟化学实验中容器、药品、化学反应、现象等一系列对象和变化过程进行抽象和模拟计算的业务模块
  2. 化学引擎是虚拟化学器材和实验颗粒业务的底层支撑,包含的能力有:
    1. 化学药品、化学物质等对象和数据的抽象和生命周期的管理
    2. 容器(实验器材)和连通器(导管等)的抽象和管理
    3. 化学反应的计算,包括反应物、生成物匹配和物质变化计算,反应条件匹配,反应现象输出等
    4. 药品相关物理变化计算,包括混合、溶解、相变、温度变化和热量传递、压强变化和药品转移等
    5. 其它化学变化和现象的计算和输出,如化学电离、pH值、指示剂变色、物质附着、原电池等

化学引擎-现状

  1. 它能做什么?
    化学引擎是一套基于一系列定义好的规则进行数据计算和过程模拟、输出的业务逻辑。目前它能够实现:
    1. 以单个容器为单位,基于规则的反应计算、物质变化计算,物质变化数据输出
    2. 基于规则的反应条件匹配和反应现象数据输出
    3. 基于容器、通道和导管抽象的容器和连通器模型,基于简单压强计算规则的连通器物质转移逻辑
  2. 它不能做什么?
    1. 由于技术难度限制,化学引擎暂不支持药品(物质)的空间位置处理和基于空间位置的反应计算
    2. 由于药品空间位置信息的缺失,一些表现(如水滴、白雾、附着物等)无法由引擎数据支撑,只能表现层特殊处理
    3. 化学引擎输出的表现和现象数据不足以支撑表现上的种种需求
  3. 存在哪些问题?
    化学引擎设计之初是没有策划和学研老师参与的,主要是开发同学从化学反应和物理变化等实验现象中提取出业务来抽象实现的,现在面临的问题主要有:
    1. 需求问题,引擎的需求往往是不完整的或者不明确的,化学实验颗粒的需求(特别是反应现象)往往难以用语言描述清楚,因此缺少明确的验收标准(目前正在推进验收标准的完善),导致实现的效果达不到老师的期望
    2. 学术上缺少可靠的计算模型或逻辑算法,以及缺少数据支撑,如化学反应速率的计算模型、参数等,这类问题目前主要依靠开发同学与学研老师反复调校和验证,以达到或者接近预期的效果
    3. 化学引擎从整体上缺少一个可靠的测试手段,特别是自动化测试的方案,目前可靠性无法保证。新增功能或者修改后经常引发其他问题,目前无法及时发现,只能靠QA回归测试和下游开发同学发现
    4. 从代码和结构上看,目前的框架设计拓展性不够,许多逻辑堆在少数几个class里面。接口层数据结构冗余严重,比较混乱,新增功能和接口时很繁琐
    5. 化学引擎内部计算的数据没有直观的界面呈现,目前只能通过表现和现象来验证,对QA测试、老师验证、调校都不方便,希望有工具可以显示引擎内部数据和参数,并且支持在线调整参数便于老师调校

化学引擎-工程结构

  1. 反应引擎(ChemistryReactionEngine)
    反应引擎是反应计算和其它物质变化逻辑的核心代码,主要有两个核心数据结构(对象):容器和药品。容器包含药品,在容器的抽象上设计了反应发生器(Reactor),反应发生器下面有多个业务处理组件(Component),类似Unity的GameObject包含MonoBehavior的意思
    1. Core部分,引擎的核心对象和业务组件
      1. Artifact,药品对象(BaseArtifact),药品包含它的属性、物质成分、离子数据等数据结构,以partial class形式,其实是一个class
      2. Components,各种业务的逻辑组件
      3. Conditions,反应条件等条件匹配的逻辑
      4. Container,容器对象(ReactionContainer),即反应容器,同样是以partial class形式来组织
      5. Interface,内部接口(没什么用)
    2. Data,引擎数据库,数据结构和CSV表结构对应的逻辑,引擎采用CSV和JSON格式来组织药品、反应规则等数据
    3. Events,内部和外部事件class和数据结构
    4. Interface,反应引擎对外的接口和数据结构,包括引擎管理(Mgr)和容器、药品对外组件类和操作接口
      附图:反应引擎的设计结构
  2. 容器层(ChemistryContainerMgr)
    反应引擎只管单个容器内的反应和物质变化,甚至不管容器有多大。容器层则负责各种容器的抽象,包括形状的描述、体积计算,还有容器之间的连接关系,导管、通道等抽象,主要业务则包括容器的压强计算和容器之间的物质转移(气体、液体流动),热源热量处理等。

    1. Config,容器和导管的配置数据结构,容器和导管一些属性是可配置的
    2. DescData,容器、导管、通道的数据结构对象
    3. Events,容器层事件数据结构
    4. Models,还是些数据结构。。主要是对反应引擎的数据又包装了一层,看不下去了。。
    5. Processor,容器层业务逻辑,对反应引擎通知事件的处理,容器属性的更新,压强计算、转移计算等
    6. Transfer, 物质转移和热量传递逻辑
    7. VolumeHelper,容器形状,液体体积和液面高度等表现数据计算
  3. 接口层(ASEVLabChemistryContainer)

    1. AgentComponent,给Lua调用的接口
    2. AgentComponentLogic,接口的实现
      1.Logic,还有一些数据结构和逻辑。。主要是为Lua查询、转换、过滤数据结构,真有点绕。。。

化学引擎-详细设计说明

  1. 药品对象和数据结构,附图
  2. 化学反应处理流程,附图:

    备注: