Fragment 旧文件片段理解-对于那些准备迎接挑战的人
我试图从一个旧的游戏格式中获取PVS(用视线渲染)信息。它有文档,我已经能够把所有的东西翻译成C++代码。然而,这一部分却把我弄糊涂了。今天我花了几个小时试图弄明白从哪里开始,但唉,我什么都没有。同样,这只适用于那些可能面临挑战的人,或者可以就我将如何完成这一任务提供一些建议甚至伪代码的人 多谢各位 数据6条目(其中有6个条目): Data6Size1:WORD 说明Data6Data字段中的条目数 Data6Data:字节或字 这是一个复杂的领域。它包含运行长度编码的数据,告诉客户端哪些区域在“附近”。这样做的目的似乎是让客户能够确定该区域中的哪些暴徒必须检查其Z坐标,以便他们能够坠落到地面(或直到他们降落到某物上)。因为这样做很昂贵,所以只对玩家可见的区域这样做是有意义的,而不是对整个区域内的所有暴徒(重复)这样做 我只遇到数据流是字节列表而不是单词列表的情况。下面的讨论描述对字节流进行RLE编码 这里的想法是形成一个在一定距离内的所有区域ID的排序列表,然后将该列表写入一个RLE编码流以节省空间。程序如下:Fragment 旧文件片段理解-对于那些准备迎接挑战的人,fragment,Fragment,我试图从一个旧的游戏格式中获取PVS(用视线渲染)信息。它有文档,我已经能够把所有的东西翻译成C++代码。然而,这一部分却把我弄糊涂了。今天我花了几个小时试图弄明白从哪里开始,但唉,我什么都没有。同样,这只适用于那些可能面临挑战的人,或者可以就我将如何完成这一任务提供一些建议甚至伪代码的人 多谢各位 数据6条目(其中有6个条目): Data6Size1:WORD 说明Data6Data字段中的条目数 Data6Data:字节或字 这是一个复杂的领域。它包含运行长度编码的数据,告诉客户端哪些区域在
- 0x00..0x3E通过这么多区域ID向前跳过
- 0x3F,按以下16位字中给定的量向前跳字
- 0x40..0x7F基于位3..5向前跳过,然后基于位0..2包含ID的数量
- 0x80..0xBF包括基于位3..5的ID数,然后基于位0..2向前跳过
- 0xC0..0xFE减去0xC0,这许多区域ID就在附近
- 0xFF,WORD由以下单词提供的区域ID数在附近
应注意,0x40..0xBF范围内的值允许一次跳过和包含不超过七个ID。此外,对区域列表进行编码并不需要它们:它们只允许更好的压缩。这是我尝试实现该解压器的过程。未测试,因为没有可用于测试的示例数据。。。(实际上,甚至没有编译)
std::vector区域(std::vector和data6)
{
int rp=0,sz=data6.size();
std::向量结果;
int current_id=0;
而(rp 对于(int i=0;i请尝试改进格式以使数据描述更清晰。将所有内容格式化为代码,这会使单词的语法更高。同时修复导致滚动的长线。投票结束:唉,这不是一个真正的问题,也不是一个编程问题。它实际上只是“你能猜一下这个文档的意思吗?".@Anders Abel Done.谢谢。@Oli Charlesworth我相信这里有人知道如何处理这些东西。我只是想看看是否有人对我处理RLE编码数据的方法有任何指点。@Oli Charlesworth:这似乎不是一个家庭作业,所以我尝试了一下。对于一个从未深入到位级别、从未接触过的人来说实现了一个RLE编码方案。这个描述看起来肯定像是无法破解的古脚本。问题很清楚,我想说这也是一个编程问题。你是人类中的上帝。今晚我将测试这个,即使我不得不调整它,你也给了我一个关于我将要做什么的好主意。谢谢你,我很高兴你不知道。。。
std::vector<int> regions(std::vector<unsigned char>& data6)
{
int rp = 0, sz = data6.size();
std::vector<int> result;
int current_id = 0;
while (rp < sz)
{
int c = data6[rp++];
if (c <= 0x3E)
{
// 0x00..0x3E : skip forward by this many region IDs
current_id += c;
}
else if (c == 0x3F)
{
// 0x3F WORD skip forward by the amount given in the following 16-bit WORD
if (rp + 2 > sz) throw std::runtime_error("Invalid data");
int count = data[rp] + (data[rp + 1] << 8); // (NOTE: May be H/L ?)
rp += 2;
current_id += count;
}
else if (c <= 0x7F)
{
// 0x40..0x7F skip forward based on bits 3..5,
// then include the number of IDs based on bits 0..2
int keep = (c & 7);
int skip = (c >> 3) & 7;
current_id += skip;
for (int i=0; i<keep; i++)
result.push_back(current_id++);
}
else if (c <= 0xBF)
{
// 0x80..0xBF include the number of IDs based on bits 3..5,
// then skip the number of IDs based on bits 0..2
int skip = (c & 7);
int keep = (c >> 3) & 7;
for (int i=0; i<keep; i++)
result.push_back(current_id++);
current_id += skip;
}
else if (c <= 0xFE)
{
// 0xC0..0xFE subtracting 0xC0, this many region IDs are nearby
int keep = c - 0xC0;
for (int i=0; i<keep; i++)
result.push_back(current_id++);
}
else
{
// 0xFF WORD the number of region IDs given by the following WORD are nearby
if (rp + 2 > sz) throw std::runtime_error("Invalid data");
int count = data[rp] + (data[rp + 1] << 8); // (NOTE: May be H/L ?)
rp += 2;
for (int i=0; i<count; i++)
result.push_back(current_id++);
}
}
return result;
}