kostenloser Webspace werbefrei: lima-city


flimmern in Cpp ( SDL )

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    bloedesvieh

    Kostenloser Webspace von bloedesvieh, auf Homepage erstellen warten

    bloedesvieh hat kostenlosen Webspace.

    Aloha,

    also ich setze mich in letzter Zeit etwas mit C++ und Grafik-Programmierung auseinander. Meine Wahl fiel da auf SDL, da es unkompliziert und für meine Zwecke ausreichend ist. ( Und weil ich mich nicht mit dem Plattformübergreifenden Programmierkrams rumschlagen wollte... )
    Nun zu meinem Vorhaben: Es mag sinnlos erscheinen, aber ich möchte ein Rechteck dazu bringen, möglichst häufig zwischen zwei Farben hin und her zu wechseln. ( Ja, im Ernst, das wird soll die Hauptaufgabe eines tollen Programms werden. :p ) So weit, so gut, klingt ansich nicht schwer - so dachte ich. Nun habe ich allerdings das Problem, dass ich dabei merkwürdige Grafik-Effekte bekomme, ein merkwürdiges "Flimmern", was dazu führt, dass ich die meiste Zeit mein halbes Fenster in der einen Farbe habe und die andere Hälfte in der anderen. Es soll aber abwechselnd, möglichst mit 200 - 400 Hz ( Absolute Untergrenze sind 50 Hz. ) immer nur eine, dann die andere Farbe sichtbar sein.

    Ich poste hier mal meinen - bisher doch recht kurzen - Quellcode.
    #include "SDL/SDL.h"
    
    const int SCREEN_WIDTH = 640;
    const int SCREEN_HEIGHT = 480;
    const int SCREEN_BPP = 32;
    
    SDL_Surface* screen = NULL;
    
    SDL_PixelFormat* fmt;
    SDL_Event event;
    bool curColor;
    
    Uint32 getColor()
    {
         Uint32 color;
         if(curColor)
         {
             color = SDL_MapRGB(fmt, 200,0,0);
             curColor = false;
         }else{
             color = SDL_MapRGB(fmt, 0,200,200);
             curColor = true;
         }
         return color;       
    }
    
    int main( int argc, char* args[])
    {
        bool quit = false;
        SDL_Init( SDL_INIT_VIDEO|SDL_INIT_EVENTTHREAD );
        screen = SDL_SetVideoMode( 640, 480, 32, SDL_DOUBLEBUF|SDL_HWSURFACE );
        fmt = screen->format;
        while(!quit){
            while(SDL_PollEvent(&event))
            {
                if(event.type == SDL_QUIT)
                {
                    quit = true;
                }
            }
            SDL_FillRect(screen, NULL, getColor());
            SDL_UpdateRect(screen, 0,0, 640, 480);
            SDL_Flip(screen);
        }
        SDL_Quit();
        return 0;
    }
    Also ob ich per SDL_HWSURFACE oder SDL_SWSURFACE den Video-Modus setze, macht keinen Unterschied. Googlen hat mich auch nicht weiter gebracht. Vielleicht sieht hier ja irgendwer einen Fehler.

    Naja, meine zweite Überlegung wäre, dass es an meiner Hardware liegt. Vielleicht ist mein Laptop-Display einfach nicht gebaut, um so schnelle Farbwechsel zu bemerken. Dann wäre die Frage, wie ich das ganze so begrenze, dass das Ding wirklich regelmäßig mit einer bestimmten Frequenz wiedergegeben wird, die auch dargestellt werden kann, also dass beispielsweise wirklich 50 mal gleichmäßig über eine Sekunde verteilt die Farbe wechselt. ( Gleichmäßigkeit steht auf der Prioritätenliste ganz oben! )

    Irgendwer eine Idee?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hi,

    vielleicht wäre das warten von paar Millisekunden nicht schlecht.

    Deine Frequenz bekommst du ja mit: Bildwechsel / Sekunde

    Denk aber daran, dass das menschliche Auge nur bis zu einer bestimmten Frequenz Bildwechsel wahrnehmen kann.

    Am besten baust du in deine While-Schleife eine Pause (pause() ; wait() ) ein.
    http://www.computerhilfen.de/hilfen-14-41150-0.html

    die Angaben der Zeit sind dann meist Millisekunden: 1000 Millisekunden = 1 Sekunde
    (Dass ganze kann aber Abweichungen erzeugen, da der Computer 1024 Millisekunden in 1 Sekunde umrechnet)

    Hoffentlich hilft es weiter.

    Viel Erfolg
  4. Autor dieses Themas

    bloedesvieh

    Kostenloser Webspace von bloedesvieh, auf Homepage erstellen warten

    bloedesvieh hat kostenlosen Webspace.

    jakarta schrieb[/url]:
    Hi,

    vielleicht wäre das warten von paar Millisekunden nicht schlecht.

    Deine Frequenz bekommst du ja mit: Bildwechsel / Sekunde

    Denk aber daran, dass das menschliche Auge nur bis zu einer bestimmten Frequenz Bildwechsel wahrnehmen kann.
    Nicht das Menschliche Auge, sondern das Menschliche Gehirn. Darum geht es bei der ganzen Sache ja. ;-) Ich muss mindestens das dreifache von dem schaffen, wozu das menschliche Hirn eigentlich in der Lage ist.

    jakarta schrieb[/url]:
    Am besten baust du in deine While-Schleife eine Pause (pause() ; wait() ) ein.
    http://www.computerhilfen.de/hilfen-14-41150-0.html

    die Angaben der Zeit sind dann meist Millisekunden: 1000 Millisekunden = 1 Sekunde
    (Dass ganze kann aber Abweichungen erzeugen, da der Computer 1024 Millisekunden in 1 Sekunde umrechnet)

    Hoffentlich hilft es weiter.

    Viel Erfolg
    Leider hilft das nicht weiter. ( Abgesehen davon, dass SDL eine eigene, relativ gute Delay-Funktion hat ) Die Artefakte habe ich offenbar auch bei Frequenzen von 5Hz. ( also 5 Wechseln pro Sekunde ) Ich glaube ich muss mir langsam eingestehen, dass es auch an meinem altersschwachen Laptop liegen könnte. Wobei 5 Frames pro Sekunde einfach zu füllen - selbst der sollte dazu in der Lage sein. Also bleibt nach wie vor entweder ein Programmierfehler, das Display ( welches eigentlich auch 5 Hz. schaffen sollte ) oder halt die Grafikkarte.

    Um also auch die Hardwareseite zu berücksichtigen:
    Ich sitze an einem AMT-Athlon, 1,6 Ghz, 2GB Ram, mit einer ATI Radeon HD 3200 Grafikkarte. Falls da irgendwer also schon Erfahrungen mit gemacht hat oder näheres weiß, wäre ich für jeden Rat dankbar. :-)
  5. Hallo bloedesvieh,

    ich habe das mit dem Farbwechsel jetzt mal ausprobiert (C#, Frabwechsel im Fenster, i7-2600, Nvidia GTS 450). Denn Effekt, den Du hast, den habe ich nicht. Aber das Flackern ist ganz deutlich wahrnehmbar. Dazu kommt, dass man die Farbwechsel nicht mit der Grafikkarte bzw. dem Bildschirm synchronisieren kann weshalb es zu "Farbschwebungen", d.h. eine der beiden Farben ist kurzzeitig dauerhaft zu sehen, kommt.
    Ich denke, dass übliche Computer-Hardware für Deine Anwendung nicht geeignet ist.
    Sofern es nur um Farbwechsel geht könntest Du Dir ja ein paar Leuchtdioden (in zwei Farben oder RGB-Leds) besorgen und damit einen Diffusor (z.B. milchiges Plexiglas) beleuchten. Wenn Du die Dioden per Mikrocontroller steuerst, dann kannst Du auch problemlos 400Hz ziemlich genau schalten.
  6. Autor dieses Themas

    bloedesvieh

    Kostenloser Webspace von bloedesvieh, auf Homepage erstellen warten

    bloedesvieh hat kostenlosen Webspace.

    darkpandemic schrieb:
    Hallo bloedesvieh,

    ich habe das mit dem Farbwechsel jetzt mal ausprobiert (C#, Frabwechsel im Fenster, i7-2600, Nvidia GTS 450). Denn Effekt, den Du hast, den habe ich nicht. Aber das Flackern ist ganz deutlich wahrnehmbar. Dazu kommt, dass man die Farbwechsel nicht mit der Grafikkarte bzw. dem Bildschirm synchronisieren kann weshalb es zu "Farbschwebungen", d.h. eine der beiden Farben ist kurzzeitig dauerhaft zu sehen, kommt.
    Ich denke, dass übliche Computer-Hardware für Deine Anwendung nicht geeignet ist.
    Sofern es nur um Farbwechsel geht könntest Du Dir ja ein paar Leuchtdioden (in zwei Farben oder RGB-Leds) besorgen und damit einen Diffusor (z.B. milchiges Plexiglas) beleuchten. Wenn Du die Dioden per Mikrocontroller steuerst, dann kannst Du auch problemlos 400Hz ziemlich genau schalten.
    Das klingt fundiert und einleuchtend. In meinem Kopf manifestiert sich jedoch die Frage, ob es wirklich nicht möglich ist, sowas über einen PC/Laptop zu realisieren, oder lediglich nicht üblich.

    Wie auch immer, die Erklärung, dass es daran liegt, dass Bild-Frequenz des Programms und die der Grafikkarte/des Bildschirms nicht übereinstimmen klingt einleuchtend. Ich bezweifel, dass man das sinnvoll mit SDL lösen kann.

    Die Idee mit den Leuchtdioden steht übrigens am Ende der Idee. Ich dachte mir nur, dass ich erstmal an einem Laptop ausprobiere, bevor ich da unnötig Geld rein investiere. ( Zumal es auch wichtig ist, möglichst "Dynamisch" bei der Auswahl der Frequenz zu sein, diese also auch spontan möglichst einfach ändern zu können. )
    Um noch ein "Missverständnis" auszuräumen: Es ist nicht notwendig, eine bestimmte Frequenz zu treffen. Es ist auch nicht zwingend notwendig, die Frequenz genau wissen zu können. Es ist also egal, ob es 100, 101 oder 105 Hz. sind, solange sie es sind. Ich will lediglich möglichst präzise die Frequenz einstellen können, bei der das Gehirn nicht mehr zwischen zwei Zuständen unterscheiden kann. Welche genau das ist, ist von Gehirn zu Gehirn - mehr oder weniger geringfügig - unterschiedlich und ist für meine Zwecke im Grunde unerheblich, ich muss die Frequenz also nicht kennen. ( Auch, wenn diese Festzustellen das geringfügigste Problem darstellen sollte. )

    Da sich SDL wohl als untauglich für solch ein Vorhaben darstellt, hat sich das Thema hier wohl erledigt. Falls jemand das anders sieht, ist rückmeldung natürlich erwünscht. Wenn jemand andere Lösungs- oder Ansatzvorschläge ( andere Sprachen, andere Librarys, andere wasauchimmer ) hat, kann man mir auch gerne so eine Nachricht schreiben. Ich bin da für alles offen.
  7. Arem das liegt überhaupt nicht an SDL...
    Schon mal darüber nachgedacht, dass ein Bildschirm eine bestimmte Bildwiederholungsfrequenz hat?
    Die meisten Bildschirme laufen mit 60FPS oder halt eben 60Hz. Da kannst du noch so lange etwas rumbasteln, alles was du raus kriegst ist max 60Hz. Gewisse Bildschirme/Fernseher schaffen 120Hz. Dies ist besonders geeignet für 3D Filme, bei welchen das Linke Auge dann 60 Bilder pro Sekunde erhält und das rechte Auge 60.
    Wenn du also nicht solch ein Bildschirm hast, kannste es gleich vergessen. Doch auch wenn du einen hast, wird das Resultat nie allzu befriedigend sein. Die Bildwiederholung ist etwas das nicht immer präzise Kontrolliert werden kann. Vieles hängt da von den unpräzisen Timer und Problemen mit System Interrupts ab.

    Ich habe aus Spass das Ganze mal kurz in SFML (eine Multimedia Library in schöne C++, etwas besser als SDL) implementiert.
    Zwar kann ich bei ~100 pseude Hz plötzlich wieder die zwei Farben langsam wechseln sehen, jedoch geschiet das Ganze sehr unruhig und eine Farbe bleibt z.T. etwas länger als die andere. Dies kommt halt davon, dass die Grafikkarte aus den 100 erzeugten Bildern pro Sekunde nun 60 auswählen muss um darzustellen, da der Bildschirm ja gar nicht mehr kann. Da kann es halt zu vielen 'Kollisionen' kommen.

    Ich hoffe das hat etwas Licht ins Ganze gebracht.

    Hier noch der Code falls es jemand interessiert:
    #include <SFML/Graphics.hpp>
    #include <iostream>
    
    int main()
    {
        sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window");
    
    	bool bSwitch = false;
    	int iLimit = 2;
    
    	window.SetFramerateLimit(iLimit);
    
        while(window.IsOpened())
        {
            sf::Event event;
            while(window.PollEvent(event))
            {
                if(event.Type == sf::Event::Closed)
    			    window.Close();
    			else if(event.Type == sf::Event::KeyPressed)
    			{
    				if(event.Key.Code == sf::Keyboard::Add)
    					++iLimit;
    				else if(event.Key.Code == sf::Keyboard::Subtract)
    					--iLimit;
    
    				window.SetFramerateLimit(iLimit);
    				std::cout << iLimit << std::endl;
    			}
            }
    
    		if(bSwitch)
    		{
    			window.Clear(sf::Color(255,0,0));
    			bSwitch = false;
    		}
    		else
    		{
    			window.Clear(sf::Color(0,0,255));
    			bSwitch = true;
    		}
    
            window.Display();
        }
    
    	return 0;
    }


    mfg Lukas

    Beitrag zuletzt geändert: 12.12.2011 18:02:15 von klasset
  8. Autor dieses Themas

    bloedesvieh

    Kostenloser Webspace von bloedesvieh, auf Homepage erstellen warten

    bloedesvieh hat kostenlosen Webspace.

    klasset schrieb:
    Arem das liegt überhaupt nicht an SDL...
    Schon mal darüber nachgedacht, dass ein Bildschirm eine bestimmte Bildwiederholungsfrequenz hat?
    Allerdings. Aber die liegt weit über den erstrebten 13 oder 50 Hz. Die Bildeffekte lassen sich auch nicht durch die Bildwiederholfrequenz erklären. ( Außer, man nimmt das weiter oben benannte Modell - Die Bildwiederholfrequenz liegt nicht synchron mit jener des Bildschirms. )
    klasset schrieb:
    Die meisten Bildschirme laufen mit 60FPS oder halt eben 60Hz. Da kannst du noch so lange etwas rumbasteln, alles was du raus kriegst ist max 60Hz.
    In welchem Jahrhundert? Mein ( uralter Röhrenmonitor ) läuft auf 80Hz.
    klasset schrieb:
    Gewisse Bildschirme/Fernseher schaffen 120Hz. Dies ist besonders geeignet für 3D Filme, bei welchen das Linke Auge dann 60 Bilder pro Sekunde erhält und das rechte Auge 60.
    Soweit plausibel.
    klasset schrieb:
    Wenn du also nicht solch ein Bildschirm hast, kannste es gleich vergessen.
    Gut, Frequenzen von 200 - 400 Hz wären wohl recht daneben. Aber meine erwähnte absolute untergrenze ( 50 Hz ) wäre demnach absolut zu erreichen. Auch Frequenzen, die geringfügig oberhalb liegen, wären denkbar.

    klasset schrieb:
    Doch auch wenn du einen hast, wird das Resultat nie allzu befriedigend sein. Die Bildwiederholung ist etwas das nicht immer präzise Kontrolliert werden kann. Vieles hängt da von den unpräzisen Timer und Problemen mit System Interrupts ab.
    Nun, was unpräzise Timer angeht, habe ich diverse Tips aus der Fakultät Informatik bekommen. Das sollte weniger das Problem sein. Das Problem wird die Angleichung von Bildfrequenz(Bildschirm) und Bildfrequenz(Programm) sein. Aber da sich das - zum aktuellen Zeitpunkt - nicht Zeitnah lösen lässt, werde ich den weiter oben beschriebenen Weg gehen und es einfach per Microcontroller und LED's ( Viel mehr durch eine 7-Segement-Anzeige ) darstellen.

    klasset schrieb:
    Ich habe aus Spass das Ganze mal kurz in SFML (eine Multimedia Library in schöne C++, etwas besser als SDL) implementiert.
    Zwar kann ich bei ~100 pseude Hz plötzlich wieder die zwei Farben langsam wechseln sehen, jedoch geschiet das Ganze sehr unruhig und eine Farbe bleibt z.T. etwas länger als die andere. Dies kommt halt davon, dass die Grafikkarte aus den 100 erzeugten Bildern pro Sekunde nun 60 auswählen muss um darzustellen, da der Bildschirm ja gar nicht mehr kann. Da kann es halt zu vielen 'Kollisionen' kommen.
    Ich werde den Code mal ausprobieren, aber ich fürchte, dass meine Hardware da - wie schon weiter oben erwähnt - einfach nicht mitspielt. Ich werde dann später kommentieren, ob es geklappt hat.
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!