Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Protobuf net IsPacked=对于用户定义的结构为true_C#_Protobuf Net - Fatal编程技术网

C# Protobuf net IsPacked=对于用户定义的结构为true

C# Protobuf net IsPacked=对于用户定义的结构为true,c#,protobuf-net,C#,Protobuf Net,当前是否可以对用户定义的结构使用IsPacked=true?如果没有,将来是否有计划 当我尝试将该属性应用于ColorBGRA8[]类型的字段时,出现以下异常:System.InvalidOperationException:只有简单的数据类型才能使用压缩编码 我的场景是这样的:我正在写一个游戏,有大量的blitable结构,用于各种各样的东西,比如颜色、向量、矩阵、顶点、常量缓冲区。它们的内存布局需要在编译时精确定义,以便匹配着色器中的常量缓冲区布局(其中字段通常需要在16字节边界上对齐) 我

当前是否可以对用户定义的结构使用IsPacked=true?如果没有,将来是否有计划

当我尝试将该属性应用于ColorBGRA8[]类型的字段时,出现以下异常:System.InvalidOperationException:只有简单的数据类型才能使用压缩编码

我的场景是这样的:我正在写一个游戏,有大量的blitable结构,用于各种各样的东西,比如颜色、向量、矩阵、顶点、常量缓冲区。它们的内存布局需要在编译时精确定义,以便匹配着色器中的常量缓冲区布局(其中字段通常需要在16字节边界上对齐)

我并不想浪费任何人的时间,但我找不到关于这个问题的任何最新信息

在回答后进行编辑

我目前正在测试一个解决方案,该解决方案使用protobuf net处理几乎所有内容,但用户定义的大型数组除外,但它是可访问的结构。自定义结构数组的所有my字段都已替换为可以打包的字节数组。protobuf net完成数据反序列化后,我通过p/invoke使用memcpy,以便能够再次使用自定义结构数组

以下数字来自一个测试,该测试序列化了一个实例,其中包含字节[]或ColorBGRA8[]的一个字段。原始测试数据约为38MiB的数据,例如颜色数组中的1000000个条目。序列化是使用MemoryStream在内存中进行的

写作
平台复制+协议:51ms,大小:38,15mib
Protobuf:2093ms,大小:109,45 MiB

阅读
平台复制+协议:43毫秒 Protobuf:2307ms

测试表明,对于或多或少随机数据的巨大数组,可能会出现明显的内存开销。如果不是在(反)序列化时代,这也不会有什么大不了的。我知道protobuf网络可能不是为我的极端情况而设计的,更不用说为它而优化了,但这是我不愿意接受的

我想我会坚持这种混合方法,因为protobuf网络在其他方面都非常有效。

只是“不适用”。引自:

只有原语数字类型的重复字段(使用varint、32位或64位导线类型的类型)才能声明为“压缩”

这不适用于自定义结构或类。这里应用的两种方法是字符串(长度前缀)和组(开始/结束标记)。后者的编码成本通常较低,但谷歌更喜欢前者

Protobuf的设计不是为了任意匹配其他字节布局。它是自己的编码格式,仅用于处理/输出protobuf数据。这就像说“我正在编写XML,但我希望它看起来像{non-XML}”。

只是“不适用”。引自:

只有原语数字类型的重复字段(使用varint、32位或64位导线类型的类型)才能声明为“压缩”

这不适用于自定义结构或类。这里应用的两种方法是字符串(长度前缀)和组(开始/结束标记)。后者的编码成本通常较低,但谷歌更喜欢前者


Protobuf的设计不是为了任意匹配其他字节布局。它是自己的编码格式,仅用于处理/输出protobuf数据。这就像说“我正在编写XML,但我希望它看起来像{non-XML}”。

感谢您的快速回答以及它不受支持的原因。这就把事情弄清楚了。谢谢你的快速回答以及它不被支持的原因。这就把事情弄清楚了。