41
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ofImage::drawが遅い問題

Posted at

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メソッドの中でいちいち呼ばないようにしたら結構早くなった。コンテクストのスイッチにも結構時間がかかるもんなんですね…

そういえばofxFontStashにも同じようなモードがありますね

41
39
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?