Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Zasto se na jednoj masini 3d objekat brzo rotira, a na drguj normalmo? (OpenGL)

[es] :: 3D programiranje :: Zasto se na jednoj masini 3d objekat brzo rotira, a na drguj normalmo? (OpenGL)

[ Pregleda: 1144 | Odgovora: 9 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

SkyDiverX

Član broj: 73518
Poruke: 114
89.216.248.*



Profil

icon Zasto se na jednoj masini 3d objekat brzo rotira, a na drguj normalmo? (OpenGL)22.08.2007. u 21:09

Skinuo sam neke primere sa http://nehe.gamedev.net/ sajta za Dev-C++. Primeri koji imaju neko kretanje objekta pri pokretanju na jednoj masini (RAM: 1GB, nVidia GeForce 6100 i Sempron64 3000+) normalno se krecu (rotiraju), ali kada taj isti exe prebacim na drugu masinu (RAM 512 MB, ATI 9200, Athlon 900 MHz) kretanje objekata je prilicno brzo. Interesuje me razlog zasto se to desava i kako ako je moguce to da eliminisem da radi na svim masinama isto.
Source sam kompajlirao na Sempronu.
Evo jednog primera kod koga se pomenuta pojava desava http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=06
rotiranje kocke sa nalepljenom teksturom.
22.08.2007. u 21:09 

yaelo
Rajko Vojnovic
beograd

Član broj: 78087
Poruke: 92
*.smin.sezampro.yu.



Profil

icon Re: Zasto se na jednoj masini 3d objekat brzo rotira, a na drguj normalmo? (OpenGL)22.08.2007. u 22:37
Verovatno je na mašini sa bržom rotacijom isključena sinhronizacija izmedju izmedju renderovanja i brzine osvežavanja monitora - disable vertical sync.
Za DirectX (ne poznajem OpenGL) d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; U pitanju je brzina prebacivanja sadržaja back bafera u front. To se često isključuje na slabijim mašinama.
22.08.2007. u 22:37 

Buffy
Stanko Culaja
za sada sam nezaposlen!
Sipovo,Republika Srpska

Član broj: 45310
Poruke: 305
*.teol.net.

Sajt: www.sipovo.org


Profil

icon Re: Zasto se na jednoj masini 3d objekat brzo rotira, a na drguj normalmo? (OpenGL)22.08.2007. u 22:38
Razlog lezi u tome sto neka graficka kartica brze izrenderuje scenu od druge kartice.
Ako postavis timere na odredjen interval( npr. 0.01 sec) i da u tom intervalu mjenjas koordinate tijela, onda ce ti efekat biti isti na oba racunara( jedino ako gpu izvrsi renderovanje scene za vise vremena od datog intervala).
Tako sam ja radio, mada, vjerovatno postoji dosta bolji nacini za rijesavanje tog problema, jer sam se samo malo bavio 3d grafikom.
Pozdrav!

SAMO DA RATA NE BUDE,
LUDILA MEDJU LJUDIMA,
VELIKI NUDE ZABLUDE,
PLASE NAS RAZNIM CUDIMA
I SVAKOJ BAJCI NAUDE,
DA RATA NE BUDE.

Djordje Balasevic
22.08.2007. u 22:38 

SkyDiverX

Član broj: 73518
Poruke: 114
89.216.248.*



Profil

icon Re: Zasto se na jednoj masini 3d objekat brzo rotira, a na drguj normalmo? (OpenGL)22.08.2007. u 23:35
OK hvala na odgovorima. Ali da li neko moze da mi kaze kako konkretno to da resim npr. na primeru za koji sam dao link?
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=06
22.08.2007. u 23:35 

MadHouseRock

Član broj: 154937
Poruke: 7
*.bvcom.net.



Profil

icon Re: Zasto se na jednoj masini 3d objekat brzo rotira, a na drguj normalmo? (OpenGL)23.08.2007. u 01:16
Na vrh posle fullscreen = TRUE dodaj:
Code:

unsigned long gStartTime = 0;
unsigned long gLastTime = 0;

float GetElapsedSeconds()
{
    unsigned long currentTime = GetTickCount() - gStartTime;
    unsigned long elapsedTime = currentTime - gLastTime;
    gLastTime = currentTime;
    return (float)(elapsedTime/1000.0f);
}

U initGL():
Code:

gStartTime = GetTickCount();

Na vrh DrawGlScene():
Code:

float timeInSec = GetElapsedSeconds();

i u istoj f promeni:
Code:

xrot+=80.0f * timeInSec;
yrot+=90.0f * timeInSec;
zrot+=100.0f * timeInSec;

Ovo je najjednostavnije sto sam trenutno mogao da smislim, vreme nije bas precizno ali trebalo bi da radi.
23.08.2007. u 01:16 

SkyDiverX

Član broj: 73518
Poruke: 114
89.216.248.*



Profil

icon Re: Zasto se na jednoj masini 3d objekat brzo rotira, a na drguj normalmo? (OpenGL)23.08.2007. u 11:58
Hoce malo da secka ali resava problem. Hvala.
A da li moze problem da se resi preko nekih parametara za device ili tako nesto?
23.08.2007. u 11:58 

SkyDiverX

Član broj: 73518
Poruke: 114
89.216.248.*



Profil

icon Re: Zasto se na jednoj masini 3d objekat brzo rotira, a na drguj normalmo? (OpenGL)23.08.2007. u 13:05
Hvala na trudu svima. Dosao sam do vrlo elegantnog resenja sa jednom linijom koda.
Evo kako, u win apiju u glavnoj while petlji sam dodao samo Sleep(1) i resio problem.

Code:

int WINAPI WinMain(    HINSTANCE    hInstance,            // Instance
                    HINSTANCE    hPrevInstance,        // Previous Instance
                    LPSTR        lpCmdLine,            // Command Line Parameters
                    int            nCmdShow)            // Window Show State
{
    MSG        msg;                                    // Windows Message Structure
    BOOL    done=FALSE;                                // Bool Variable To Exit Loop

    // Ask The User Which Screen Mode They Prefer
    if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)
    {
        fullscreen=FALSE;                            // Windowed Mode
    }

    // Create Our OpenGL Window
    if (!CreateGLWindow("NeHe's Texture Mapping Tutorial",640,480,16,fullscreen))
    {
        return 0;                                    // Quit If Window Was Not Created
    }

    while(!done)                                    // Loop That Runs While done=FALSE
    {
        if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))    // Is There A Message Waiting?
        {
            if (msg.message==WM_QUIT)                // Have We Received A Quit Message?
            {
                done=TRUE;                            // If So done=TRUE
            }
            else                                    // If Not, Deal With Window Messages
            {
                TranslateMessage(&msg);                // Translate The Message
                DispatchMessage(&msg);                // Dispatch The Message
            }
        }
        else                                        // If There Are No Messages
        {
            // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
            if ((active && !DrawGLScene()) || keys[VK_ESCAPE])    // Active?  Was There A Quit Received?
            {
                done=TRUE;                            // ESC or DrawGLScene Signalled A Quit
            }
            else                                    // Not Time To Quit, Update Screen
            {
                SwapBuffers(hDC);                    // Swap Buffers (Double Buffering)
            }

            if (keys[VK_F1])                        // Is F1 Being Pressed?
            {
                keys[VK_F1]=FALSE;                    // If So Make Key FALSE
                KillGLWindow();                        // Kill Our Current Window
                fullscreen=!fullscreen;                // Toggle Fullscreen / Windowed Mode
                // Recreate Our OpenGL Window
                if (!CreateGLWindow("NeHe's Texture Mapping Tutorial",640,480,16,fullscreen))
                {
                    return 0;                        // Quit If Window Was Not Created
                }
            }
        }
        Sleep (1); //Evo ga tu je resenje.
    }

    // Shutdown
    KillGLWindow();                                    // Kill The Window
    return (msg.wParam);                            // Exit The Program
}
23.08.2007. u 13:05 

Buffy
Stanko Culaja
za sada sam nezaposlen!
Sipovo,Republika Srpska

Član broj: 45310
Poruke: 305
*.teol.net.

Sajt: www.sipovo.org


Profil

icon Re: Zasto se na jednoj masini 3d objekat brzo rotira, a na drguj normalmo? (OpenGL)23.08.2007. u 17:29
Ja ne bih koristio Sleep funkciju, jer ona suspenduje trenutni thread, odnosno za to vrijeme tvoja aplikacija ne radi nista.
Dakle, gubis dosta vremena, koje bi mogao potrositi na nesto korisnije!
Sleep pali na manjim projektima, ali kad se radi o glomaznim kalkulacijama, onda ne pije vodu.
Pozdrav!
SAMO DA RATA NE BUDE,
LUDILA MEDJU LJUDIMA,
VELIKI NUDE ZABLUDE,
PLASE NAS RAZNIM CUDIMA
I SVAKOJ BAJCI NAUDE,
DA RATA NE BUDE.

Djordje Balasevic
23.08.2007. u 17:29 

SkyDiverX

Član broj: 73518
Poruke: 114
89.216.248.*



Profil

icon Re: Zasto se na jednoj masini 3d objekat brzo rotira, a na drguj normalmo? (OpenGL)23.08.2007. u 20:50
Ako je tako dajte neko elegantno resenje.

Pozdrav
23.08.2007. u 20:50 

Buffy
Stanko Culaja
za sada sam nezaposlen!
Sipovo,Republika Srpska

Član broj: 45310
Poruke: 305
*.teol.net.

Sajt: www.sipovo.org


Profil

icon Re: Zasto se na jednoj masini 3d objekat brzo rotira, a na drguj normalmo? (OpenGL)23.08.2007. u 22:46
pa, evo neki najlaksi primjer:
napravis novi thread pomocu CreateThread funkcije( http://msdn2.microsoft.com/en-us/library/ms682453.aspx )
i u Thread funkciji neka ima Sleep funkcija:
Code:

void thread_func(void *data){
   Sleep(1);//
   //ovjde postavljas zeljene transformacije:
   x+=0.001;
   y+=0.001;
   //itd...
}

Samo da jos kazem, thread predstavlja nit u jednom procesu. Dakle svaki proces moze da ima jednu( glavnu) ili vise niti.
Te niti se paralelno izvrsavaju.
U ovom primjeru, ti ces imati dvije niti:
1) glavnu - koja pocinje sa funkcijom main()
2) druga- koju si krirao pomocu CreateThread() i koja pocinje u funkciji thread_func().

p.s. Creating Threads - http://msdn2.microsoft.com/en-us/library/ms682516.aspx
SAMO DA RATA NE BUDE,
LUDILA MEDJU LJUDIMA,
VELIKI NUDE ZABLUDE,
PLASE NAS RAZNIM CUDIMA
I SVAKOJ BAJCI NAUDE,
DA RATA NE BUDE.

Djordje Balasevic
23.08.2007. u 22:46 

[es] :: 3D programiranje :: Zasto se na jednoj masini 3d objekat brzo rotira, a na drguj normalmo? (OpenGL)

[ Pregleda: 1144 | Odgovora: 9 ]

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.