In Zeitabständen -> zu langsam

  • C#

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Eistee.

    In Zeitabständen -> zu langsam

    Hi,

    Hier mein Typsches Konstrukt wenn etwas in Zeitabständen erledigt werden soll:

    C#-Quellcode

    1. private void freilassen(TimeSpan elapsedTimeSpan)
    2. {
    3. timeSinceLastRelease += elapsedTimeSpan;
    4. if (timeSinceLastRelease > releaseIntervall)
    5. {
    6. AddVirusToField(new Virus());
    7. anzahlfreizulassenderViren--;
    8. timeSinceLastRelease = TimeSpan.Zero;
    9. }


    Das Problem ist, die freilassung (entschuldigt meinen Denglisch-Schreibweise [Ich mag es selbst nicht]) geht viel zu langsam von statten.

    anzahlfreizulassenderViren ist = 400.
    elapsedTimeSpan liegt immer zwischen ~ 2.7 und 3.1 Millisekunden (Laut Angabe beim Haltepunkt).
    releaseIntervall ist für den Test auf 1 Millisekunde gestellt.
    elapsedTimeSpan wird mit einer StopWatch geliefert.

    Da elapsedTimeSpan immer größer ist als releaseIntervall sollten alle 400 in (0,0031*400~1.24) 1,24 Sekunden "freigelassen werden".
    Doch das ganze dauert ca. 30 Sekunden.

    Jemand eine Idee wo der Fehler liegen könnte oder ein Tipp wie man das Problem richtig debuggen kann?
    Oder einen neuen Thread, den du einfach immer mit Thread.Sleep anhälst.
    Was soll das eigentlich werden? :D
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    @Nikx: Sollte eig. ein Spiel werden.
    Und weil es nur ein Kleines-Spiel werden sollte, hab ich diese Struktur gewählt:

    @RodFromGermany: Hab ja einen:

    C#-Quellcode

    1. //Update
    2. private void timer_Tick(object sender, EventArgs e)
    3. {
    4. // Nester Update
    5. foreach (Nest nest in nester)
    6. {
    7. nest.Update(stopW.Elapsed);
    8. }
    9. // Viren Update
    10. foreach (Virus virus in viren)
    11. {
    12. virus.Update(stopW.Elapsed);
    13. }
    14. stopW.Reset();
    15. stopW.Start();
    16. //Draw
    17. this.Invalidate();
    18. }

    Der Time hat ein Intervall von 60.
    Ich denke mal da liegt auch der Fehler :rolleyes:
    Das Spiel ist inzwischen größer geworden als es werden sollte und das Packt der Timer wohl nicht mehr.

    Obwohl! die StopWatch müsste doch unabhängig sein, oder irre ich mich da?

    void freilassen(TimeSpan elapsedTimeSpan) ist in jedem Nest drin.
    (Aber es werden nicht alle ausgefürt, max. 50%).

    (Ich benutze kein Restart, weil ich hiermit unter FW4.0 bin).

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Eistee“ ()

    Überprüf mal, wie lange es dauert, einen Timer-Tick-Aufruf abzuarbeiten, nimm ggf. ein größeres Intervall.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Benutz doch eine GameEngine wie SGL oder GameUtils. Da wird dir der GameLoop abgenommen, und du hast in der Update Methode genau die vergangene Zeit in ms. Da kannst du in einer Variable zwischen Speichern wieviel Zeit vergangen ist, und wenn sie über 1200ms lässt du Viren frei.


    Desweiteren entsprechen 60ms bei deinen Timer 15 FPS.
    @RodFromGermany:

    Ohne freie Viren (kein Viren Update) ~ 25-40 Ticks
    Mit freien Viren (mit Viren Update) ~ 150-250 Ticks

    bei einem Timer Intervall von 2 Sekunden.


    ThuCommix schrieb:

    Desweiteren entsprechen 60ms bei deinen Timer 15 FPS.


    Das ist mir klar, aber die Reichen eig. das Spiel ist wirklich langsam, könnte man so sagen.
    Bis jetzt haben die 16,6 FPS ausgereicht.


    ThuCommix schrieb:

    Benutz doch eine GameEngine wie SGL oder GameUtils.

    habt ihr da ein fertiges Template welches mitgeliefert wird?
    Denn das wäre nett, damit könnte ich mich damit anfreunden ^^
    @ThuCommix: Eine Projektvorlage: msdn.microsoft.com/en-us/library/vstudio/xkh1wxd8.aspx
    Wie man das z. B. von XNA ANX oder SharpDX kennt.

    Edit:
    Bei dem Problem bezüglich dieses Themas ist wohl der Timer an allen Schuld.
    Der Update Aufruf wird viel zu wenig/langsam aufgerufen.
    Er kann ja nicht Jede Millisekunde einen freilassen wenn der Codeablauf da nur alle 20 Millisekunden vorbeikommt :cursing:
    Die Stopwatch ist zwar unabhängig vom Timer und misst auch richtig, nur der Timer ist ja eben das entscheidende, verdammt :pinch:

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

    ThuCommix schrieb:

    schau in meinen link

    Hab ich ^^ Da konnte ich nichts zu finden.
    NuGet funktioniert ja erst, wenn man ein Projekt hat.
    Allerdings frisst VS13Express die Vorlage/das Template nicht.
    Den Template Ordner von VS2010 gibt es nicht mehr.
    Anscheint weiß nicht einmal die MSDN bescheit :cursing: