Vzdycky jsem si myslel, ze pouzivat v OpenGL display listy mou aplickaci urychli... Noo tedy: desne se mi to sekalo a ja nevedel proc.. az me napadla genialni myslenka, ze je to prave temi display listy.. On to byl, presneji receno, 1 dspl list, jednoducha sit, vypilovaval jsem ovladani (mozna zbytecnost ale ja mam rad prehlednost a zavolat 1 funkci je rozhodne prehlednejsi nez cpat tam cyklus; navic jeste prave kvuli me domence o vyssi rychlosti).. Proste jsem to zkusil nacmarat "standartne" a hle, uz se neseka.. Ale proc to sem pisu: Prvni veta je opravdu jen ma domenka, ci to opravdu aplikaci urychli a proc se tedy v tomto pripade tak nestalo; naopak to preslo do jineho extremu???
Fórum › C / C++
Display lists
To Zelenáč: V display listech jde o to, že místo toho, aby se OGL příkazy každý frame překládaly z high-level jazyka, který užívá programátor do low-level jazyka, kterému rozumí hradware grafické karty, celý ten set příkazů se přeloží jednou a uloží se jako display list, který je pak vždy poslán do GK bez potřeby kompilace. Například při vykreslování modelu se každý frame musí překompilovat glVertex3f() ... třeba 10 000, při použití build listu se zkompiluje jenom jednou při inicializaci. Nejefektivnější jsou buildListy právě při vykreslování objektů zkombinovaném se změnami stavu (vypínání/zapínání světel, zapínání textur atd) ty totiž vetšinou žerou nejvíc času.
To jak jsou efektivní, ale záleží hlavně na grafické kartě a na tom jak je připravena s nima pracovat a nutno podotknout, že sem tam na ně výrobci dost kašlou.
I když to, že by se to vyloženě zpomalilo se mi nezdá.
Hoď sem schválně ten kód ...
#include <gl.h>
#include <glu.h>
#include <SDL.h>
#include <iostream>
#include <math.h>
/*******************************************************************************
* globální proměnné
*******************************************************************************/
const char TITLE[] = "dom"; // titulek
const int WIDTH = 1024; // šířka
const int HEIGHT = 756; // výška
const float piover180 = 0.0174532925; // stupně na radiány
float xrot = 40.0; // rotace
float yrot;
float zrot;
float zpos = 20.0; // pozice
Uint8 *keys; // klávesnice
bool left_b = false; // levé tlačítko
bool right_b = false; // pravé tlačítko
typedef struct tagCURSOR
{
float x, y;
} CURSOR;
CURSOR pos;
CURSOR prv;
uint sit;
/*******************************************************************************
* funkce
*******************************************************************************/
void build();
void control(); // ovládání
void init(int width, int height); // inicializace OpenGL
void draw_scene(); // vykreslování
//----------------------------------------------------------------------------//
void build()
{
sit = glGenLists(1);
glBeginList(sit, GL_COMPILE);
float size = 10.0;
glTranslatef(-(10*size), 0.0, -(10*size));
for(int x=0; x < 20; x++){
for(int z=0; z < 20; z++){
glBegin(GL_QUADS);
glVertex3f( x*(size)+size, 0.0, z*(size)+size);
glVertex3f( x*(size)+size, 0.0, z*(size));
glVertex3f( x*(size), 0.0, z*(size));
glVertex3f( x*(size), 0.0, z*(size)+size);
glEnd();
}
}
glEndList();
}
void control() // ovládání
{
if(right_b){ // kamera
yrot += pos.x - prv.x;
xrot += pos.y - prv.y;
prv.x = pos.x;
prv.y = pos.y;
}
if(keys[SDLK_ESCAPE]) // escape
{
SDL_Quit();
exit(0);
}
}
void init(int width, int height) // inicializace OpenGL
{
build();
glViewport(0, 0, width, height); // viewport
glClearColor( 1.0, 1.0, 1.0, 0.5); // pozadí
glClearDepth(1.0);
glDepthFunc(GL_LEQUAL); // hloubkové testování
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); // reset
gluPerspective(45.0,(GLfloat)width/(GLfloat)height,0.1,1000.0); // perspektiva
glMatrixMode(GL_MODELVIEW);
}
void draw_scene() // vykreslování
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glPolygonMode(GL_BACK, GL_LINE); // sit
glPolygonMode(GL_FRONT, GL_LINE);
glColor3f(0.6, 0.6, 0.6);
glCallList(sit);
SDL_GL_SwapBuffers(); // prohození bufferů
}
/*******************************************************************************
* main
*******************************************************************************/
int main(int argc, char ** argv)
{
bool done = false;
SDL_Event event;
if (SDL_Init(SDL_INIT_VIDEO) < 0) // inicializace SDL
{
SDL_Quit();
exit(1);
}
if (SDL_SetVideoMode(WIDTH, HEIGHT, 0, SDL_OPENGL) == NULL) // vytvoření okna
{
SDL_Quit();
exit(2);
}
SDL_WM_SetCaption(TITLE, NULL); // titulek okna
SDL_ShowCursor(true); // zobrazení kurzoru
init(WIDTH, HEIGHT); // inicializace OpenGL
while(!done)
{
draw_scene(); // vykreslení scény
keys = SDL_GetKeyState(NULL); // stisknuté klávesy
while (SDL_PollEvent(&event)) // události
{
switch(event.type){
case SDL_QUIT: // požadavek na ukončení
{
done = 1;
break;
}
case SDL_MOUSEBUTTONDOWN: // stisknuto tlačítko myši
{
if(event.button.button == SDL_BUTTON_LEFT){ // levé tlačítko
left_b = true;
}
if(event.button.button == SDL_BUTTON_RIGHT){ // pravé tlačítko
right_b = true;
prv.x = event.motion.x;
prv.y = event.motion.y;
}
if(event.button.button == SDL_BUTTON_WHEELUP){
zpos -= 3.0;
}
if(event.button.button == SDL_BUTTON_WHEELDOWN){
zpos += 3.0;
}
break;
}
case SDL_MOUSEBUTTONUP: // uvolněno tlačítko myši
{
if(event.button.button == SDL_BUTTON_LEFT){ // levé tlačítko
left_b = false;
}
if(event.button.button == SDL_BUTTON_RIGHT){ // pravé tlačítko
right_b = false;
}
break;
}
case SDL_MOUSEMOTION: // pohyb myši
{
pos.x = event.motion.x;
pos.y = event.motion.y;
break;
}
}
}
control(); // ovládání
}
SDL_Quit();
return 0;
}
n me to taky pripada v poradku, takze jsem se pekne potrapil... konec koncu ta aplikace bude vykreslovat jen tuhle sit a par (asi 1000 :-) kosticek, takze by to melo byt v pohode i bez display listu..
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Display + slideUp/Down — založil ForestCZE
.style.display = 'none' — založil doublem
Display z notebooku k PC — založil Míša
Display S65 versus ATMEGA32 — založil Delta4
Probme s Display Listami(OGL) — založil eraser17
Moderátoři diskuze