Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

19.09.2006, 17:18

Geschwindigkeit von DDraw?

So, ich arbeite nun schon seit einigen Wochen an meinem ersten Spiel, basierend auf DirectDraw. Bisher läuft alles bestens, nur ist mir vor kurzem etwas komisches ausgefallen.

Ich habe bis jetzt 2 Sprites in meinem Programm. Soweit so gut. Ich wollte dann mal schauen wie lange die einzelnen Programmabschnitte in der Hauptschleife dauern, um herauszufinden, wo ich die Geschwindigkeit am ehesten verbessern kann. Dabei ist mit etwas aufgefallen, das erste Sprite zu rendern dauert ca. 20 mal so lange wie das zweite!

Das kann ja noch normal sein, da beim ersten mal von DDraw vielleicht irgendwelche initialisierungen und so weiter vorgenommen werden. Das komische ist aber, auf meinem Laptop dauert das rendern beider Sprites gleich lange, zudem läuft dort das ganze Programm ca. 6 mal so schnell, was eigentlich nicht alleine an der Leistungsfähigkeit liegen kann.

Hier mal meine Mehode zum rendern eines Sprites:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Funktionsergebnisse

    HRESULT hr = 0;

    // Rect setzen

    RECT SrcRect = {(NumFrame % NumFramesX_) * FrameWidth_,
                    (NumFrame / NumFramesX_) * FrameHeight_,
                    SrcRect.left + FrameWidth_,
                    SrcRect.top + FrameHeight_};
    RECT DestRect = {XPos, YPos, XPos + FrameWidth_, YPos + FrameHeight_};

    // Clippen

    if (!(DirectDraw::GetInstance ().ClipRect (&SrcRect, &DestRect)))
        return;

    // Surface holen

    IDirectDrawSurface7 *DDSOffscreen = NULL;
    DDSOffscreen = Surface::GetInstance ().GetSurface (Filename_);

    // Sprite rendern

    hr = DirectDraw::GetInstance ().DDSBack_->BltFast (DestRect.left, DestRect.top, DDSOffscreen,
                                    &SrcRect, DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
    if (FAILED (hr))
        EXCEPTION (L"IDirectDrawSurface7::BltFast() failed!");


So, ich hoff, dass man das verstehen kann was ich geschrieben hab ;) und dass mir jemand diese Unterschiede erklären kann, damirt das ganze mal etwas schneller läuft.

Anonymous

unregistriert

2

19.09.2006, 17:25

Re: Geschwindigkeit von DDraw?

Zitat von »"Manuel"«


C-/C++-Quelltext

1
2
3
4
5
    // Sprite rendern

    hr = DirectDraw::GetInstance ().DDSBack_->BltFast (DestRect.left, DestRect.top, DDSOffscreen,
                                    &SrcRect, DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
    if (FAILED (hr))
        EXCEPTION (L"IDirectDrawSurface7::BltFast() failed!");


Also nur mal so nebenbei, die ersten beiden Parameter von BltFast sind
die Positionsangaben...

Du hast Schwierigkeiten mit der Geschwindigkeit? Hast du denn eine
Timer Klasse, die du auch verwendest?

3

19.09.2006, 17:30

Ich weiß, dass das die Positionsangaben sind, die ja in dem Rect gespeichert sind.

Und ja ich habe einen Timer, mein Problem ist nicht dass alles unregelmäßig läuft, sondern ich möchte nur wissen woher diese komischen Geschwindigkeitsunterschiede kommen, die ich mir nicht erklären kann.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

19.09.2006, 17:32

Vielleicht liegt es an DDBLTFAST_WAIT.

5

19.09.2006, 17:36

Das bedeutet, er wartet bis das Sprite fertig gezeichnet wurde. Das ist mir alles klar.

Ich hab mal zu Testzwecken zwei gleiche Sprites reingemacht, das erste dauert zum Rendern 20 mal so lange wie das zweite, obwohl es da keine Unterschiede gibt. Aber bei meinem Laptop dauern beide gleich lang, wenn das selbe Programm abläuft, dadurch läuft es dort auch viel schneller.

Ich gleub ihr versteht mich falsch, mit der Geschwindigkeit habe ich keine Probleme, nur mit den Geschwindigkeitsunterschieden.

Edit: Ohne DDBLTFAST_WAIT läuft alles genau gleich ab

Anonymous

unregistriert

6

19.09.2006, 17:40

Zitat von »"Manuel"«

Ich weiß, dass das die Positionsangaben sind, die ja in dem Rect gespeichert sind.


So ein Quatsch in Rect's sind keine Positionsangaben, sondern es wird
beschrieben, welcher Teil der Bitmap in dem Rect gespeichert werden
soll. Also wenn rect.left == 0 ist, dann ist das der linke Rand,
wenn rect.top == 0 ist, dann ist das der obere Rand, wenn rect.top
== 20 ist, und du das Rect blittest, dann wird vom oberen Rand aus
ab 20 Pixeln geblittet, d.h. ein Stückchen der Bitmap fehlt.

Merken: Rect == Nix mit Positionsangabe

7

19.09.2006, 17:44

Ja, aber der linke Rand gibt doch auch gleichzeitih die X-Position an, oder?

C-/C++-Quelltext

1
RECT DestRect = {XPos, YPos, XPos + FrameWidth_, YPos + FrameHeight_}; 


Ich speicher das nur darein, damit ich dem Clipper nur 2 Rects anstatt 8 Werte übergeben muss, machts für mich ein bisschen angenehmer ;)

Anonymous

unregistriert

8

19.09.2006, 17:50

Zitat von »"Manuel"«

Ja, aber der linke Rand gibt doch auch gleichzeitih die X-Position an, oder?

C-/C++-Quelltext

1
RECT DestRect = {XPos, YPos, XPos + FrameWidth_, YPos + FrameHeight_}; 


Ich speicher das nur darein, damit ich dem Clipper nur 2 Rects anstatt 8 Werte übergeben muss, machts für mich ein bisschen angenehmer ;)


Nein, wo du das Rect positionierst ist eine ganz andere Sache und wird
nicht in dem Rect gespeichert! Verpass deiner Zeichen Funktion einfach
noch 2 Parameter zur Positions Angabe und ersetzt die in der BltFast
Funktion.

9

19.09.2006, 17:57

So wie ich das immer verstanden hab, markiert ein Rect einen Bereich auf dem Bildschirm, Bitmap, ..., dazu muss ja auch die Position drinnen gespeichert sein, sonst bräuchte man ja keine 4 Variablen sondern nur 2.

Anonymous

unregistriert

10

19.09.2006, 18:14

Zitat von »"Manuel"«

So wie ich das immer verstanden hab, markiert ein Rect einen Bereich auf dem Bildschirm, Bitmap, ..., dazu muss ja auch die Position drinnen gespeichert sein, sonst bräuchte man ja keine 4 Variablen sondern nur 2.


Links, Recht, Oben, Unten. Siehst du das irgendwas von X oder Y Position?
Ich nicht. Und nein es bräuchte nicht nur 2 Positionen, da es ja irgendwo
anfangen und irgendwo aufhören muss.

Werbeanzeige