ProfilProfil
 Registrieren
 Login
Bild der WocheBild der Woche

(von Backslider)
Kommentare (0)
****

Weitere
User onlineBenutzer online
Gäste online: 6
Mitglieder online: Keine
Registrierte Mitglieder: 2116
Neustes Mitglied: onkel_keks

DrawableGameComponentzur Laufzeit erzeugen bringt Ruckler

Neue Antwort erstellen
 

 

Autor Nachricht
 
 
JanBaa
Member


Anmeldedatum: 08.07.2012
Beiträge: 10

Antworten mit Zitat
BeitragVerfasst am: 08.07.2012, 11:07    Titel: DrawableGameComponentzur Laufzeit erzeugen bringt Ruckler

Hallo,

ich erstelle zur Zeit einen simplen 2D Arcade-Shooter mit XNA.
Zur Darstellung der Gegner verwende ich eine abgeleitete Version der DrawableGameComponent.
Da ich nicht schon bei Begin des Spiels alle Gegner-Objekte erzeugen möchte, wird der Menchanismus zum Erzeugen erst
kurz vor der Verwendung des Objekt in Gang gesetzt.

Nun passiert es aber, dass das Spiel für kurze Zeit, aber dennoch spürbar einen kleinen Aussetzer beim Zeichnen macht.
Je länger das Spielt läuft, desto kürzer wird der Aussetzer.

Am Laden der Textur kann es jedoch nicht liegen, da diese in einem separaten Thread geladen wird.

Hat jemand eine Idee (trotz der recht knappen Beschreibung), woran es liegen könnte?

Danke für eute Hilfe,
Grüße,
Jan
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


XMR1
Member


Anmeldedatum: 28.04.2010
Beiträge: 1209
Wohnort: Bayern

Antworten mit Zitat
BeitragVerfasst am: 08.07.2012, 11:42    Titel:

Ich finde das DrawableGameComponent für Gegner ein Overkill ist.
IMO gehören da eher die einzelnen Screens rein oder gar nur Sachen wie Screenmanager, etc.

Der ruckler kommt höchstwahrscheinlich von deinem seperaten Thread.
1. Muss der gestartet werden (langsam)
2. Muss der Content dort geladen werden
3. Muss er wieder auf den Hauptthread zurückgebracht werden

Ich würde einfach das ganz normale Content.Load verwenden, denn:
Code:
Content.Load("mytexture") // 200ms - Textur wird von der Platte geladen
Content.Load("mytexture") // 0ms - Textur wird aus dem internen Dictionary zurückgegeben, da sie vom ContentManager zwischengecachet wird


Wenn das auch nicht hilft kannst du dir mal Objekt Pooling anschauen. Dabei werden einzelne Elemente wiederverwendet, sodass nicht immer neue generiert werden können, was auch das ruckeln vermeidet.
_________________
Webseite | marc.stanglmayr.de
Blog | blog.mastasoftware.net
studentpartners.de
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen ICQ-Nummer


JanBaa
Member


Anmeldedatum: 08.07.2012
Beiträge: 10

Antworten mit Zitat
BeitragVerfasst am: 08.07.2012, 20:22    Titel:

Hi,

danke schon mal für die Antwort.
Allerdings hatte ich das Ruckeln auch schon bevor ich die Verabeitung über einen separaten Thread gemacht habe (was der eigentliche Auslöser für die paralelle Verarbeitung war).

Was genau meinst du mit DrawableGameComponent für Genger sei overkill?
Irgendwie muss ich die Sprites der Gegner doch darstellen!?

Einen Screenmanager habe ich im Einsatz, allerdings weiß ich nicht wie dieser direkt bei der Darstellung helfen kann?
Könntest du mir den Sachverhalt kurz erklären?

Danke für die Hilfe.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


XMR1
Member


Anmeldedatum: 28.04.2010
Beiträge: 1209
Wohnort: Bayern

Antworten mit Zitat
BeitragVerfasst am: 08.07.2012, 20:52    Titel:

Naja, eine DrawableGameComponent hat ganz viele Eigenschaften, inklusive den Methoden LoadContent, Initialize, UnloadContent, Update, Draw, ...

Das ist also eher für eine Komponente angedacht, die das ganze auch ausnutzt (z.B. einen ScreenManager).

Sprites sind hingegen eher kleine Komponenten, die eine Position und eine Textur haben.

Dazu reicht es, sich eine kleine Klasse
Code:
class Sprite
{
  public Texture2D Texture {get; set; }
  public Vector2 Position {get; set;}

  void Draw(SpriteBatch renderer)
  {
    renderer.Draw(Texture, Position, Color.White);
  }
}

zu schreiben.

In deiner Spielklasse (wo du auch deine Welt updatest, etc.) kannst du dann eine Liste von diesen Sprites halten und im Draw dann einfach
Code:
private List<Sprite> sprites;
void Draw()
{
  spriteBatch.Begin();
  foreach (var sprite in sprites)
  {
    sprite.Draw(spriteBatch);
  }
  spriteBatch.End();
}


alle Sprites zeichnen lassen.

Wenn das ruckeln schon davor war, hast du wohl was falsch gemacht, denn normal wird die Textur genau einmal geladen und danach aus einem Dictionary geholt, da wird also nur noch die Referenz zurückgegeben und das benötigt wirklich keine Zeit.

Vielleicht magst du ja mal den Code posten, den du für verantwortlich hälst.
_________________
Webseite | marc.stanglmayr.de
Blog | blog.mastasoftware.net
studentpartners.de
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen ICQ-Nummer


JanBaa
Member


Anmeldedatum: 08.07.2012
Beiträge: 10

Antworten mit Zitat
BeitragVerfasst am: 08.07.2012, 21:16    Titel:

Ah cool.
Hab auch grad ein wenig im Internet recherchiert und gelesen, dass man für so was lieber Sprites nutzen sollte.
Werde von DGC auf Sprites umstellen und gucken wie es sich verhält.

Danke auf jeden Fall für die schnelle, qualifizierte Antwort.
Schon mag ich dieses Forum Very Happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


Beiträge der letzten Zeit anzeigen:   
 
Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de