[ BinaryRuler @ 22.08.2007. 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.
[ yaelo @ 22.08.2007. 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.
[ Buffy @ 22.08.2007. 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!
[ BinaryRuler @ 22.08.2007. 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
[ MadHouseRock @ 23.08.2007. 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.
[ BinaryRuler @ 23.08.2007. 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?
[ BinaryRuler @ 23.08.2007. 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
}
[ Buffy @ 23.08.2007. 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!
[ BinaryRuler @ 23.08.2007. 20:50 ] @
Ako je tako dajte neko elegantno resenje.

Pozdrav
[ Buffy @ 23.08.2007. 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