Spieleprogrammierung in C# ?



  • hallo 🙂
    mich interessiert es ob sich c-sharp für die Spieleprogrammierung eignet. Hat es besondere Vorteile/Nachteile.. wenn ja welche?



  • Naja, Du denkst ja sicherlich an Direct3D.

    Ich sehe da zwei wesentliche Nachteile gegenüber nativer Programmierung in C oder in C++:

    - für die ganzen Direct3D-Klassen werden lauter Wrapper-Klassen erzeugt, wenn Du Direct3D in C# nutzt. Dadurch geht jeder Aufruf einer Methode über eine Zwischenstufe. Das kostet nicht viel Zeit, aber jedesmal.

    - Garbage Collection - wenn Du ein Objekt nicht mehr nutzt, wird es irgendwann vom Garbage Collector freigegeben. In einem Spiel kann sowas dann zu unschönen Performance-Einbußen führen. Es lässt sich vermeiden, wenn Du Dein Spiel auf bestimmte Art und Weise designst und Deine Objekte entsprechend verwaltest, aber unschön ist eben, daß Du hier ständig berücksichtigen mußt die Speicherverwaltung zu umgehen. Das kann dazu führen daß nicht alles so geradlinig ist wie Du es eigentlich ausgedacht hast.



  • Aber seit C# gibt es Managed DirectX und damit lässt es sich in C# viel einfacher prorgammieren als in C++. Wie Marc++us schon gesagt hat, musst du aufpassen wie du dein Spiel designst, ansonsten Performance-Einbußen. Aber zurück zu deiner Frage, ja man kann ohne Probleme in C# Spiele programmieren, es gibt auch eine gute C# Umsetzung zu OpenGL.

    Eigenlich kenne ich keine Nachteile, ich habe mal vor langer Zeit in einem englischen C# Forum einen Performance Test zwischen C++/C#/VB und Delphi gefunden, die hatten ihrgend einen Algorithmus getestet und da fiel das Ergebnis wie folt aus:

    Platz 1: C++
    Platz 2: C#
    Platz 3: Delphi
    Platz 4: VB

    C++ und C# hatten nur einen ganz kleinen Unterschied.



  • Hi!

    Marc++us schrieb:

    - Garbage Collection - wenn Du ein Objekt nicht mehr nutzt, wird es irgendwann vom Garbage Collector freigegeben. In einem Spiel kann sowas dann zu unschönen Performance-Einbußen führen. Es lässt sich vermeiden, wenn Du Dein Spiel auf bestimmte Art und Weise designst und Deine Objekte entsprechend verwaltest, aber unschön ist eben, daß Du hier ständig berücksichtigen mußt die Speicherverwaltung zu umgehen. Das kann dazu führen daß nicht alles so geradlinig ist wie Du es eigentlich ausgedacht hast.

    Bist du dir da sicher, dass das soviel Zeit in anspruch nimmt? Ich persönlich denke, dass C# für kleine Spiele eine sehr gute Wahl ist und daher das Problem mit den Garbage Collector nicht so ins Zeug fällt. Wenn man einen Quake Klon schreiben will muss man natürlich, um die optimale Geschwindikeit herauszuholen, das ganze in C++ programmieren.

    Grüße



  • Counterfeit schrieb:

    es gibt auch eine gute C# Umsetzung zu OpenGL.

    Interessant. Zeig mal nen Link.





  • Mhh Mist, ihrgendwie hat er es doppelt gepostet.



  • Bitte den GC nicht so einseitig als Performance-Nachteil darstellen. Beim Reinigen (und nur dann!) kann das Programm schon mal für ein paar ms gestoppt sein. Dafür kann man blitzschnell allokieren, in aller Regel deutlich schneller als bei einem fragmentierten Heap, wie man ihn in C/C++ hat.

    Und es ist ja nicht so, als würde jede Sekunde eine Bereinigung durchgeführt...

    Außerdem bieten sich bei dem managed Heap noch weitere Optimierungsmöglichkeiten im Zusammenhang mit Cache misses, weil es garantiert ist, dass nacheinander allokierte Objekte nebeneinander im Speicher stehen.



  • Schreitet der GC nicht dann erst zur Tat, wenn die Systenmbelastung sehr gering ist?



  • In der Theorie schreitet er zur Tat, wenn der Heap voll ist. In der Praxis wird laut MSDN eine heuristische Funktion verwendet, die viele Faktoren berücksichtigt, um den GC zu starten.

    Ich verfahre nach folgendem Prinzip:
    Ich gehe im Allgemeinen davon aus, dass der GC selber am besten weiß, wann er anspringen soll. Wenn ich gerade eine Situation habe, in der ich viele Objekte freigebe und die Performance gerade nicht kritisch ist (z.B. im Spiel -> Rückkehr zum Hauptmenü) werf ich ihn außerdem noch selber an.

    Ich habe eigentlich nie die Erfahrung gemacht, dass ein GC meine Performance ruiniert. 🙂 Und das schnelle Allokieren ist godlike :sabber:



  • Optimizer schrieb:

    Ich verfahre nach folgendem Prinzip:
    Ich gehe im Allgemeinen davon aus, dass der GC selber am besten weiß, wann er anspringen soll. Wenn ich gerade eine Situation habe, in der ich viele Objekte freigebe und die Performance gerade nicht kritisch ist (z.B. im Spiel -> Rückkehr zum Hauptmenü) werf ich ihn außerdem noch selber an.

    Hallo Optimizer,
    wie startet man den GC manuell?



  • G4M3M4St3R schrieb:

    wie startet man den GC manuell?

    Schau Dir mal die Klasse GC an.



  • System.GC.Collect();



  • Danke, hätte man sich ja fast denken können 😃
    Verwendet ihr für eure Spiele eigentlich DirectX bzw. OpenGL oder die GDI+?



  • Naja ich würde mit GDI eher ne Wirtschaftssimulation oder so programmieren, aber DirectX oder OpenGL werde ich für mein nächstes Spiel verwenden muss nur mal schauen mit was es sich einfach realisieren lässt. 🙄



  • oh hier war ja einiges los seit ich das letze mal reingeschaut habe 🙂
    ja es ging mir dabei um direct3d.. habe mittlerweile angefangen c++ mir an zu eigenen.. konnte davor schon c ^^
    leider gibt es noch keine bücher in der richtung c# + direct3d die meisten sind englisch und das würde den lernprozess 500% verlangsamen ^^



  • wenn du die directx sdk9 installiert hast, ruf doch mal den sample-browser auf, da iss das zeugs ganz gut beschrieben.

    zum beispiel:

    public  static bool   CreateDevice(Form form)
    			{
    				frmMainForm=form;
    				try
    				{
    					// Now let's setup our D3D stuff
    					Microsoft.DirectX.Direct3D.PresentParameters presentParams = new Microsoft.DirectX.Direct3D.PresentParameters();
    					presentParams.Windowed=true;
    					presentParams.SwapEffect = Microsoft.DirectX.Direct3D.SwapEffect.Discard;
    					presentParams.EnableAutoDepthStencil = true; // Turn on a Depth stencil
    					presentParams.AutoDepthStencilFormat = Microsoft.DirectX.Direct3D.DepthFormat.D16; // And the stencil format
    
    					objDevice = new Microsoft.DirectX.Direct3D.Device(0, Microsoft.DirectX.Direct3D.DeviceType.Hardware, form, Microsoft.DirectX.Direct3D.CreateFlags.SoftwareVertexProcessing, presentParams);
    					// Turn off culling, so we see the front and back of the triangle
    					objDevice.RenderState.CullMode = Microsoft.DirectX.Direct3D.Cull.None;
    					// Turn off D3D lighting
    					objDevice.RenderState.Lighting = false;
    					// Turn on the ZBuffer
    					objDevice.RenderState.ZBufferEnable = true;
    
    					return true;
    				}
    				catch (DirectXException)
    				{ 
    					return false; 
    				}
    			}
    


  • Echtzeitstrategiespiel "Arena Wars" unter .NET:
    http://www.dotnetpro.de/news442.aspx



  • OMG, das ist ja noch von der ganz alten Schule! 😮 😮 😮
    Einheiten bewegen sich strikt innerhalb von Zellen und können nur in 8 verschiedene Richtungen gehen! OMG! 😮 😮 😮



  • JEder fängt mal klein an ^^


Anmelden zum Antworten