我正在Unity中进行一个项目,需要渲染磁盘上存储的大量数据。这些数据包括足球比赛中所有球员的根变换。稍后我们还将访问骨骼变换。
我从以前的开发人员那里继承的代码基本上是将数据序列化为一种自定义文件格式,其中包含 * 球员 * 和 * 球 * 的位置数据的“分块”流。这些 * 块 * 是根据1000毫秒的设置持续时间划分的。(非常)有限的知识,我看不出将数据以二进制格式划分为块的性能优势。仅仅使用一些缓冲区并读取数据的子集不是更好吗?
到目前为止,我只阅读了关于这个主题的内容,以了解与优化内存和IO相关的概念。但是我很难理解从什么主题开始。
2条答案
按热度按时间9jyewag01#
对这类数据进行分块可能有一些好处
1.它可以允许索引,让你直接跳转到某个时间点。你也可以对每一帧都这样做,但你可能不需要比1秒更好的分辨率。这可能不需要索引,但要求每一帧包含完全相同的数据量。
1.它可能会提高IO性能,做更少但更大的读/写。但这可能会取决于IO系统,缓冲等。所以我会测试之前,得出任何结论。
1.它可以允许压缩。一个常见的压缩策略是存储差异而不是最后的值。但是如果你想跳到一个特定的时间,你需要某种类型的块,可以独立地解压缩。
1.我的猜测是,这种类型的数据不应该是所有的征税。我的猜测将是大约1MB/s,不应该造成问题的CPU或SSD。然而,它应该是有可能的,以减少数据量大幅提高一点智能。例如,通过存储输入,或当动画开始。
如果您关心性能,最重要的事情是分析和/或基准测试您的解决方案。这样您就知道:
1.有问题吗?
1.具体是什么问题?
1.我的治疗真的改善了吗?
g6ll5ycj2#
我们来算算:
22 players
+ball
使得23 x Vector3
=69
(不错!:“D”)float
s =二进制69 x 4b
=276b
。如果还包括方向并保存
Quaternion
,则每帧将增加22 x Quaternion
=88 x float
=88 x 4b
=352b
。总共是
628 b per frame
。您的帧每秒(1000 ms)只有一次,所以现在假设您加载
90 Minutes
的play aka这对于整个足球比赛将仅产生大约× 1 M14 N1 X的数据。
=〉我还宁愿按块加载/解析它/甚至在开始时将整个数据完全加载到内存中,以避免流加载按帧加载时出现任何FileIO故障。
即使你以后有了骨骼和20倍的数据,我还是会把那64 Mb加载到内存中。每一个现代设备都应该能够处理它。正如前面提到的,这还有其他的优点,比如跳转到某个时间帧等等