SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4452|回复: 2
打印 上一主题 下一主题

[Discuss] app私有bin

[复制链接]

149

主题

331

帖子

2445

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2445
跳转到指定楼层
楼主
发表于 2016-6-18 21:33:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ancientcc 于 2016-6-18 21:56 编辑

私有bin要解决两个问题,一是有哪些bin,二是如何构造这些bin。要回答这个两个问题,先了解bin.cfg,和Rose生成私有bin的过程。

一、bin.cfg
如果app有私有bin,那需要在它的<res>/app-<appid>目录下创建bin.cfg,通过该文件描述私有bin情况。对于bin.cfg的内容,它只有四个字段,没有块,以下是一个实例。
  1. [bin]
  2.         id_child = "campaign"
  3.         scenario_child = "campaign_addon"
  4.         macros = "data/core/app-kingdom/macros"
  5.         path = "data/app-kingdom/campaigns"
  6. [/bin]
复制代码

字段描述是否必须
id_childconfig块名。含有id字段的块,除id外,该块下还有个特殊字段:define必须
scenario_childconfig块名。该块下的内容将成为私有bin内容必须
macros路径。构造私有bin的脚本来源1,用于定义宏。注1。它的前面部分是<res>可选
path路径。构造私有bin的脚本来源2,用于定义内容。它的前面部分<res>必须


1:macros、path的前面部分是<res>。举个例子,macros = "data/core/app-kingdom/macros",res是c:/sample,那macros的完整路径是“c:/sample/data/core/app-kingdom/macros”。

二、Rose生成私有bin的过程
让就以上面的bin.cfg实现描述生成过程。假设<res>是c:/sample
  • 扫描c:/sample下的app-<appid>目录,发现c:/sample/app-kingdom下有bin.cfg。
  • 解析“path”字段指示的脚本(注意此时不解析“macros”),形成一个config。枚举该config下子config(只是第一级),对于块名是campaign(id_child字段值)的就会对应一个bin,即有几个“campaign”该app就有几个bin。而“campaign”字段下的id值就会作为bin名称,像以下一个_main.cfg,它会对应siege.bin。

    1. <res>/data/app-kingdom/campaigns/siege/_main.cfg"
    2. [campaign]
    3.         id = "siege"
    4.         define = CAMPAIGN_SIEGE
    5. [/campaign]
    6. #ifdef CAMPAIGN_SIEGE
    7. [campaign_addon]
    8.         ......
    9. [/campaign_addon]
    10. #endif
    复制代码

  • 构造siege.bin。构造分四个步骤,1)如果[id_child]指定块中含有define字段,在构造时首先会定义该宏,像以上例子就会先定义“CAMPAIGN_SIEGE”宏。2)如果“macros”指定了路径,构造该路径,例子中是“c:/sample/data/core/app-kingdom/macros”。3)构造“path”指定的路径,例子中是“c:/sample/data/app-kingdom/campaigns”。4)从形成的config下子config(只是第一级)搜到第一个块名(只关心第一个)是“scenario_child”值的,该块内容就是最后bin文件内容,例子中就是“campaign_addon”块。


接下让回答开始提的两个问题。
问题一:有哪些bin
解析“path”字段指示的脚本(注意此时不解析“macros”),形成一个config。枚举该config下子config(只是第一级),对于块名是campaign(id_child字段值)的就会对应一个bin,即有几个<id_child>块该app就有几个bin。

问题二:如何构造这些bin
构造分四个步骤,1)如果[id_child]指定块中含有define字段,在构造时首先会定义该宏。2)如果“macros”指定了路径,构造该路径。3)构造“path”指定的路径。4)从形成的config下子config(只是第一级)搜到第一个块名(只关心第一个)是“scenario_child”值的,该块内容就是最后bin文件内容。

几个要点
  • 两次构造。第一次构造目的是有为了“有哪些bin”,第二次构造是为了构造bin内容,这两次构造过程相互独立。相比于第一次,第二次构造多了两个步骤,1)多定义“define”字段指定的宏,2)在构造“path”前先构造“macros”路径。
  • 第二次构造时为什么要多定义“define”字段指定的值。两次构造来源都要来自“path”,app可以通过该宏达到这么个目的:即使是同一个cfg也让出来两个config,比如上面写的“_main.cfg”,因为多了CAMPAIGN_SIEGE,第二次编译“_main.cfg”就比第一次多了“campaign_addon”块。
  • 如何设定macros、path值。“macros”放置“path”中内容会使用到的宏,不要放置内容,内容都放在“path”。


要形成私有bin,app应该怎么做
  • 在<res>/app-<appid>下创建bin.cfg。
  • 确定名称所在块名:“id_child”值。
  • 确定内容所在块名:“scenario_child”值。
  • 如果须要宏目录,设定“macros”值。
  • 确定内容目录,设定“path”值。

回复

使用道具 举报

149

主题

331

帖子

2445

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2445
沙发
 楼主| 发表于 2017-1-30 20:32:38 | 只看该作者
本帖最后由 ancientcc 于 2017-7-18 09:27 编辑

按要求把指定的多个cfg目录/文件转换成一个*.bin文件或另外cfg。

语法
  1. bool editor::cfgs_2_cfg(const editor::BIN_TYPE type, const std::string& name, const std::string& app, bool write_file, uint32_t nfiles, uint32_t sum_size, uint32_t modified)
复制代码


参数
type间接指示要生成的是哪个bin文件
name在生成一些bin时须要这个值
appapp标识,在生成一些bin时须要这个值
write_filetrue时把结果写入bin文件,false则不写
nfilesbin头四元组中的nfiles
sum_sizebin头四元组中的sum_size
modifiedbin头四元组中的modified


返回值
成功返回true,否则false。

范例
  1. <Example>
复制代码


注释
类型(type)文件名描述name
TB_DATtb-hexagonal.dat/tb-square.dat地形数据tb-hexagonal.dat/tb-square.dat
SCENARIO_DATAduel.bin/hero_race.binapp私有bin
GUIgui.bin窗口子系统不须要
EXTENDABLE不会生成文件目的是生成campaigns_config_、tbs_config_。是概述,不是具体bin不须要
MAIN_DATAdata.bin主配置不须要


相关类、函数
<Relative class, function>
回复 支持 反对

使用道具 举报

149

主题

331

帖子

2445

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2445
板凳
 楼主| 发表于 2017-7-18 09:37:39 | 只看该作者
本帖最后由 ancientcc 于 2017-7-18 10:23 编辑

按要求把指定的多个cfg目录/文件重新生成wml2bin_descs_。

语法
  1. void teditor_::get_wml2bin_desc_from_wml(const std::vector<BIN_TYPE>& system_bin_types)
复制代码


参数
system_bin_types要重新计算的系统bin


返回值
void

范例
  1. <Example>
复制代码


注释
每个bin有个时间戳,这个时间戳是个四元组,
字段类型描述
namestd::string短文件名
nfilesuint32_t文件数,只累计文件不包括目录。
sum_sizeuint32_t总字节数,只累计文件不包括目录。
modifieduint32_t最近文件的修改时间,只计算文件不包括目录。

从硬盘上读出*.bin,基于目录中cfg计算出的四元组,如果要正确,须严格按cfg扩展机制计算出的四元组,但要能计算出这个值,那就意要深入每个cfg文件!
  1. void data_tree_checksum(const std::vector<std::string>& defines, const std::vector<std::string>& paths, file_tree_checksum& checksum)
复制代码

这函数要耗不少cpu,但studio首页总是要重新计算所有bin,用这方法会有较大延迟。这里用种不深入每个cfg的替换方法。
  1. void data_tree_checksum(const std::vector<std::string>& paths, file_tree_checksum& checksum, int filter)
复制代码

变量use_should_method指示构造该bin使用哪种方法。data.bin涉及到目录多,一定要用第一种方案。


相关类、函数
<Relative class, function>
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2025-5-2 01:00 , Processed in 0.060744 second(s), 19 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表