Display lists – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Display lists – C / C++ – Fórum – Programujte.comDisplay lists – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
20. 2. 2007   #1
-
0
-

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???

Nahlásit jako SPAM
IP: ...–
Reklama
Reklama
ppavelP0
Newbie
22. 2. 2007   #2
-
0
-

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 ...

Nahlásit jako SPAM
IP: ...–
22. 2. 2007   #3
-
0
-



#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;
}

Nahlásit jako SPAM
IP: ...–
ppavelP0
Newbie
22. 2. 2007   #4
-
0
-

Mě to připadá v pořádku. Zkoušel jsem to a při vykreslení s display listem mam 684fps a bez něj 658fps takže je vidět, že to displayList opravdu urychluje. Zkus nainstalovat novější ovladače GK ...

Nahlásit jako SPAM
IP: ...–
22. 2. 2007   #5
-
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..

Nahlásit jako SPAM
IP: ...–
eMan0
Stálý člen
24. 2. 2007   #6
-
0
-

jo jo DL se uz stejne vetsinou nepouzivaji, misto tech je lepsi zvolit VA nebo kdyz uz VBO (Vertex Buffer Object).

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 94 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý