[Bf-committers] OpenGL optimisation

Richard Berry bf-committers@blender.org
Mon, 24 May 2004 20:16:37 +0100


Thanks to Matt Ebb, I've got an example Blender file with a high polygon =
count (via subdivision) surfaces. This is where OpenGL display lists =
really prove themselves; some benchmarks:

Blender 2.33a:
	draw: 33170 ms
	draw+swap: 32550 ms
	displist: 1956 ms
customblender2:
	draw: 3754 ms
	draw+swap: 3560 ms
	displist: 2201 ms

I also did some more profiling to see where the new bottleneck is:

http://www.warwick.ac.uk/student/R.J.Berry/highpoly.png

I tracked down the call to glDrawPixels to the draw_icon_centered =
function. This is used to draw the "centre" of objects:



static void draw_icon_centered(float *pos, unsigned int *rect, int =
rectsize)=20
{
	float hsize=3D (float) rectsize/2.0;
	GLubyte dummy=3D 0;
=09
	glRasterPos3fv(pos);
=09
		/* use bitmap to shift rasterpos in pixels */
	glBitmap(0, 0, 0.0, 0.0, -hsize, -hsize, &dummy);
#if defined (__sun__) || defined ( __sun ) || defined (__sparc) || defined =
(__sparc__)
	glFinish();=20
#endif=09
	glDrawPixels(rectsize, rectsize, GL_RGBA, GL_UNSIGNED_BYTE, rect);
}



This is bad. In-between drawing 3D geometry as fast as possible there are =
calls to glRasterPos3fv, glBitmap and glDrawPixels, which interrupt the 3D =
pipeline with 2D commands.

Apart from the shadow that these object centres have, I think we could =
reproduce the exact same functionality by using GL_POINTS and turning the =
depth buffer off (making them look nicer with GL_POINT_SMOOTH). I did a =
brief experiment to replace draw_icon_centered with GL_POINTS and this =
resulted in a speedup of about 10-15%: not fantastic, but it starts to add =
up when there are a load of objects on screen.

A profile of this is at:

http://www.warwick.ac.uk/student/R.J.Berry/highpoly-nobitmaps.png

r i c k