BDE属于Borland数据库引擎,本身不是独立数据库存储文件,是一层数据库访问接口,传奇早期版本依靠这套接口读取本地Paradox数据表,也就是大家常说的Magic.DB、Monster.DB、StdItems.DB文件,整套运作分为别名注册、引擎调用、数据读写、游戏交互几个环节。
安装DBC2000之后,系统会注册BDE相关驱动库,控制面板里的BDE管理器负责维护数据库别名,别名HeroDB只是一个标记,它记录了指向DB文件夹的路径参数,参数写入注册表,引擎启动的时候先读取注册表内BDE配置,通过HeroDB别名找到对应的目录,再打开目录内的db数据表文件。数据表文件本身存放在MirServer\Mud2\DB目录,文件后缀为db、mb、px,px是索引文件,mb是备注存储,db是主数据表,三者配套才能正常读取,单独复制db文件会读取失败。
启动引擎的时候,M2主程序会发起BDE连接请求,调用idapi32.dll驱动组件,根据HeroDB别名的PATH路径,加载怪物数据、物品数据、魔法技能数据。引擎读取完成之后,把这些基础数据加载进内存,怪物刷新、掉落判定、装备属性、技能效果全部从内存缓存里面调取,不是每次操作都重复读取磁盘数据表,以此保证运行速度。玩家创建账号、保存角色信息,角色数据存储在服务端另外的账号库,和BDE读取的基础物品怪物库分开,BDE只负责静态基础配置数据读取,不承担动态角色存档读写。
BDE管理器点击Apply保存,本质是把别名参数写入注册表的Borland节点,保存动作会修改注册表项,这也是很多系统点击保存就卡住的根源,系统权限拦截注册表写入。保存成功之后,不需要一直打开BDE管理器,BDE管理器只用来配置别名,引擎运行阶段BDE驱动在后台静默工作,BDE程序关闭不影响引擎读取数据库,只要注册表里面HeroDB别名有效,驱动文件注册正常,引擎就能正常访问数据表。
整套运行顺序,先完成BDE别名配置,确认HeroDB路径指向DB目录,驱动组件注册正常,关闭BDE管理器,接着启动引擎主程序,引擎初始化阶段会尝试连接HeroDB,日志里面提示数据库加载成功,代表BDE链路通畅,之后启动网关,等待登录器连接。玩家登录游戏,客户端发送指令到网关,网关转发给M2引擎,引擎根据内存里面从BDE加载的物品、怪物配置完成逻辑运算,返回结果给客户端,展示属性、刷新怪物、掉落对应道具。
修改DB数据表里面的内容,直接在BDE管理器打开HeroDB编辑表格,修改怪物血量、爆率、物品属性,修改保存之后,改动只写入磁盘文件,不会自动同步到引擎内存,必须关闭引擎重新启动,引擎重新走BDE读取流程,加载更新之后的数据,改动才会在游戏内生效。如果修改数据表之后没有重启引擎,游戏里面依旧沿用旧的内存数据,看不到改动效果。
BDE运作有对应的限制,Paradox数据表格式老旧,文件锁机制简单,多个程序同时打开同一组DB文件会出现占用冲突,BDE管理器和引擎同时打开HeroDB,会触发文件锁定报错,引擎读取失败,这也是调整配置的时候要关闭BDE管理器的原因。强制结束引擎进程,有可能损坏px索引文件,索引损坏之后,BDE读取数据表直接报错,引擎启动提示数据库打开失败,需要替换完好的索引文件恢复。
不同引擎对BDE的依赖程度不一样,GOM、GEE这类老内核原生支持BDE读取HeroDB,新版本引擎增加其他数据库支持,但是保留BDE兼容模式。引擎配置向导里面数据库选项选择BDE或者HeroDB,就是通知引擎走这套BDE接口读取数据,如果选错数据库类型,引擎不会调用BDE驱动,自然找不到数据表。
排查BDE链路故障顺着流程定位,引擎启动提示无法打开HeroDB,优先检查注册表里面别名是否存在,PATH路径是否指向正确DB目录,路径内不能带中文和空格。别名存在但是读取失败,检查idapi32.dll是否注册成功,驱动文件是否被隔离,DB目录内px索引文件是否损坏。点击Apply保存卡住,是注册表写入权限不足,调整BDEADMIN.EXE兼容性和管理员权限再尝试。引擎启动成功,修改DB数据游戏不生效,确认修改之后重启引擎,让引擎重新加载数据表资源。
BDE整套机制只是中转接口,核心数据全部存放在本地DB文件夹,没有网络数据库交互,这也是早期单机搭建简单的原因,整套数据读写都在本地完成,不需要额外安装数据库服务程序,只要驱动和别名配置无误,引擎就可以完成基础游戏数据加载运行。
BDE搭建传奇运行原理讲解 数据库别名引擎数据交互流程
来源:
作者:
点击:

