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

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

1

24.06.2012, 15:34

"Skripts" für Spiele in eine DLL kompilieren?

Hallo liebe Community,
Ich habe mir überlegt, wie z.B. bei AntMe! die KI- und anderen Skripts für mein Spiel nicht Parsen zu lassen,
sondern z.B. in C++ o.ä. zu schreiben und dann in eine .DLL zu kompilieren.
Davon würde ich mir eine Leistungssteigerung versprechen.
Stimmt das, bzw. ist das Sinnvoll?
P.S. : Hoffe, es gibt so einen Thread nicht bereits, habe nichts gefunden ;)
MfG, RmbRT
"Dumm ist, wer dummes tut."

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

24.06.2012, 15:55

Warum versprichst du dir daraus eine Leistungssteigerung? Die DLL macht das ganze wenn eher langsamer, weil halt die DLL noch geladen werden muss, bzw Funktionen daraus gestartet werden müssen. Es hätte halt den Vorteil, dass du bestimmte Sachen auslagern und austauschbar machen kannst. Wenn du das möchtest, dann macht das für dich Sinn, ansonsten eher nicht. Umsetzen könntest du das, indem du zum Beispiel bestimmte Klassen in der DLL implementierst, welche in jeder Version der DLL vorhanden sein müssen. Je nach Version der DLL hast du dann halt den anderen Code (das andere Verhalten). Nach außen hin müssen die Klassen halt gleich aussehen. Du könntest zum Beispiel ein Interface dafür vorgeben, welches dann in den DLL's implementiert wird.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

24.06.2012, 16:02

Er meint wohl schneller im Vergleich zu Skriptsprachen wie z.B. Lua!
Normalerweise sind Skripts aber so simpel, dass es sich nicht lohnt, solche Abläufe in C++ zu programmieren. Damit machst du dir nur wesentlich mehr Arbeit und verlierst die Vorteile einer Skriptsprache.

4

24.06.2012, 19:02

Ich würde es lassen. Ich hab das mal mit DLLs und C++ gemacht, das war ziemlich nervig und hat mich auch nicht weitergebracht. Der einzige Grund warum sich das für dich alleine lohnen könnte, ist Kompilierzeit zu sparen und das geht anders wahrscheinlich leichter. Warum sonst sollte es dir nützen? Sofern du nicht an einem Spiel mit Mod-Support arbeitest und die Mod-Nutzer dem Sicherheitsrisiko von DLLs aussetzen möchtest, kann ich mir eigentlich keine sinnvolle Anwendung vorstellen. Mit Diff-Patches sollte ein Update auch wesentlich leichter zu machen sein als mit dem Ausliefern zusätzlicher DLLs.

Bei AntMe ist das eine ganz andere Geschichte, da dort mit C#/.Net gearbeitet wird und die DLLs für .Net ganz anders integrierbar sind. Das wäre etwas worüber man diskutieren kann.

Ansonsten würde ich vorschlagen, dass du die Teile des Spiels, die zwar als Code vorliegen, aber eher inhaltlicher Natur sind, als eigene Projekte entwickelst und in dein Kernsystem einbindest, um eine bessere Trennung zwischen Engine und Spiel zu erreichen.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Chromanoid« (24.06.2012, 19:11)


RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

5

24.06.2012, 20:34

Danke für die Antworten!
Ich habe gehört, eine Skriptsprache würde ca. die 20-Fache Zeit eines "nativen" programms benötigen.
In C# ist also eine DLL leichter / schneller?
Bin gerade etwas verwirrt, eigentlich wird doch C++ und C# in Bytecode umgewandelt, dürfte dann doch genau so schnell sein... oder :?:
MfG, RmbRT
"Dumm ist, wer dummes tut."

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

6

24.06.2012, 20:41

Wer erzählt denn so einen Blödsinn, dass C++ in Bytecode umgewandelt wird ?

Aber on topic:
Ist die Ausführung der Skripte wirklich dein aktueller Flaschenhals? Wenn nein, macht es überhaupt keinen Sinn da irgendwas optimieren zu wollen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

24.06.2012, 20:45

C++ wird nativ kompiliert, also in Maschinencode.
C# und die anderen .NET-Sprachen werden in eine Art Bytecode kompiliert, der aber beim erstmaligen Ausführen auch in Maschinencode umgewandelt wird.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

8

24.06.2012, 20:49

Zitat

Ich habe gehört, eine Skriptsprache würde ca. die 20-Fache Zeit eines "nativen" programms benötigen.

Das kommt auf die Scriprsprache an.
Könnte schon stimmen.

Zitat

In C# ist also eine DLL leichter / schneller?

In C# kannst du zb. zur Laufzeit(!) C# Scriptquellcode zu Bytecode kompilieren, der genauso schnell wie der Rest.
Dlls kannst du super einfach nachladen und es ist auch null Problem, Daten, Klassen, Vererbungen oder sonstwas auszutauschen.
In C# ist es ein fester Teil des Frameworks. Auch gibts wenn du es über ein Interface machst ja sogar Intellisense.

In C++ musst du dir mit der WindowsAPI Zugriff verschaffen und es kann Typunstimmigkeiten, Nullpointermethoden etc. geben. (In C++ hab ich es aber noch nie susprobiert.)

Zitat

eigentlich wird doch C++ und C# in Bytecode umgewandelt, dürfte dann doch genau so schnell sein

Es ist ungefähr gleich schnell. (Optimierter C++ Code kann aber deutlich schneller sein).
Aber der Unterschied liegt bei der Kompilierung.
C++ wird in Maschinencode kompiliert. Dadurch gehen viele Informationen verloren.
C# wird in Zwischencode kompiliert. Erst direkt bei der Ausführung erfolgt die Umwandlung in Maschinencode.

Den Begriff Bytecode finde ich übrigens sehr ungünstig. Bytecode ist beides.

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

9

24.06.2012, 21:15

@Sylence: Nein, ich wollte mich nur damit befassen, bevor ich mir ne Skriptsprache einbaue - Halt erst mal abwägen.
@David und Spiele Programmierer:
Ich habe keine genaue vorstellung von Maschinen- und Bytecode. Aber könnte man nicht mit C++ den gleichen effekt erzielen wie in C# ohne geschwindigkeits-unterschied?
Ich meine, beide können ja wohl nativ dll's laden (ist doch so?).
In C++ musst du dir mit der WindowsAPI Zugriff verschaffen und es kann Typunstimmigkeiten, Nullpointermethoden etc. geben. (In C++ hab ich es aber noch nie susprobiert.)
Also bei AntMe! zum Beispiel hatte ich mit meiner KI auch schon Nullpointer vom Programm aus Überliefert bekommen - das liegt ja eigentlich dann nicht an der Sprache, oder?
Ich komme mir gerade richtig wie ein Anfänger vor ;)
MfG, RmbRT - bitte um eine Erklärung.
"Dumm ist, wer dummes tut."

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

10

24.06.2012, 21:25

Zitat

Ich meine, beide können ja wohl nativ dll's laden.

Ja, natürlich.

Der Unterschied ist aber, dass du in C++ damit weniger Freude haben wirst.
In C# gehts fasst von selbst. Das ist in C++ eben anders.
Da gibt es einiges zu beachten. Es können eben zb. das die Typen nicht übereinstimmen.
Da kommen dann bloß kryptische Fehler.

In C++ kannst du zb auch nicht einfach von einer Klasse aus einer anderen DLL erben.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Spiele Programmierer« (24.06.2012, 23:19)


Werbeanzeige