Display lists very slow

Started by
12 comments, last by nrgyzer 13 years, 3 months ago
Hey guys,

I've already worked with display lists and I always saw that they are boosts my SDL-OpenGL applications. But... now, I've started a new project. When I draw my scene without any display list, I get an FPS of around 1300 or 1400, but with display lists it slows down to 300 or 400 fps. In principle it's enough, but I think that's can't be normal.

My code to initialize SDL and OpeGL is the following:
	SDL_Init(SDL_INIT_VIDEO);	SDL_Init(SDL_INIT_VIDEO);	screen = SDL_SetVideoMode(r.w, r.h, r.bpp, SDL_OPENGL|SDL_HWSURFACE|SDL_GL_DOUBLEBUFFER|SDL_INIT_NOPARACHUTE|SDL_INIT_EVENTTHREAD);	displayList = glGenLists(1);		glEnable(GL_BLEND);	glEnable(GL_ALPHA_TEST);	glEnable(GL_TEXTURE_2D);	glEnable(GL_DEPTH_TEST);		glDisable(GL_CULL_FACE);		glDepthMask(GL_TRUE);	glDepthFunc(GL_LEQUAL);		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);	glAlphaFunc(GL_GREATER, 0.1);	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);		glClearColor(0, 0, 0, 0);	glClearDepth(1);		glViewport(0, 0, r.w, r.h);		glMatrixMode(GL_PROJECTION);	glLoadIdentity();	glOrtho(0, r.w, r.h, 0, 0, -100);


My render loop looks like this:

		glNewList(displayList, GL_COMPILE);						displayFunction();					glEndList();				glCallList(displayList);


... where displayFunction() calls all textures which should be drawn. The source for drawing textures is this:

	glBindTexture(GL_TEXTURE_2D, textureId);		glBegin(GL_QUADS);				glTexCoord2i(0, 0);		glVertex3i(position.x, position.y, zPos);				glTexCoord2i(1, 0);		glVertex3i(position.x + textureSize.w, position.y, zPos);				glTexCoord2i(1, 1);		glVertex3i(position.x + textureSize.w, position.y + textureSize.h, zPos);				glTexCoord2i(0, 1);		glVertex3i(position.x, position.y + textureSize.h, zPos);		glEnd();


I think I've forgotten anything to initialize or similar mistake. I hope anyone can help me to solve the problem.
Advertisement
glNewList(displayList, GL_COMPILE);			displayFunction();			glEndList();		glCallList(displayList);


If possible, only compile the display list once,
and later on, in your render function, call upon glCallList with
your compiled display list.
Quote:If possible, only compile the display list once, and later on, in your render function, call upon glCallList with your compiled display list.
Absolutely. The point of a display list is to cache draw operations on the GPU. The code bracketed by the glNewList()/glEndList() calls will be stored on the GPU for later use. Each frame, you're telling the GPU to remember the draw code, and then telling it to recall it--so of course it's going to run slower than if you just told it to draw it in the first place.
-G

[size="1"]And a Unix user said rm -rf *.* and all was null and void...|There's no place like 127.0.0.1|The Application "Programmer" has unexpectedly quit. An error of type A.M. has occurred.
[size="2"]

Damn, I always forgot that fact, thanks :).
I've changed my source so that I compile my display list only once. But it doesn't grow up the FPS as much as I wish. Without any re-compiling during one second, I get the same rate as without display list. When I re-compile the display list, let's say all 10 ms, the FPS drops down to around 500 or 600.

Without drawing anything, the frame rate grows up to 2800 which is also a bit slow. When I comment out SDL_GL_SwapBuffers, the FPS grows up to some 100 thousand FPS. With SDL_GL_SwapBuffers, the FPS slows down to 2800. Does anyone have an idea what's the problem can be?
At framerates that high, the numbers become less and less relevant to what kind of performance you're actually getting.

600fps is 1.6667ms
2800fps is 0.3571ms

The difference is 1.3095ms, or smaller than the difference between 55fps and 60.
Okay, I disabled Vsync in my graphic card settings and I'm just getting 1000 FPS with display list (and re-compile it every 10 ms) and 1300 FPS without using any display list.
Why would you use a display list when you recompile it so many times?
I suggest you to move to vertex arrays and buffers.

Another suggestion is that you simply stop looking at the FPS because if it's 50000, 2000, 1000, or even 60, you wont see the difference...at all.
Optimize things when you actually need to.
I'm trying to use VBOs to render my scenes, but I've got an black screen by using the following code:

Vertex[] vertices = [Vertex(0, 0, 0, 0, 50), Vertex(1, 0, 100, 0, 50), Vertex(1, 1, 100, 100, 50), Vertex(0, 1, 100, 100, 50)];glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glGenBuffers(1, &vbo);	glBindBuffer(GL_ARRAY_BUFFER, vbo);glEnableClientState(GL_VERTEX_ARRAY);glBufferData(GL_ARRAY_BUFFER, vertices.sizeof, &vertices, GL_STATIC_DRAW);glColor3f(1, 1, 1);	glInterleavedArrays(GL_T2F_V3F, Vertex.sizeof, null);glDrawArrays(GL_QUADS, 0, vertices.length);SDL_GL_SwapBuffers();


In this case it should draw at least one white rectangle. Do anyone know what I'm doing wrong? - Please note, that I'm using the D instead of C/C++.
To be honest I've never seen glInterleavedArrays used before, so I'm not sure why it wouldn't work with that.

What I do know how to use is glVertexPointer, which you can try instead (not saying that it's better, but it's what I've typically always seen used).

Vertex[] vertices = [Vertex(0, 0, 0, 0, 50), Vertex(1, 0, 100, 0, 50), Vertex(1, 1, 100, 100, 50), Vertex(0, 1, 100, 100, 50)];glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glGenBuffers(1, &vbo);	glBindBuffer(GL_ARRAY_BUFFER, vbo);glEnableClientState(GL_VERTEX_ARRAY);glBufferData(GL_ARRAY_BUFFER, vertices.sizeof, &vertices, GL_STATIC_DRAW);glColor3f(1, 1, 1);	glVertexPointer(3, GL_FLOAT, sizeof(Vertex), (void*)(2*sizeof(float)) );glDrawArrays(GL_QUADS, 0, vertices.length);SDL_GL_SwapBuffers();


If you want to add your texture info, you throw in an enable client state for the texture coordinates, and specify another pointer.

Also the last two vertices in your quad are the same, not that this is why you're getting a black screen, but I think your quad is really only a triangle :)
[size=2]My Projects:
[size=2]Portfolio Map for Android - Free Visual Portfolio Tracker
[size=2]Electron Flux for Android - Free Puzzle/Logic Game

This topic is closed to new replies.

Advertisement