在图形方面,有很多关于为3d资产存储创建自定义二进制文件格式的讨论,以便不必在运行时解析更常见的基于文本的格式,如OBJ和COLLADA。有道理。
然而,实际创建这个二进制文件并不是那么简单,因为它涉及序列化或其他方法等技术,其中一些甚至不是C ++本身处理的,除非是在最近的变体中。
但是我想到,如果我将其中一种基于文本的格式解析为C样式的头文件,其中数据只被解析为float
或struct
声明,那么这些数据将与应用程序的其余部分一起编译为二进制文件。也就是说,解析是在应用程序外部完成的,可能是通过脚本完成的,然后在编译时处理转换为二进制文件,因为翻译单元包含标题。
我的想法是否正确,与实际创建二进制文件格式并走这条路线相比如何?
答案 0 :(得分: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);
这两种方法的最大区别在于,在文件中保留二进制表示可以修改之后所表示的内容。实际上,您可以在生产中交换另一个二进制文件,它会立即生效。相反,编译器路由会强制您在每次需要更改二进制数据时重新编译程序:实际上,您的二进制数据会“融入”程序的内容。
在支持动态链接的环境中,您可以通过在单独的动态链接库中隔离二进制数据并将该库与“主”代码分开编译来制作中间解决方案。二进制数据仍然是代码的一部分,但现在您可以独立于程序的其余部分交换新的数据。
答案 1 :(得分:0)
除了编译时间等之外,你还搞砸了第一个,最大的和最主要的原因资源被打包成单独的文件 - 它们是外部的和可交换的。用这种标题格式创建任何类型的DLC几乎是不可能的。
每次资源更改时,您的方式都会强制重新编译相关的项目部分,而外化它们会将解析移动到运行时。艺术家可以处理他们的模型,纹理和其他所有内容,而开发人员可以使用代码,而不会互相影响。