ofImageで画像を表示しようとした時に激遅い状態があるのでメモ。
おそらくoF内部で色々なプラットフォームに対応したり、レンダラを抽象化してたりする所のオーバーヘッドがつみかさなって重くなっている感じであったので、そのあたりを全部すっとばしてGLの関数群をそのまま呼ぶようにした奴
今となっては懐しいdisplaylist使用…。。。
class SimplifiedImageDrawer
{
public:
SimplifiedImageDrawer()
: display_list(0)
, tex(NULL)
{}
virtual ~SimplifiedImageDrawer()
{
deleteDisplayList();
}
void setTexture(ofTexture& tex)
{
this->tex = &tex;
tex_size.set(tex.getWidth(), tex.getHeight());
deleteDisplayList();
display_list = glGenLists(1);
glNewList(display_list, GL_COMPILE);
{
glBegin(GL_TRIANGLE_STRIP);
{
glTexCoord2f(0, 0);
glVertex2f(0, 0);
glTexCoord2f(tex_size.x, 0);
glVertex2f(1, 0);
glTexCoord2f(0, tex_size.y);
glVertex2f(0, 1);
glTexCoord2f(tex_size.x, tex_size.y);
glVertex2f(1, 1);
}
glEnd();
}
glEndList();
}
inline void draw(float x, float y, float w, float h)
{
assert(display_list != 0);
glPushMatrix();
glTranslatef(x, y, 0);
glScalef(w, h, 1);
glCallList(display_list);
glPopMatrix();
}
inline void bind()
{
tex->bind();
}
inline void unbind()
{
tex->unbind();
}
protected:
ofTexture *tex;
ofVec2f tex_size;
GLint display_list;
void deleteDisplayList()
{
if (display_list)
glDeleteLists(display_list, 1);
display_list = 0;
}
};
使う
要点のみ
SimplifiedImageDrawer SID;
ofImage my_image;
void ofApp::setup()
{
my_image.loadImage("test.png");
SID.setTexture(my_image.getTextureReference()); // テクスチャをセット
}
void ofApp::draw()
{
SID.bind(); // テクスチャをバインド
SID.draw(0, 0, 100, 100); // 描画
SID.draw(100, 0, 100, 100); // 描画
SID.draw(0, 100, 100, 100); // 描画
SID.unbind(); // テクスチャをアンバインド
}
上記の例では数回しか呼んでないのでうまみゼロですがこっちでやってみた感じ2万個ぐらいまでは余裕の60フレキープで動いてました。
bind/unbindをループの外に出してdrawメソッドの中でいちいち呼ばないようにしたら結構早くなった。コンテクストのスイッチにも結構時間がかかるもんなんですね…