| |
JanBaa Member
Anmeldedatum: 08.07.2012 Beiträge: 10
|
Verfasst 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 |
|

|
XMR1 Member
Anmeldedatum: 28.04.2010 Beiträge: 1209 Wohnort: Bayern
|
Verfasst 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 |
|

|
JanBaa Member
Anmeldedatum: 08.07.2012 Beiträge: 10
|
Verfasst 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 |
|

|
XMR1 Member
Anmeldedatum: 28.04.2010 Beiträge: 1209 Wohnort: Bayern
|
Verfasst 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 |
|

|
JanBaa Member
Anmeldedatum: 08.07.2012 Beiträge: 10
|
Verfasst 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  |
|
| Nach oben |
|

|
|
|
|