Delphi forms vs saját win32 ablak
2006-09-28T20:40:10+02:00
2006-10-30T01:06:57+01:00
2022-07-26T14:03:46+02:00
  • De hogy a feltett kérdésre is legyen még egy vélemény:
    Szerintem használj api-t, és saját ablakot a form helyett, mert abban tényleg sok olyan általános kód van, ami kifejezetten a felhasználói alkalmazások fejlesztéséhez lett optimalizálva. Ha magad hozod létre az ablakot, és magad kezelsz le mindent, akkor még nagyobb sebességet érhetsz el, és az exe-méret sem több száz kB-nál fog kezdődni, hanem csak kb. 15-16 kB-nál.
    Mutasd a teljes hozzászólást!
  • Éppen ellenkezőleg. Az a halál...
    Egyrészt, akad benne némi bug, másrészt, OpenGL-ben az van megcsinálva, amit magad megcsinálsz. Az OpenGL fejlesztők felé nyújtott szolgáltatásai már éppen eléggé fejlesztőbarátok, hogy ne glscene-ezzen az ember. Az az ovisfejlesztőknek való, akik képtelenek felfogni a 3D grafika matematikai hátterét, és maguk leprogramozni a dolgokat.
    Mutasd a teljes hozzászólást!
  • GLScenet probaltad mar ?
    Sokat tud es sok problematol megkimel.
    Mutasd a teljes hozzászólást!
  • Lehet, hogy azon a gépen nem támogatott az az extension...

    Ne a beépített OpenGL.pas-t használd, hanem dGLOpenGL-t. Ez 1.5-ös OpenGL, és egyszerüsíti az életet. pl: nem kell glGetString(GL_EXTENSIONS) és ebből kiszedni, ami kell neked, hanem van erre függvény.
    Delphi Form-okkal is kitudod használni a procit 100%-on, de szerintem is lassabb egy kicsit, mintha winapi függvényeket hívogatnál. Vagy akár írd a programokat c-ben, sdl-el, és akkor már elég sok platformon menni fog, kevés módosítással.
    Delphi Form & OpenGL:
    Kidobsz a form-ra egy ApplicationEvents-et, és OnIdle-t lásd lejjebb.
    uses Windows, ..., dglOpenGL; //... type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private h_wnd: HWND; h_dc: HDC; h_glrc: HGLRC; { Private declarations } public { Public declarations } end; //... procedure TForm1.FormCreate(Sender: TObject); begin h_wnd:=Handle; h_dc:=GetDC(h_wnd); InitOpenGL; h_glrc:=CreateRenderingContext(h_dc, [opDoubleBuffered], 24, 24, 0, 0, 0, 0); ActivateRenderingContext(h_dc, h_glrc); ReadExtensions; ReadImplementationProperties; // beállítod az OpenGL-t, textúrákat töltesz end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin DeactivateRenderingContext; DestroyRenderingContext(h_glrc); end; procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean); begin Done:=False; { Write an OnIdle event handler to perform special processing when an application is idle. An application is idle when it is not processing code. For example, an application is idle when it is waiting for input from the user. OnIdle is called only once, as the application transitions into an idle state. It is not called continuously unless Done is set to false. Applications that set Done to false consume an inordinate amount of CPU time, which affects overall system performance. } //itt renderelsz //figyelj 2 frame között eltelt időre, és az alapján számold az animációt, hogy különböző fps-ekkel is hasonló legyen //glGetTickCount() - ez nem annyira pontos //vagy //QueryPerformanceTimer-ekkel end;
    Itt vannak jó dolgok kifejezetten Delphi & OpenGL-hez.
    Mutasd a teljes hozzászólást!
  • Azért nem árt egy sleep-et elhelyezni, mert külömben a processor 100%-on fut.
    Az a szörnyű, hogy amint van egy TTimer a Form-on, akkor is 100%.

    sleep( max(1, (1000/FPS) - rendertime) );

    FPS: kívánt frissítési sebesség
    rendertime: az a fránya renderidő
    Mutasd a teljes hozzászólást!
  • Köszi mindenkinek.
    Olyat esetleg senki nem tapasztalt, hogy a programja egyes gépeken extensionok használatakor "access violation at address 00000000"-val elszáll? Vagyis egyes gépeken a wglgetprocaddress mintha ott sem lenne..

    Már elegem van számtek tanáromnak nem tudom megmutatni mit csináltam, az meg azt sem tudja miröl van szo
    Mutasd a teljes hozzászólást!
  • Hi

    A formos módszer azért nem ajánlott ilyen esetben, mert
    1. Túlkomikált osztályhierarhia lelassítja a programot,
    2. Általában fullscrennes OpenGL programban nincs szükség gombokra, meg listákra, editre, stb.. (Ha meg igen, akkor ott az Api rá, amivel 1 sor gombot csinálni)

    Szóval mindenkinek melegen ajánlom a Fálj/Új/Console Application menüpontot..

    Kellemes délutánt
    CollerbladE
    Mutasd a teljes hozzászólást!
  • Én (lehet, hogy túl sötét vagyok) csak timerrel tudtam eddig megoldani a renderelést


    Az Application.OnIdle eseményt is használhattad / kipróbálhattad volna. Pont erre való!!! (ez az ami fut, ha semmi más eseménykezelő nem megy éppen a programban)
    Mutasd a teljes hozzászólást!
  • Jeeah működik! Bár Invalidate nem kellett..
    Most ezzel kb ugyanazt értem el, mint ha

    while not terminated do begin PeekMessag... TranslateMessage(..); DispatchMessage(..); end else Render,Update;

    tehát mintha egy WNDCLASS-szal létrehozott ablakkal dolgoznék? Vagy azért megéri megcsinálni a c++ féle win32 ablakot?

    (rekord! nem birom abbahagyni a kérdezgetést dehát annyi minden sötét még előttem...)

    [ASZTAAAAAAAA :D:D:D 0 trianglelal 609 FPS :D:D:D URISTEN!! :D:D:D KIRÁLY EZ NAP :D:D Eddig cask 64 volt KÖSZÖNÖÖMM!!!!]
    Mutasd a teljes hozzászólást!
  • Ja, boccss.. nem..
    Már megcsináltam az ablakot
    De ezt holnap 100 hogy kiprobalom, kösz!
    Kérdés halmaz tetején (talán utolso kerdésem lenne): nem mennek az extensionok!! formosan nekem még mentek (wglgetprocaddress.. blabla) de sulis gépeken már nem, most pedig form nélkül már nekem sem! és nemtudom mit csináljak!!

    var wglSwapIntervalEXT: function(interval: GLint): Integer; stdcall = nil; begin wglSwapIntervalEXT := wglGetProcAddress('wglSwapIntervalEXT');
    Mutasd a teljes hozzászólást!
  • Remélem nem sértettem meg önérzetedet, bár úgy látom, igen

    Én olyasmire gondoltam, hogy pl a program így nézne ki:

    begin Application.CreateForm(amit, akarsz); {Application.Run; Helyett!} while(ki_nem_lepnek) begin Application.ProcessMessages(); Engine frissites FoForm.Invalidate(); end; end.

    Bocs a vacak kódért, de már elfelejtettem a pascalt Szóval, ez nem működne?
    Mutasd a teljes hozzászólást!
  • Inkább csinálok egy ablakot...

    (Egyébként.. A lumabytenál van nagyobb? )
    Mutasd a teljes hozzászólást!
  • Hali!
    TTimerrel mar az 50 fps is elegge' gázos.

    Szal vagy kulon threa-ba rakd a frissitest, vagy application.onidle-be.

    Mind2 modszer 100% cpu-t fog zabalni, de ha ez a gond, akkor marad a timer, vagy a sleep ;) (ja, akkor meg kevesebb az fps?! :]]]])

    Idot (marmint relativ idot) pedig 18 fps-nel pontosabban a queryPerformanceCounter, es queryPerformanceFrequency hivasokkal tudsz lekerni.

    Mutasd a teljes hozzászólást!
  • WglSwapIntervalEXT.
    Ez nekem OFF, illetve user függö.
    Ez egyébként annyit csinál, hogy,ha be van kapcsolva, akkor figyeli a vertikális visszafutást, ha ki, akkor meg nem, nem?
    Mutasd a teljes hozzászólást!
  • Egyébként a monitor frissítési frekvenciájának nem sok köze van az fpshez...


    Ha be van kapcsolva a V-sync(glSwapIntervalEXT fv, ha jól emlékszem), akkor van köze, egyébként nincs.
    Mutasd a teljes hozzászólást!
  • Hé, ez kicsit mellément, ennél már többre vagyok, mindössze csak form-os alapon..
    Tudom, hogy ugy szokták, de formon nem tudom ugy megoldani, hogy folyamatosan fut egy ciklus...
    Mutasd a teljes hozzászólást!
  • Itt van egy csomó tutorial, delphire is: nehe.
    Mutasd a teljes hozzászólást!
  • Itt nem erről van szó, hanem egyszerűen a timernek túl kicsi a felbontása, de nem is erre a célra találták ki. Úgy szokták megoldani, hogy folyamatosan futtatnak egy ciklust, ami kirajzol egy képkockát és utána (vagy előtte ) feldolgozza a közben érkezett üzeneteket.

    Ezt delphiben is meg lehet csinálni, bár tőlem ne várj kódot, nagyon régen dolgoztam delfiben, de google biztos kidob egy csomó példát.

    Egyébként a monitor frissítési frekvenciájának nem sok köze van az fpshez...
    Mutasd a teljes hozzászólást!
  • Segítenél azt hogy kell? :]
    Mutasd a teljes hozzászólást!
  • A 64 fps szvsz a frissítési frekvenciája a monitornak, valamelyik gl init param állítja ezt át szerintem ( Dx-ben tudom mi ez, gl-ben nem), viszont ez csak fullscreen-ben működik, ha jól tudom ablakos módban fix frissítési frekvencián megy! A timer tényleg nem kéne, használj ApplicationEvent-et, és minden eseménynél renderelj!
    Mutasd a teljes hozzászólást!
  • Sziasztok! Ha Delphi Form-okat használok 100% hogy lassabb lesz a programom? Gondolok itt pl. OpenGL-re. Én (lehet, hogy túl sötét vagyok) csak timerrel tudtam eddig megoldani a renderelést, de (szerintem ezért) eddig nem tudtam 64 FPS főlé menni. Még úgysem, ha 1 Triangle volt kirajzolva.
    "Sima" Win32 ablakkal, pedig általában nem használnak timer-t (amit eddig láttam, nem sok volt benne), így a gép nem 1 MS-onként renderel, hanem amilyen gyorsan csak tud, tehát sztem a timer aprót visszafogja.

    (Ja esetleg tud vki tippet adni, hogy delphi formos formában, hogy tudnám ezt kiküszöbölni?)
    Mutasd a teljes hozzászólást!
abcd