Jump to content
  • Advertisement
Sign in to follow this  
nrgyzer

OpenGL Display lists very slow

This topic is 2827 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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?

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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++.

Share this post


Link to post
Share on other sites
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 :)

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!