Und was ist der Unterschied ?Sodale, habe mir nen Transpiler gebastelt und nu die SDL2 mal auf dynamisch angefangen zu Portieren
Lädst du jetzt alles mit "LoadLibrary()" und "GetProcAddress()" ?
Und was ist der Unterschied ?Sodale, habe mir nen Transpiler gebastelt und nu die SDL2 mal auf dynamisch angefangen zu Portieren
Eines vor weg, arbeitet man mit "LoadLibrary()" und "GetProcAddress()" dann wird die EXE unnötig aufgebläht, weil jede Funktion geladen wird. Ausser man macht sich die Mühe und lädt nur das was man braucht, was aber sehr aufwändig ist.Kannst du vielleicht später ein Beispielprogramm veröffentlichen, wie man SDL2 dynamisch einbindet,
*g*jammernich hat geschrieben: Mi 20. Nov 2024, 19:35 @corpsman: Das klingt sehr interessant. Kannst du vielleicht später ein Beispielprogramm veröffentlichen, wie man SDL2 dynamisch einbindet, vielleicht einfach ein program das die Initializierung von SDL durchläuf und die Möglichkeit einer verbesserten Fehlerbehandlung demonstriert. Ein "hello world" quasi..![]()
Code: Alles auswählen
{*
* set this define if you want to use runtime loading instead of static linking
* ! Attention !
* Not all functions are "ported" yet, so use is on own risk
* port missing functions.
*}
{$DEFINE SDL_RUNTIME_LOADING} // <-- Dynamisch gelinkt
{.$DEFINE SDL_RUNTIME_LOADING} // <-- Statisch gelinkt
Das amortisiert sich aber sehr schnell, wenn man eben mehr macht, als nur ein Dreieck zu rendern. Und an sich sind die Kosten pro Funktion ein Zeiger, der auch beim statischen importieren vorhanden ist (nur nicht auf dem Heap, sondern im Datenbereich) sowie die Ladefunktionalität.Mathias hat geschrieben: Mi 20. Nov 2024, 19:57Eines vor weg, arbeitet man mit "LoadLibrary()" und "GetProcAddress()" dann wird die EXE unnötig aufgebläht, weil jede Funktion geladen wird. Ausser man macht sich die Mühe und lädt nur das was man braucht, was aber sehr aufwändig ist.Kannst du vielleicht später ein Beispielprogramm veröffentlichen, wie man SDL2 dynamisch einbindet,
Das sieht man sehr gut bei OpenGL 4.6, das wird die EXE sehr gross, auch wen es nur ein einfachen Dreieck rendert.
Ich sehe da nirgends was dynamisches. Müsste da nicht ein GetProcAdress sein ?corpsman hat geschrieben: Do 21. Nov 2024, 07:10 So ich denke ich hab nu alles hochgeladen was ihr braucht um es zu testen
1. Die Demo hier: https://github.com/PascalCorpsman/Examp ... stick_Demo
2. die https://github.com/PascalCorpsman/Examp ... ystick.pas
3. Natürlich die SDL2 Headerfiles https://github.com/PascalCorpsman/SDL2-for-Pascal
Dann könnt ihr über die sdl2_cfg.inc Datei zwischen statisch und dynamisch umschalten:
Code: Alles auswählen
{* * set this define if you want to use runtime loading instead of static linking * ! Attention ! * Not all functions are "ported" yet, so use is on own risk * port missing functions. *} {$DEFINE SDL_RUNTIME_LOADING} // <-- Dynamisch gelinkt {.$DEFINE SDL_RUNTIME_LOADING} // <-- Statisch gelinkt
Da ist es doch: https://github.com/PascalCorpsman/SDL2- ... inking.incMathias hat geschrieben: Do 21. Nov 2024, 23:10Ich sehe da nirgends was dynamisches. Müsste da nicht ein GetProcAdress sein ?corpsman hat geschrieben: Do 21. Nov 2024, 07:10 So ich denke ich hab nu alles hochgeladen was ihr braucht um es zu testen
1. Die Demo hier: https://github.com/PascalCorpsman/Examp ... stick_Demo
2. die https://github.com/PascalCorpsman/Examp ... ystick.pas
3. Natürlich die SDL2 Headerfiles https://github.com/PascalCorpsman/SDL2-for-Pascal
Dann könnt ihr über die sdl2_cfg.inc Datei zwischen statisch und dynamisch umschalten:
Code: Alles auswählen
{* * set this define if you want to use runtime loading instead of static linking * ! Attention ! * Not all functions are "ported" yet, so use is on own risk * port missing functions. *} {$DEFINE SDL_RUNTIME_LOADING} // <-- Dynamisch gelinkt {.$DEFINE SDL_RUNTIME_LOADING} // <-- Statisch gelinkt
Code: Alles auswählen
Procedure TForm1.FormCreate(Sender: TObject);
Var
ver: TSDL_Version;
i: Integer;
Begin
{$IFDEF SDL_RUNTIME_LOADING}
If Not SDL_LoadLib('') Then Begin
ShowMessage('Error, unable to load sdl lib'); // Via Runtime Fehler wenn DLL nicht geladen werden kann.
halt;
End;
{$ENDIF}
Wieso findet man dann die dynamische Bindung fast nirgends ?Das amortisiert sich aber sehr schnell, wenn man eben mehr macht, als nur ein Dreieck zu rendern. Und an sich sind die Kosten pro Funktion ein Zeiger, der auch beim statischen importieren vorhanden ist (nur nicht auf dem Heap, sondern im Datenbereich) sowie die Ladefunktionalität.
Die ganzen Units für die verschiedenen SQL Bibliotheken nutzen dynamisches Laden, da sie mit verschiedenen Versionen klarkommen müssen. Ansonsten hast du eben noch den Runtime Overhead: beim Laden der Anwendung ist das Betriebssystem eh damit beschäftigt Bibliotheken dynamisch zusammen zu linken. Da kommt es auf ein paar mehr oder weniger nicht an. Durch dynamisches Laden zur Laufzeit muss dann die geladenene Bibliothek auch erstmal dynamisch gelinkt werden und dann jede Funktion gefunden werden. Es ist also letztilch ein Austausch zwischen Lade- und Laufzeit.Mathias hat geschrieben: Fr 22. Nov 2024, 17:56Wieso findet man dann die dynamische Bindung fast nirgends ?Das amortisiert sich aber sehr schnell, wenn man eben mehr macht, als nur ein Dreieck zu rendern. Und an sich sind die Kosten pro Funktion ein Zeiger, der auch beim statischen importieren vorhanden ist (nur nicht auf dem Heap, sondern im Datenbereich) sowie die Ladefunktionalität.
Ausser bei modern OpenGL, da geht es kaum anders, vor allem bei Windows.
Die könnte für dich auch eine Lösung sein, das ganze SDL-Zeugs statisch rein zu linken.Naja in der Windows Welt, wo ich die SDL.dll mit liefere macht das ggf. Sinn.
Aber unter Linux wo der User eben irgend eine SDL Lib version installiert hat, kann ich mittels laden zur Laufzeit nur den Funktionsumfang laden den ich brauche, und bin dadurch flexibler. Ist halt geschmackssache.
Code: Alles auswählen
{$linklib SDL2}
Wen du die DLL selbst baust, kannst du eine angepasste abgespeckte *.a bauen, welche nur den Joystick unterstützt.weil ich SDL da ja nur für den Joystick nehme,
Code: Alles auswählen
const
{$IFDEF Linux}
libSDL3 = 'SDL3';
{$ENDIF}
{$IFDEF Windows}
libSDL3 = 'SDL3';
{$ENDIF}
{$IFDEF Darwin}
libSDL3 = 'libSDL3.dylib';
{$ENDIF}