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

13.01.2012, 19:16

[SFML] Tiles Drawing Performance

Hi,

ich möchte gerne 20 mal 20 Tiles auf den Bildschirm zeichnen, aber leider hab ich dann nur so 15-20 FPS... das ist irgendwie ein bisschen wenig -_-
In meinem Beispiel hab ich jetzt zwar 8x8 Tiles auf 32x32 vergrößert, aber ohne das macht es auch keinen unterschied. Genau so sie SetSmooth(true).
gibt es irgendeine Möglichkeit schnell die Paar Sprites zu zeichnen? kann ich irgendein 800x600 Großes Sprite machen, auf dem ich dann zeichne und das ich dann auf den Schirm werfe? So hab ich dann nicht so oft das App.Draw().

Ich hab gesehen, dass viele das Problem haben aber irgendwie hab ich noch keine Lösung dafür gesehen.

Hab ich da irgendwas überlesen, oder gibt es da keine Lösung?
Code:

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
int main()
{

    sf::RenderWindow _mainWindow;
    _mainWindow.Create(sf::VideoMode(800,600,32),"test", sf::Style::Close );
    
    sf::Image image;
    image.LoadFromFile("image.bmp");
    image.SetSmooth(false);
    sf::Sprite sprite(image);
    sprite.SetSubRect(sf::IntRect(8*2,0,8*2+8,8));
    sprite.SetScale(4,4);

    sf::Music Music;
    if (!Music.OpenFromFile("sound.wav"))
         return EXIT_FAILURE;

        Music.Play();
        Music.SetVolume(50);

     int testMap[20][40] = {
         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
         {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
     };


    while(_mainWindow.IsOpened())
    {
        _mainWindow.Draw(sf::Shape::Rectangle(0, 0,     _mainWindow.GetWidth(), _mainWindow.GetHeight(), sf::Color(0xff,0xff,0xff)));

        
         for(int i = 0; i<20;i++)
         for(int j = 0; j<20/*40*/; j++)
        {

            if(testMap[i][j]==1)
            {
                sprite.SetX(i*32);
                sprite.SetY(j*32);
                _mainWindow.Draw(sprite);
            }
        }
        _mainWindow.Display();
    }
    
    _mainWindow.Close();
}

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

2

13.01.2012, 19:57

Jo, SFML ist lahm. Probier doch mal HGE.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

3

13.01.2012, 20:12

C-/C++-Quelltext

1
_mainWindow.Draw(sf::Shape::Rectangle(0, 0,     _mainWindow.GetWidth(), _mainWindow.GetHeight(), sf::Color(0xff,0xff,0xff)));


Vllt bringt es ja was, die Form vor der Schleife anzulegen und dann als Parameter zu übergeben.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

13.01.2012, 20:16

Probiers mal mit der Clear-Methode anstelle des Rechtsecks.

Schonmal an RenderImage gedacht?

Für jedes Tile ein eigenes Sprite anzulegen wäre auch eine möglichkeit das ganze schneller zu machen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

5

13.01.2012, 20:23

@Architekt
ne selbst ohne bring das nichts

@NachoMan

C-/C++-Quelltext

1
_mainWindow.Draw(sf::Shape::Rectangle(0, 0,     _mainWindow.GetWidth(), _mainWindow.GetHeight(), sf::Color(0xff,0xff,0xff)));

war eigentlich nur ein test und unwichtig.

und ich nutze V1.6 da hab ich ja RenderImage nicht

Stazer

Alter Hase

Beiträge: 468

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

6

14.01.2012, 02:08

Dann lad dir den SFML 2.0 Snapshot runter...

Freundliche Grüße
Stazer

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

7

14.01.2012, 02:47

ich hatte auch das Problem, aber nur im Debug Modus: hatte ich ca. 15 fps beim Rendern von meinen Tiles und im Release Modus dann um die 1000-2000 fps, was sehr komisch ist... und damit musst ich mich halt abfinden dass es im Debug modus so lahm ist.
New Project: Operation CityRacer

Mastermind

unregistriert

8

14.01.2012, 10:12

ich hatte auch das Problem, aber nur im Debug Modus: hatte ich ca. 15 fps beim Rendern von meinen Tiles und im Release Modus dann um die 1000-2000 fps, was sehr komisch ist... und damit musst ich mich halt abfinden dass es im Debug modus so lahm ist.


Was genau ist daran jetzt komisch? Im Debug Modus Performance zu messen ist halt ziemlich sinnlos.

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

9

14.01.2012, 11:37

Als erstes würde ich es auch mit SFML 2.0 versuchen. Liegt es vielleicht an der auflösung des Sprites ? 2-potenz ? Weil ich letztens einen ähnlichen versuch gemacht, gerade weil ich dachte SFML wäre langsam. Aber es hat sich rausgestellt dass bei einem Sprite, welches ich 30000 pro Frame gedreht und verschoben habe, trotzdem noch 20 Frames im Debugmodus und 40 Frames im Releasemodus hatte.

Werbeanzeige