PBO と SDL_GL_SWAP_CONTROL
動画プレイヤーのテクスチャ転送に PBO を使ってみた。
処理時間を計測してないので早くなったかどうかはよくわからないが、前よりも音が切れにくくなったような気がする。
とはいっても、バックグラウンドに回すと音が切れるが。
CPU使用率はどうやらあまり変わらないらしい。
最初、えらい増えたと思っていたのだが、原因は SDL_GL_SWAP_CONTROL を 1 にしていたからだった。
多分、VSYNC 待ちのせいだろう。
CPU使用率のほうは良いのだが、単純に処理を付け足したので、メモリ使用量が増えてしまった。
まぁ、大した量ではないから別にいいか。
ハマッた箇所をメモしておく。
最初は PBO がマルチスレッドに対応してないのかと思ったが、処理の順番を変えたら動くようになった。
・一回目のテクスチャ生成
glBindTexture(GL_TEXTURE_2D, m_texture_list[writepos]); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, pixel); // ↓ glTexImage2D 後に実行しないと正しく動作しない glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, m_pbo_list[writepos]); glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, size, NULL, GL_DYNAMIC_DRAW_ARB);
・二回目以降のテクスチャ生成
glBindTexture(GL_TEXTURE_2D, m_texture_list[writepos]); // ↓ glTexSubImage2D する前で良い glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, m_pbo_list[writepos]); glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, size, NULL, GL_DYNAMIC_DRAW_ARB); GLubyte* p = (GLubyte*)glMapBufferARB( GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB); memcpy(p, pixel, size); glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB); glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, 0);
処理をどこに入れるかの違いだが、glBindBufferARB の入れる場所を間違えただけで動かなくなってしまう。
OpenGL は間違った組み方をしても動ける場合はそのまま動くので、正しく動かす方法は基本的にはトライアンドエラーで覚えていかなければいけない。