上一篇简单的展示了下我的弹幕解析器。这一篇开始进入弹幕解析器的细节了。
再次打广告,CSB项目的git地址在这里: http://git.oschina.net/zyf/CSB
这次要说的是弹道文件是怎么规划的。
弹道文件是以"csb"为扩展名的二进制文件。它里面包含了在CrazyStrom编辑器里面的“发射器”和“激光”两种元素的详细信息。
csb文件是通过mbg2csb.py这个脚本讲CrazyStrom编辑生成的mbg文件转换得到的。脚本使用的是python2.7。
常言道:一图胜千言.上图:
如上图是空白参数调用转换脚本将会输入的帮助内容。帮助说的比较明确了。
python mbg2csb.py 附加参数列表 文件列表或目录就可完成转换。
值得注意的是mbg2csb.py本身是utf-8编码存储的所以在windows平台默认的输出帮助内容或提示信息可能是乱码。
但是不影响正常的使用。
上图演示了默认转换是使用的小端字节序(对于大小端不了解的可能你需要去度娘了解一下。一般手机的arm芯片还有intel以及amd的cpu都是小端的)
以及演示了如何通过-b参数控制大小端字节的输出.
因为在脚本的生成阶段就把数据按照cpu的字节序排列好就可以免除在加载阶段的转换了。而且脚本实现这些要简单的多。
上图演示了如何递归的转换一个目录下的所有的需要转换的文件。
考虑到可能在项目的某个资源路径下存在大量需要转换的文件,添加了递归查找并转换的-R参数。跟在-R参数后面的就是目录,而不再是文件列表了。
图片中没有展示“文件列表”这个参数 形式。我在这写一下:
python mbg2csb.py a1.mbg a2.mbg a2.mbg ......
就是形如上面这样的转换方式。
在csb文件中,只是对mbg中一些元素属性进行了筛选重排后写入的文件。
文件的格式大概不是大家关心的。
因为CSB项目还没有实现对激光的支持,所以mbg2csb.py中并没有添加激光的写入过程。当编辑出来的的mbg文件种包含激光的时候就会报错了。原因是我做这个的时候项目没有用到激光。也就没有做了。如果大家需要了,希望帮助扩展出来。
可以从脚本的使用跳出来到libCSB中是如何加载生成的csb文件了。
在libCSB的项目中存在一个测试用例,main.cpp。如果你也跟我一样是在linux上用的qtcreator操作的,那么你可以打开libCSB.pro修改头部的一段文本:
从上面的形式改成下面的形式。如果你不是linux不是qtcreator,那么你就需要根据你自己的开发环境自行配置。
无论怎样你都可以打开main.cpp查看源代码来了解使用过程。
看main函数的开头部分:
/* first of all */ COORD_CONFIG_VIEW_WORLD(800, 480); CSB_math_init(); list_buf_init(); csnode_buf_init(); csobj_buf_init(); /* then all tests */ test_loadcsb();
是的,在开始加载csb文件前,需要初始化好多东西.
第一行有效代码是对视界初始化,定义了一个可视区域的大小。
CSB_math_init()是对数学计算库的一些初始化。
list_buf_init()这一行非常重要。list_t是CSB里面的核心容器结构。后面的篇幅讲介绍CSB的内存管理。
接着也是一些必要的缓冲初始化。
对于这篇博客,我们着重看一下test_loadcsb的实现:
static void test_loadcsb() { printf("###############| test load csb |################\n"); list_t* objlist = load_csb("good4.csb"); if (!objlist) { printf("%s\n", csb_lasterr()); return; } printf("load csb success, get %u obj \n", objlist->size); list_foreach(objlist, show_objdataname, NULL); list_free(objlist, (free_node_data)csobjdata_free); }
load_csb是在csb.h中声明的一个加载csb文件的函数。它的兄弟是: load_csbdata(unsigned char* pdata)
他们都返回list_t*类型的一个包含该文件种所有的元素的链表结构指针。
加载过程会伴有一大长串的日志,就不在这里贴了。具体运行就可以看到。
objlist中的每个节点存储了一个csobjdata_t对象的指针。通过show_objdataname简单的便利了objlist打印了所有的csobjdata_t对象的名字。
最后通过list_free将objlist释放内存。
简单说无非就是:加载->使用->释放
关于如何使用,后篇介绍。
另外的在main.cpp中存在其它的测试,感兴趣的可以看看,并提出建议。也许你的测试例子的日志存在异常或者测试意外死亡。这是因为CSB在开发过程中有一次大的数据结构的变动,测试的例子代码没有更新。你可以尝试从git上pull最新的项目来解决问题。
好了,以上就是这篇博客要整的内容。