Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

dax.

Frischling

  • »dax.« ist der Autor dieses Themas

Beiträge: 24

Beruf: Mathematiker (Student)

  • Private Nachricht senden

1

17.07.2007, 01:58

Plugin System

Ich brauch da mal eure Hilfe.

Ich überlege mir gerade wie ein gutes Plugin System für Anwendungsprogramme, insbesondere aber Spieleengines auszusehen hat.

- Hat jemand von euch einen Vorschlag oder Links zu dem Thema ?

Also opitmal ist es sicherlich total abstrakte Klassen als Interfaces zu verwenden und die Implementation sorgfälltig von diesen zu trennen.

Nun stellen sich mir aber einige frage.

- Was ist eine gute Methode um RTTI zur Verfügung zu stellen?
+ mein ansatz: eine Struktur in das Interface einbinden mit statischen Memberfunktion.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
struct iTest
{
    struct RTTI
    {
        static std::string GetInterfaceName() const { return "iTest"; }
        static unsigned int GetInterfaceVersion() const { return CONSTRUCT_VERSION(1,0); }
    };

    // member function, blablabla


}; // iTest


In der Fabrik dann methoden zur Verfügung stellen die zurückgeben, für welches Interface (name, version) die implementation erstellt wurde, dann vergleichen.

Angenommen alle Fabriken befinden sich in einem Container. Diese Fabriken haben alle eine eindeutige ID zugeordnet. Nun ist das suchen einer Fabrik aus diesem Container zeitaufwendig, wenn die ID ein string object ist. Ein Ansatz wäre es einen String auf eine Zahl abzubilden (dieses Verfahren soll für einen String immer die gleiche Zahl ergben.) und (IDs der Fabriken sind dann eben diese Zahlen) zu suchen, das wäre schon um einiges schneller. Aber da ergibt sich wiederum ein Problem: Man muss dann bevor man nach einer Fabrik sucht einen string in eine Zahl konvertieren, sich diese Zahl merken ebenso wie die Relation der Zahl mit dem String. Also wiederum recht aufwendig und fehleranfällig (dafür schnell).
- Es gibt sicher eine besser Möglichtkeit, nur welche ?
>> blub <<

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

17.07.2007, 07:43

Sagmal, hast du nen Rechner von vor 10 Jahren? Oder verwendest du Fabriklisten mit 500.000 Einträgen? Du fängst an zu optimieren wo noch garkein bedarf ist zu optimieren und das ist Unsinn. Schnapp dir ein Hashtable und registier deine Objekte per Name darin. Das Suchen über Schlüssel geht damit relativ schnell und du kannst sogar per Name auf die Einträge zugreifen.
@D13_Dreinig

Anonymous

unregistriert

3

17.07.2007, 09:27

@ David_db

Es gibt sogar viele Firmen die arbeiten noch mit Fortran, inbesondere in maschineller Steuerung. Und die fangen erst so langsam an auf neue Hardware umzustellen, nicht weil es Probleme gibt, sonder weil die Fortran Profis alle so langsam in Rente gehen.

Die alte Hardware hat nur Vorteile, sie ist robust, ausgereift und wo kein MultimediaPipiFax OS läuft stürzt auch keins ab.

cu

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

17.07.2007, 09:29

Zum einen ist es in Hobbyprogrammiererkreisen egtl nicht üblich alte Hardware zu verwenden (da lebt eher die Meinung "ich brauch das allerneueste") und zum anderen dürften selbst besagte Firmen keine Hardware von 1980 besitzen.
@D13_Dreinig

Anonymous

unregistriert

5

17.07.2007, 09:43

Du hast soeben Millionen von Retro Fans denn Krieg erklärt. :D Nein im Ernst, ich hatte mich oben verlesen und dachte es würde sich um Firmen Hardware handeln. Und da habe ich schon einiges gesehen, war nicht 1980, aber so 89-91 ist durchaus noch anzutreffen.

cu

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

17.07.2007, 09:53

Hehe! ;) Ja, mit Alterspanne hast du sicherlich recht. Aber ich vermute mal das dax. neuere Hardware besitzt. :)
@D13_Dreinig

dax.

Frischling

  • »dax.« ist der Autor dieses Themas

Beiträge: 24

Beruf: Mathematiker (Student)

  • Private Nachricht senden

7

17.07.2007, 13:46

Zitat von »"David_pb"«

Sagmal, hast du nen Rechner von vor 10 Jahren? Oder verwendest du Fabriklisten mit 500.000 Einträgen? Du fängst an zu optimieren wo noch garkein bedarf ist zu optimieren und das ist Unsinn. Schnapp dir ein Hashtable und registier deine Objekte per Name darin. Das Suchen über Schlüssel geht damit relativ schnell und du kannst sogar per Name auf die Einträge zugreifen.


Hab sogar noch nen Atari .. irgendwo :)
Mir ist nur nach dem profiling aufgefallen, dass das suchen am meisten resourcen verbraucht. Hab das aber mittlerweile gelöst. trotzdem würde ich noch gerne einige pluginsysteme mal durchsehen. Kann einer nen guten link empfehlen ?
>> blub <<

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

8

17.07.2007, 15:16

kann ja mal kurz vorstellen wie ich mein pluginsystem gestaltet habe. es ist mit sicherheit auch nicht das beste, aber es funzt gut uns zuverlässlich.

ich habe eine abstrakte klasse. die klasse bestizt 4 methoden
:arrow: Load()
:arrow: Release()
:arrow: GetPlugin()
:arrow: GetPluginType()

alle anderen klassen erben nun von dem ding. jede klasse definiert die methoden eben anders. der sinn von abstrakten klassen eben....

dann gibt es noch einen manager, der eine list mit den plugins insich hat. wenn er initialisiert wird, durchsucht er die angegebenen ordner auf plugins, versucht sie zu laden und wenn der plugin type bekannt ist, packt er sie in die liste.
jetzt muss man nur noch das plugin raussuchen, casten, und verwenden.

evtl hilft es dir, evtl auch nicht...
bei interesse sende ich dir auch den code per mail ;)

dax.

Frischling

  • »dax.« ist der Autor dieses Themas

Beiträge: 24

Beruf: Mathematiker (Student)

  • Private Nachricht senden

9

17.07.2007, 16:46

Danke BlackSnake,

Mein Problem liegt eher in der optimierung des Systems. Es muss auch auf Minimalumgebungen laufen, d.h. wenig Speicherverbrauch und wenig CPU auslastung erfordern, weiter so Anwendungsfreundlich wie möglich sein. Naja, ist nur noch Feintuning, atm verbraucht das System für 100 Implementation ca. 5kb an Systemresourcen (in seiner Minimalkonfiguration, d.h. ohne inter-process oder network communications, multithreading, marshalling, etc.). Glaub auch kaum dass da noch mehr drinn ist, ohne die Benutzerfreundlichkeit einzuschrenken. Hab diese idee aufgeschnapt:

sei iTest ein interface.

C-/C++-Quelltext

1
2
3
#define _MAP_iTest // wird mit dem interface definiert


#define MAP( iface ) _MAP_ ## iface


Dann mittels einem Precompilerschritt bekommt man folgendes Ergebnis.

C-/C++-Quelltext

1
2
3
#define _MAP_iTest    2342341

#define MAP( iface ) _MAP_ ## iface

Das wird dann kompiliert.

Wenn man jetzt ne Implementation braucht geht man so vor.

C-/C++-Quelltext

1
2
3
4
iTest *bla = New ( iTest ); // das macht der anwender (New = macro)


// etwas genauer:

iTest *bla = static_cast<iTest *> ( factoryManager->New( MAP(iTest), iTest::Traits::GetVersion() ));


Also anstelle von

C-/C++-Quelltext

1
2
3
4
5
iTest *bla = static_cast<iTest *> ( factoryManager->New( iTest::Traits::GetName() , iTest::Traits::GetVersion() )); // so hatte ich das mal


// einfach


iTest *bla = static_cast<iTest *> ( factoryManager->New( MAP(iTest), iTest::Traits::GetVersion() ));


So ist es möglich, schnell nach der Fabrik zu suchen denn "iTest" wird einfach auf eine eindeutige Zahl abgebildet (ohne CPU oder RAM in Anspruch zu nehmen). Dies hat natürlich wiederum einige Nachteile. Naja bin noch am Evaluieren.
>> blub <<

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

10

17.07.2007, 17:08

auf was für ein system soll das denn später mal laufen. weil soviel zieht so ein einfaches pluginsystem nicht. wenn du es allerdings auf einem gameboy kaufen lassen willst, wo der speicher stark begrenzt ist, wäre das ne andere sache ;)

Werbeanzeige