きままにものづくり

日々の気付いたことなんかを書いてます。

OpenGL ~透明な線を描く(2)~

こんにちは、even_ekoです。

今日は、OpenGL ~透明な線を描く(1)~の続きです。

前回の記事では、UIViewを重ねることで濃度が一定な透明な線を描くことができました。しかし、この方法ではメモリ不足になってしまいます。

 

メモリ不足の原因

メモリ不足になる理由は、UIViewそれぞれにフレームバッファを作成しているからです。OpenGL ESでは、glGenFramebufferOESという関数を使ってフレームバッファオブジェクトを確保します。

 

void  glGenFramebuffersOES(GLsizei n,GLuint *framebuffers)

n :必要なフレームバッファオブジェクト名の数

framebuffers : n個の要素から成る配列へのポインタ。ここに確保されたフレームバッファオブジェクトが返される。 

 

この関数を使用すると、framebuffersに数字が割り当てられます。これは、フレームバッファにアクセスするためのIDのようなものです。

前回の記事のUIViewを重ねる処理では、UIViewを作成した後にフレームバッファオブジェクトを生成しています。その後、touchendイベントを拾ったらフレームバッファオブジェクトを削除しています。そして、またUIViewを作るという処理を繰り返しています。つまり、一筆描くごとに新しいUIViewとフレームバッファが作成されます。

ここで、注意しなければいけないことはフレームバッファオブジェクトを削除してもフレームバッファはクリアされないということです。フレームバッファを削除するためにはglClearを使います。

毎回フレームバッファオブジェクトは、削除されてますがフレームバッファは削除されていません。フレームバッファは、かなり大きいデータです。そんなフレームバッファをいくつも所有していくアルゴリズムになっているので、メモリ不足になってしまいます。

フレームバッファをマージする

UIViewを重ねる処理でも、7枚以下くらいなら問題なく動作します。なので、重ねるUIViewの枚数に制限をかけることでメモリ不足を回避できます。制限枚数を超えたら一番下のフレームバッファとその一枚上のフレームバッファをマージさせます。

 

今日は、コンテキスト間でフレームバッファを移動させるのにつまづいているため、実装はまだできていまん。

メモリの使用量はできるだけ押さえたいので、2枚のUIViewを使おうと思います。