WinForms / GDI / Server / Client / RPG Fragen

  • C#

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    WinForms / GDI / Server / Client / RPG Fragen

    Moin moin,

    also ich lese hier schon länger als Gast mit, bin durch einen Freund auf das Forum gekommen. Und eben jener Freund ist auch der Anlass warum ich ein Projekt gestartet habe ;)

    Ich habe behauptet das es sehr wohl möglich ist mittels GDI+ ein Online RPG-Spiel zu erstellen ;)
    Das ganze ist kein Projekt, welches die Ambitionen hat fertig zu werden - aber ausgeschlossen ist es nicht - ich will lediglich die machbarkeit beweisen ;)

    Und hier fangen wir mal an was ich bereits habe und wo ich Hilfe gebrauchen könnte ;)



    Was sieht man hier:
    • Diverse GDI+ Controls (Window, Button, Textbox, Textfeld, Image)
    • Alle mit dem GameServer verbundenen Spieler
    • Es gibt für alle Spieler animationen (Idle, Attack, Death, Cast, RangeAttack, Hit, Run)
    • Spieler haben verschiedene Ausrüstung
    • Kollisionsbereiche
    Realisiert wird das ganze mit dem TCP, was bisher auch Lagfrei funktioniert, allerdings habe ich auch noch nicht viele Spieler getestet!

    Ein Problem ist meine Hauptschleife, welche ich mit dem Idle Event realisiert habe:

    C#-Quellcode

    1. void Application_Idle(object sender, EventArgs e)
    2. {
    3. while (AppStillIdle)
    4. {
    5. bool wasBusy = m_GUIBusy;
    6. float elapsed = m_Timer.GetElapsedMilliseconds();
    7. UpdateTimers(elapsed);
    8. m_GUIBusy = m_GUI.Update(m_Input, elapsed);
    9. m_Engine.Update(m_Input, elapsed);
    10. if (!m_Game.tcpClient.IsConnected || (m_Input.KeyPressed(Keys.Escape) && !wasBusy))
    11. this.Close();
    12. m_Input.NewFrame();
    13. }
    14. }


    Probleme macht mir hier das AppStillIdle, welches wie folgt implementiert ist:

    C#-Quellcode

    1. [System.Security.SuppressUnmanagedCodeSecurity]
    2. [DllImport("User32.dll", CharSet = CharSet.Auto)]
    3. public static extern bool PeekMessage(out Message msg, IntPtr hWnd, uint messageFilterMin, uint messageFilterMax, uint flags);
    4. [DllImport("User32.dll")]
    5. private static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey);
    6. /// <summary>
    7. /// Prüft ob auch ja keine Window-Message zwischen geschoben werden müssen
    8. /// </summary>
    9. private bool AppStillIdle
    10. {
    11. get
    12. {
    13. Message msg;
    14. return !PeekMessage(out msg, IntPtr.Zero, 0, 0, 0);
    15. }
    16. }


    Auf 95% aller Rechner läuft die Endlosschleife bis man das Spiel beendet, allerdings gibt es einige Rechner die der Meinung sind, das es durchgehend WindowMessages gibt und ich habe absolut keine Ahnung woran das liegen kann, hat damit jemand Erfahrungen?

    Gibt es hier einen Thread, welcher auf generelle Tweaks bei GDI+ eingeht? Das war es erstmal von der Fragefront, ich hoffe jemand kann mir bei der Hauptschleife weiter helfen ;)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „TheLianos“ ()

    Und für was willst du jetzt genau PeekMessage verwenden wenn du schon im Titel WinForms hast?
    Du kannst einfach von System.Windows.Form ableiten und anschließend WndProc überschreiben.

    Quellcode

    1. public class MeineForm : Form
    2. {
    3. protected override void WndProc(ref Message m)
    4. {
    5. ... hier hasste deine messages
    6. }
    7. }


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    TheLianos schrieb:

    Gibt es hier einen Thread, welcher auf generelle Tweaks bei GDI+ eingeht?

    Dort kannst du dir evtl noch das ein oder andere rauspicken: [VB 2008] [Tutorial] GDI+
    Ganz unten sind noch weiterführende Links.

    Und sowas hier:
    stackoverflow.com/questions/1690422/gdi-performance-tricks

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    vb-checker schrieb:

    TheLianos schrieb:

    Gibt es hier einen Thread, welcher auf generelle Tweaks bei GDI+ eingeht?

    Dort kannst du dir evtl noch das ein oder andere rauspicken: [VB 2008] [Tutorial] GDI+
    Ganz unten sind noch weiterführende Links.

    Und sowas hier:
    stackoverflow.com/questions/1690422/gdi-performance-tricks
    Viele Dank für die Links

    thefiloe schrieb:

    Und für was willst du jetzt genau PeekMessage verwenden wenn du schon im Titel WinForms hast?
    Du kannst einfach von System.Windows.Form ableiten und anschließend WndProc überschreiben.

    Quellcode

    1. public class MeineForm : Form
    2. {
    3. protected override void WndProc(ref Message m)
    4. {
    5. ... hier hasste deine messages
    6. }
    7. }
    Mir ist noch nicht klar, wie ich mit dieser Information die Endlosschleife realisieren soll...

    Samus Aran schrieb:

    Klar kann man mit GDI+ Spiele machen, es hindert dich auch keiner daran.
    Aber warum sollte man heutzutage noch "Spiele" über die lahme CPU laufen lassen, wenn GPUs ein Vielfaches der Leistung bieten können?
    Parallel wird auch an einer DirectX Version gearbeitet, GDI+ nur so zum Testen der Performance von GDI+
    Bisher sieht es aber schlecht aus für GDI+ und ich würde nun ebenfalls behaupten man kann damit keine Spiele entwickeln, aber ich werde dem ganzen noch eine Chance geben
    Also zusammenfassend: Wenn du wirklich Spiele machen willst würde ich auf GDI verzichten. Such dir nen Framework das mit der GPU rendert und auch mehr Möglichkeiten hat. Manche kapseln sogar schon die Logik mit der Nachrichtenschleife die bis zum WM_CLOSE läuft. Das wären z.B. XNA (DirectX als basis) oder OpenTK (OpenGL als basis) wobei OpenTK mit Mono sogar auf Linux usw. läuft was natürlich auch noch nen nettes feature ist :)


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.