1

在图形中,有很多关于创建自定义二进制文件格式来存储 3d 资产的讨论,这样更常见的基于文本的格式(如 OBJ 和 COLLADA)就不必在运行时进行解析。说得通。

然而,这个二进制文件的实际创建并不那么简单,因为它涉及序列化或其他方法等技术,其中一些甚至不是由 C++ 原生处理,除非在其最新的变体中。

但我突然想到,如果我将其中一种基于文本的格式解析为 C 样式的标头,其中数据仅解析为floatorstruct声明,那么这些数据将与应用程序的其余部分一起编译为二进制文件。也就是说,解析是在应用程序外部完成的,可能是通过脚本完成的,然后在编译时处理转换为二进制文件,因为翻译单元包含标头。

我的想法是否正确,这与实际创建二进制文件格式并走这条路相比如何?

4

2 回答 2

2

您的想法是绝对正确的:您可以使用编译器的帮助将文本表示转换为二进制。我不会使用标题,而是将数据放在单独的翻译单元中,并保留一个固定的标题,其中包含脚本填充的数据结构的前向声明:

标题:

// This is fixed
extern float data_array[];
extern size_t data_array_cnt;

CPP 文件:

// This gets generated by a script
float data_array[] = {1.2, 3.4, 5.6, 7.89 };
size_t data_array_cnt = sizeof(data_array)/sizeof(float);

这两种方法之间的最大区别在于,将二进制表示保留在文件中可以让您在编译完所有内容修改所表示的任何内容。事实上,您可以在生产环境中换入另一个二进制文件,它会立即生效。相比之下,每次二进制数据需要更改时,编译器路径都会强制您重新编译程序:实际上,您的二进制数据会“嵌入”到程序的内容中。

在支持动态链接的环境中,您可以通过将二进制数据隔离在单独的动态链接库中并将该库与“主”代码分开编译来制定中间解决方案。二进制数据仍然是代码的一部分,但现在您可以独立于程序的其余部分交换新数据。

于 2013-03-30T11:13:14.393 回答
0

除了编译时间等,你搞砸了资源被打包到单独文件中的第一个、最大和最主要原因——它们是外部的和可交换的。几乎不可能使用这种标头格式创建任何类型的 DLC。

每次资源更改时,您的方式将强制重新编译相关项目部分,而将它们外部化会将解析移至运行时。艺术家可以处理他们的模型、纹理和其他所有内容,而开发人员则可以处理代码而不会互相干扰。

于 2013-03-30T11:12:00.733 回答