C++ 将多个值打包到“;键”;
我在读一篇关于游戏引擎中绘制调用缓冲区的文章: 这样的缓冲区在提交到GPU之前保存绘制调用,并且通常在提交之前根据多个值(深度、材质、视口等)对缓冲区进行排序 本文中的方法建议使用打包在一起的值将draw调用存储在提供上下文(如viewport、material和depth)的键下,以便排序顺序从MSB开始,到LSB结束。前2位是视口,后24位是深度,后10位是材质ID,依此类推。然后,在实际绘图时,通过按此键排序,可以轻松/快速地进行排序。然而,我很难做到:C++ 将多个值打包到“;键”;,c++,C++,我在读一篇关于游戏引擎中绘制调用缓冲区的文章: 这样的缓冲区在提交到GPU之前保存绘制调用,并且通常在提交之前根据多个值(深度、材质、视口等)对缓冲区进行排序 本文中的方法建议使用打包在一起的值将draw调用存储在提供上下文(如viewport、material和depth)的键下,以便排序顺序从MSB开始,到LSB结束。前2位是视口,后24位是深度,后10位是材质ID,依此类推。然后,在实际绘图时,通过按此键排序,可以轻松/快速地进行排序。然而,我很难做到: 如何在实践中贯彻落实, 实际的加
- 如何在实践中贯彻落实,
- 实际的加速比仅仅是拥有一个具有多个成员的结构并实现一个比较每个结构成员的比较函数
struct S {
unsigned viewport : 2;
unsigned depth : 24;
unsigned material : 10;
unsigned unused : 28; // always some fixed value like zero
};
然后,当您想要比较其中两个时,只需使用memcmp(&s1,&s2,8)
,一个好的编译器会将其转换为单个64位比较。注意:memcmp()
只需从给定地址开始一次比较一个字节,因此请注意机器的结尾,以便“最重要”的字节位于结构的第一位。这可能需要在异常大小字段之间添加一些填充
至于“简单地拥有一个具有多个成员的结构并实现一个比较每个结构成员的比较函数的实际加速”,您必须在特定的平台上尝试这一点才能找到答案。可能更快,可能更慢,可能是一样的。如果使用普通宽度整数而不是位字段,将消耗更多内存,但某些操作可能更快(或更慢)