簡潔にしようと思います。私はiPhoneでOpenGLES2.0を使用しており、VertexBufferObjectを使用して画面上に一度に多くの形状をレンダリングしています。
一連のゼロ上向きのインデックスがに使用されGL_ELEMENT_ARRAY_BUFFER
、これらは次の場所に格納されます。
GLushort *ixData;
各形状には頂点数があります。新しい形状が作成されると、合計頂点数'vxCount'がixDataのメモリを再割り当てするために使用されます。
NSLog(@"allocating ixData for %i shapes, %i vertices",shapes.size(),vxCount);
ixData = (GLushort*)realloc(ixData, vxCount*sizeof(GLushort));
もちろん、ixDataの初期mallocもあります。
各形状には6つの頂点属性(2つの位置、4つの色)があり、これらはすべてGLfloat
です。各形状には、合計24個の頂点があります。vector<Shape>
コードはC++であるため、形状はに格納されます。値vxCount
は、この形状ベクトルのサイズに形状ごとの頂点の数を掛けることによって計算されます(つまりshapes.size()*24
)。
各シェイプの位置はフレームごとに変わるため、各レンダリングでglDrawElementsを呼び出す直前にバッファデータを再送信します。
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glBufferData(GL_ARRAY_BUFFER, vxDataSize, vxData, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
NSLog(@"render vxcount is %i",vxCount);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, ixDataSize, ixData, GL_STATIC_DRAW); //*
このアプリは、508までの任意の数の図形に最適です。ただし、509番目の図形を追加しようとするEXC_BAD_ACCESS
と、インデックスバッファーデータ用に取得されます。上記のコードでは、関連する行にアスタリスクが付いています。
上記のコードのNSLogプリントアウトを以下に示します。ご覧のとおり、最新の割り当てられた頂点カウントは、プリミティブインデックスの送信時のカウントと一致しています。
..。
2011-08-31 20:35:59.438 nibfree [26409:707] 503形状、12072頂点にixDataを割り当てます
2011-08-31 20:35:59.441 nibfree [26409:707] 504の形状、12096の頂点にixDataを割り当てます
2011-08-31 20:35:59.444 nibfree [26409:707] 505の形状、12120の頂点にixDataを割り当てます
2011-08-31 20:35:59.448 nibfree [26409:707] 506の形状、12144の頂点にixDataを割り当てます
2011-08-31 20:35:59.451 nibfree [26409:707] 507の形状、12168の頂点にixDataを割り当てます
2011-08-31 20:35:59.454 nibfree [26409:707] 508の形状、12192の頂点にixDataを割り当てます
2011-08-31 20:35:59.457 nibfree [26409:707] 509の形状、12216の頂点にixDataを割り当てます
2011-08-31 20:35:59.746 nibfree [26409:707]レンダリングvxcountは12216です
〜12kの頂点はデバイスにとって問題ではなく、インデックスデータのタイプは、 0〜65535のGLushort
頂点インデックスが可能であることを意味します。
私は本当に困惑しています、誰かが何が間違っているのか推測できますか?iPhone固有の頂点/インデックスバッファの制限を超えていますか?
アップデート
洞察を追加するために、形状サイズを24頂点から12頂点に半分にしました。その後、再試行し、制限に達しました1536 shapes, 18432 vertices
。シェイプごとに12の頂点を持つ1537のシェイプを追加しようとすると、以前と同じように。でクラッシュしEXC_BAD_ACCESS
ます。
この最新のテストは、vxData / ixDataストレージが問題ではなく、頂点または頂点インデックスの数に制限がないことを示しています。可能な形状の数はおよそ3倍に増加しました-これは、私が遭遇しているGL_TRIANGLESレンダリングの癖を示唆していますか?それとも、reallocの誤用ですか?なぜそれが問題なのかよくわかりません:(
更新2
パターンを見つけるための別の数字のセット:300の頂点には最大61の形状があり、62はクラッシュを引き起こします。62には、vxcount 18300、最後のixDataインデックス18299があります。