GoogleのProtcolBuffersを使用して、floatの配列をRepeatedFieldにシリアル化しました。
データを逆シリアル化するときは、別の設定クラスを使用して、ゲームクラスにより適した形式で情報を保持します。静的CreateFrom
メソッドはデータを抽出して変換します。
class VoxelTerrainSettings
{
public:
std::vector<int> indices;
btAlignedObjectArray<btVector3> vertices;
VoxelTerrainSettings(void);
~VoxelTerrainSettings(void);
static VoxelTerrainSettings CreateFrom(const VoxelTerrainProtoBuf::VoxelTerrainSettings &settings)
{
VoxelTerrainSettings s;
int numIndices = settings.indices().size();
s.indices.reserve(numIndices);
for (int i = 0; i < numIndices; ++i)
{
s.indices.push_back(settings.indices().Get(i));
}
int numVertices = settings.vertices().size();
s.vertices.reserve(numVertices);
int v = 0;
for (int i = 0; i < numVertices; ++i)
{
s.vertices.push_back(btVector3(settings.vertices().Get(v++), settings.vertices().Get(v++), settings.vertices().Get(v++)));
}
return s;
}
//VoxelTerrain Load();
};
ただし、RepeatedFieldからすべての要素を抽出するための現在の方法は、あまり洗練されていないようです。
より効率的なアプローチを採用しようとしましたが、どちらも範囲外のエラーをスローします。
std::copy(settings.vertices().begin(), settings.vertices().end(), vv.begin());
std::copy(&settings.vertices().Get(0), &settings.vertices().Get(settings.vertices().size() - 1), &vv[0]);
要素抽出をより効率的にするためにどのような方法を使用できますか?