如何高效实现TagLib ByteVector到Godot PoolByteArray的字节缓冲区转换?
将TagLib ByteVector高效转换为Godot PoolByteArray
我在整合TagLib库与Godot引擎时,需要在两者间传输大量字节数组数据,但两者的字节存储类型不兼容:
- Godot 使用
PoolByteArray - TagLib 使用
ByteVector
我需要把TagLib函数返回的ByteVector转换为PoolByteArray供Godot项目使用,目前的实现方式如下:
godot::PoolByteArray ByteVector2PoolByte(TagLib::ByteVector data) { godot::PoolByteArray x; for (size_t i = 0; i < data.size(); i++) { x.push_back(data[i]); } return x; }
这种循环逐个插入元素的方式效率极低,肯定存在更高效的实现方案,求各位帮忙改进。
补充说明
- 已查阅两种类型的头文件,明确了它们的内存操作接口
- 有朋友指出当前函数采用值传递数据的方式同样低效,这点确实正确
- 尝试过通过
const char*直接构造PoolByteArray,但Godot的该数组类型没有对应的构造函数,此方法不可行
高效解决方案
godot::PoolByteArray ByteVector2PoolByte(TagLib::ByteVector && data) { godot::PoolByteArray converted_buffer = godot::PoolByteArray(); const char* original_buffer = data.data(); converted_buffer.resize(data.size()); memcpy((uint8_t*)converted_buffer.write().ptr(), original_buffer, data.size()); return converted_buffer; }
内容的提问来源于stack exchange,提问作者LyffLyff
相关产品推荐
相关产品推荐

