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

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

81

22.05.2014, 15:56

Sehr beeindruckender Changelog! Bei Gelegenheit werde ich mir das ganze wieder anschauen, dann kriegst du auch gerne wieder umfangreiches Feedback, wenn gewünscht.

Eine Sache ist mir bei deinen Features leider etwas negativ ins Auge gefallen:

Zitat

Diese generiert den für die gewünschte Operation benötigten Code dynamisch zur Laufzeit als Expression Tree, kompiliert ihn, packt ihn in ein Delegate und ruft dieses dann intern auf. Nach einmaliger Codegenerierung ist der Overhead dann auch nicht mehr größer als zwei Methodenaufrufe und ggf. zwei bis drei Type Casts. Was das Prinzip der generischen Operatoren angeht, ahbe ich mich > hiervon < inspirieren lassen.


Das was du da machst ist ziemlich langsam. Das sollte man eher sparsam einsetzen, und auch vor allem nicht im Produktivcode für ein Spiel. Hast du mal unterschiede in der Performance mit ein paar 100 Objekten und Verwendung deine Methode gemacht? Wenn es exakt das tut, was ich denke, sollte das merklich sein.

Viel spanndender wäre die Frage, was aus deinem Projekt geworden ist, was Duality benutzen sollte. Gibt es da fortschritte?

82

22.05.2014, 16:54


Zitat

Diese generiert den für die gewünschte Operation benötigten Code dynamisch zur Laufzeit als Expression Tree, kompiliert ihn, packt ihn in ein Delegate und ruft dieses dann intern auf. Nach einmaliger Codegenerierung ist der Overhead dann auch nicht mehr größer als zwei Methodenaufrufe und ggf. zwei bis drei Type Casts. Was das Prinzip der generischen Operatoren angeht, ahbe ich mich > hiervon < inspirieren lassen.


Das was du da machst ist ziemlich langsam. Das sollte man eher sparsam einsetzen, und auch vor allem nicht im Produktivcode für ein Spiel. Hast du mal unterschiede in der Performance mit ein paar 100 Objekten und Verwendung deine Methode gemacht? Wenn es exakt das tut, was ich denke, sollte das merklich sein.


Nee nee, das ist schon getestet und ausreichend schnell. Der Expression Tree wird ja nur ein einziges Mal generiert und kompiliert, danach wird lediglich ein Delegate aufgerufen. :) Hier, gerade (nochmal) getestet:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
System.Diagnostics.Stopwatch w = new System.Diagnostics.Stopwatch();

for (int k = 0; k < 10; k++)
{
    System.Threading.Thread.Sleep(10);

    w.Restart();
    double sum = 0.0d;
    for (int i = 0; i < 100000; i++)
    {
        sum += 0.728935d * (i % 10);
    }
    w.Stop();

    Console.WriteLine("{0:F}", w.Elapsed.TotalMilliseconds, sum);

    w.Restart();
    double sum2 = 0.0d;
    for (int i = 0; i < 100000; i++)
    {
        sum2 = GenericOperator.Add(sum2, 0.728935d * (i % 10));
    }
    w.Stop();

    Console.WriteLine("{0:F}", w.Elapsed.TotalMilliseconds, sum2);
}


Ergebnis: Auch wenn der erste Aufruf (k = 0) von GenericOperator aufgrund der Expression Tree Sache rund 20 ms benötigt, verhält sich die Operation ansonsten ziemlich performant. In den folgenden 9 Tests steht es 0.5 ms für die direkte Variante und 1.5 ms für die GenericOperator Variante. Natürlich ist es nicht "genauso schnell", aber zumindest mal "schnell genug" :)

(Getestet im Release Mode mit angehängtem Debugger)

Viel spanndender wäre die Frage, was aus deinem Projekt geworden ist, was Duality benutzen sollte. Gibt es da fortschritte?


Also auf privater / hobby Ebene hatte ich eigentlich aktuell gar kein Projekt - wobei das größtenteils wohl am Zeitmangel liegt. Es gab da ein > Projekt < seitens meiner Hochschule, an dem ich beteiligt bin, und für das Duality eingesetzt wird. Da der spielerische Anteil davon soweit fertig war und eher weniger spannend ist, gibt es da auch nicht viel zu berichten außer "Läuft" :D Auf der anderen Seite gab es da noch das Projekt der Leute aus Irland, dessen aktuellen Stand kann man inklusive Video > hier < sehen.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

83

22.05.2014, 18:16

Das ist natürlich eine gute Optimierung, ansonsten sind ja 20ms ein absolutes NoGo. Gute Arbeit!

84

23.05.2014, 12:06

Habe mal früher deine Engine genutzt und was mich persönlich gestört hat ist das es kein DontDestroyOnLoad gibt wie in Unity: http://docs.unity3d.com/Documentation/Sc…troyOnLoad.html
Vielleicht aber auch nur übersehen.
Und ein GUI System wäre auch gut.
Was gut war, das die Engine Open Source ist.
Da ja im Hintergrund OpenTK genutzt wird konnte ich GWEN einbinden und so ein GUI System einbauen.
http://www.opentk.com/node/2811

Aber sonst ist es schon eine echt gute Engine.
P.S. Habe auch mal Unity2D genommen aber kann ich nicht empfehlen.
Man merkt deutlich das die Engine auf 3D ausgelegt ist und das der 2D Krams einfach nur schnell drüber gepackt wurde.

85

14.06.2014, 01:48

Habe mal früher deine Engine genutzt und was mich persönlich gestört hat ist das es kein DontDestroyOnLoad gibt wie in Unity: http://docs.unity3d.com/Documentation/Sc…troyOnLoad.html
Vielleicht aber auch nur übersehen.
Und ein GUI System wäre auch gut.
Was gut war, das die Engine Open Source ist.
Da ja im Hintergrund OpenTK genutzt wird konnte ich GWEN einbinden und so ein GUI System einbauen.
http://www.opentk.com/node/2811
Wie genau hast du Gwen integriert? Ich bräuchte dabei ein wenig Hilfe, ich habe leider keine Ahnung wie ich es einbinde.

86

14.06.2014, 12:48

Lad dir das Duality Projekt runter.
Es gibt doch die DualityApp dort erstellst du eine static Property für z.b. das Canvas das man zum zeichnen braucht.
Nun kannst du mir DualityApp.Canvas (o.ä.) darauf zugreifen und in der Camera Klasse (müsstest ein bisschen mal suchen) muss dort das Rendering rein.
Glaube war DualityApp.Canvas.RenderCanvas().
Den DualityLauncher erstellst du ganz neu weil dort das GameWindow das Gwen braucht.
Erstellt und init. alles von Gwen und übergibst dann einfach bevor das Spiel gestartet wird das Canvas an DualityApp.Canvas = _Canvas;

87

14.06.2014, 20:16

Lad dir das Duality Projekt runter.
Es gibt doch die DualityApp dort erstellst du eine static Property für z.b. das Canvas das man zum zeichnen braucht.
Nun kannst du mir DualityApp.Canvas (o.ä.) darauf zugreifen und in der Camera Klasse (müsstest ein bisschen mal suchen) muss dort das Rendering rein.
Glaube war DualityApp.Canvas.RenderCanvas().
Den DualityLauncher erstellst du ganz neu weil dort das GameWindow das Gwen braucht.
Erstellt und init. alles von Gwen und übergibst dann einfach bevor das Spiel gestartet wird das Canvas an DualityApp.Canvas = _Canvas;


Ich würde an dieser Stelle anmerken, dass diese Lösung voraussetzt, eine eigene Duality-Version zu bauen und per Fork vom Original-Sourcecode abzuweichen. Das schränkt die Supportmöglichkeiten seitens Community und Entwickler natürlich stark ein, was für Anfänger ein großes Manko darstellen kann. Insofern würde ich zu einer alternativen Variante raten, das ganze über ein Duality Plugin oder direkt im eigenen GamePlugin zu implementieren:

  1. Statische Properties können auch innerhalb eines Duality Plugins problemlos genutzt werden.
  2. Die jeweilige Plugin-Klasse (erbt von CorePlugin und ist in jedem plugin vorhanden) kann genutzt werden, um diese zu initialisieren und zu verwalten. Für einen reibungslosen Ablauf sollten immer Init UND Shutdown implementiert werden - das ist für den Runtime Reload von Plugins wichtig.
  3. Anstatt die Camera-Klasse zu hijacken, sollte es auch möglich sein, entweder einen eigenen ICmpRenderer zu implementieren, oder als Schnittstelle zwischen Gwen und Duality eine eigene Gwen-Anbindung zu implementieren. Gwen hat ja bereits eine für OpenTK, Tao und ein Drittes Framework, und die eigentliche Implementierung davon ist relativ kurz - es sollte kein allzu großes Problem darstellen, eine weitere Implementierung für Duality zu basteln.

In jedem Fall wäre eine Einbindung von Gwen per Plugin möglich, aber natürlich auch ein bisschen Arbeit - aber dafür ist das dann auch eine "saubere" Lösung, die nicht von jedem Anwender verlangt, Duality zu hacken, sondern durch ein Kopieren der jeweiligen Plugin .dll bereits funktioniert :)

Alternativ entwickelt SirePi bereits ein Duality Plugin, das GUI Funktionalität mitbringt. Vielleicht würde es sich auch lohnen, dort mal nachzufragen :)

88

14.06.2014, 23:56

@Fetze Das klingt nach einer bedeutend saubereren Methode, von der eventuell auch Leute aus dem Forum profitieren könnten. Anscheinend ist Gwen ja doch relativ mächtig, und Sachen wie Ladebalken doch äußerst praktisch für Spiele.^^ Werd ich mir anschauen.
Eventuell sogar als Standard-Plugin für Duality möglich? :D Oder zumindest als offizielles Plugin. Eine GUI-Komponente kann ja nicht schaden in deiner Engine :>

89

18.06.2014, 21:39

Die Controls aus dem Editor gefallen mir, hast du die Selbst geamcht wenn nicht wo bekommt man die her.

Grüße Andy


Die meisten der Controls sind aus der Standardlibrary von .Net, Windows.Forms. Die Docking-Funktionalität stammt aus dem WeifenLuo-Framework, die TreeViews sind aus der TreeViewAdv Library. ColorPicker, PropertyGrid und diverse andere sind selbstgemacht und hier OpenSource verfügbar.

90

20.07.2014, 16:09

Neue Infoseite

Im Laufe der Zeit wurde immer mal wieder angemerkt, dass Duality, so schön dieses Projekt auch sei, im Internet mit seiner trashigen wall-of-text Infoseite leider eher suboptimal repräsentiert sei. Dieser Kritik musste ich leider schlechten Gewissens beipflichten, kam aber nie wirklich dazu, das mal zu ändern - die eigentliche Entwicklung des Projekts sowie der Support der kleinen Nutzerschaft war dann doch irgendwie wichtiger.

In den letzten Tagen hatte ich dann zeitlich etwas mehr Luft und hab mich dieser Sache mal angenommen. Dabei herausgekommen ist eine deutlich schlankere und wesentlich besser aussehende > Infoseite für Duality <, die sich zwecks Smartphone- und Tablet Support nun sogar der verfügbaren Bildschirmgröße anpasst.


(Link)


Long Story Short: Wer schon immer mal jemandem von Duality erzählen wollte, kann dies nun hoffentlich auch ohne Augenkrebs. ;)

Werbeanzeige