Schnelles zeichnen



  • Hallo!

    Ich programmiere derzeit eine Karaoke Software nach dem Modell von Singstar. Mein Problem ist, ich muss relativ schnell die Tonhöhe einzeichnen können, mit den "normalen" C++ funktionen wie z.b. DrawIcon kriege ich probleme mim zeichnen. Es erscheinen "weiße linien" innerhalb des icons wahrscheinlich zeichnet er nicht schnell genug. Kann ich diese "weißen linien" wegbekommen indem ich das zeichnen mit directx oder openGL mache? Wenn ja welches von beiden könntet ihr mir empfehlen? Gibt es irgendwo ein gutes einsteigertutorial? Ich habe nämlich leider davon überhaupt keine ahnung, da ich normalerweise nur anwendungen programmiere...

    Danke

    MFG

    Hansi


  • Mod

    hmm was fuer weisse linien?



  • Wie gesagt ich schätze, dass er nicht schnell genug zeichnet...
    Das sieht so aus als würde das icon flackern... Ich muss das icon nämlich ziemlich oft in der sekunde neu zeichnen (ca. 20 mal). Meint ihr mit DirectX könnte ich dieses Problem beheben? Wo gibts denn en gutes Tutorial?

    Danke

    MFG

    Hansi



  • Hansi schrieb:

    Wie gesagt ich schätze, dass er nicht schnell genug zeichnet...
    Das sieht so aus als würde das icon flackern... Ich muss das icon nämlich ziemlich oft in der sekunde neu zeichnen (ca. 20 mal). Meint ihr mit DirectX könnte ich dieses Problem beheben? Wo gibts denn en gutes Tutorial?

    Ob du dieses Problem mit DirectX beheben kannst, haengt davon ab, was genau dein Problem verursacht. 😉 Das "schnell genug zeichnen" ists eher nicht, auch mit normaler WinAPI muessten 20 fps locker drinnen sein ("Ziemlich oft in der Sekunde neu zeichnen" faengt IMO erst bei 100 fps an 😉 ). Zeig doch bitte mal einen Screenshot deines Problems und/oder den Code, der es verursacht!


  • Mod

    Hansi schrieb:

    Wie gesagt ich schätze, dass er nicht schnell genug zeichnet...
    Das sieht so aus als würde das icon flackern... Ich muss das icon nämlich ziemlich oft in der sekunde neu zeichnen (ca. 20 mal). Meint ihr mit DirectX könnte ich dieses Problem beheben? Wo gibts denn en gutes Tutorial?

    liegt vermutlich daran dass du WM_ERASEBKGND nicht abfaengst und er jedesmal den bildschirm erstmal loescht, bevor du etwas draufzeichnest, was dann zu abwehcselnden weis-icon flackern resultiert.



  • Hallo, ich glaub ihr habt recht... Also diese operation führt er immer in nem thread aus(ich habe jetzt mal die rechenoperationen des FFT-Algorithmusses rauskommentiert...):

    void Thread(PVOID)
    {   HICON i1,i2;
    i1=LoadIcon(hInst,(LPCTSTR)IDI_ICON1);
    i2=LoadIcon(hInst,(LPCTSTR)IDI_ICON2); 
    HDC hdc;
    hdc=GetDC(hWnd);
    	do
        {
            /* static float spectrum[SPECTRUMSIZE];
            float        dominanthz = 0;
            float        max;
            int          dominantnote = 0;
            float        binsize = BINSIZE;
    
            result = channel->getSpectrum(spectrum, SPECTRUMSIZE, 0, FMOD_DSP_FFT_WINDOW_TRIANGLE);
            ERRCHECK(result);
    
            max = 0;
    
            for (count = 25; count < SPECTRUMSIZE; count++)
            {
                if (spectrum[count] > 0.01f && spectrum[count] > max)
                {
                    max = spectrum[count];
                    bin = count;
                }
            }        
    
            dominanthz  = (float)bin * BINSIZE;      
            dominantnote = 0;
            for (count = 0; count < 120; count++)
            {
               if (dominanthz >= notefreq[count] && dominanthz < notefreq[count +1])
                 {
    
                    if (fabs(dominanthz - notefreq[count]) < fabs(dominanthz - notefreq[count+1]))
                    {
                        dominantnote = count;
                    }
                    else
                    {
                        dominantnote = count + 1;
                    }
                    break;
                 }
            }
    		char s[200];
             system2->update(); */
    
    		DrawIcon(hdc,1,old,i2);
    		old=dominanthz;
    		DrawIcon(hdc,1,dominanthz,i1);
    
        }
    	ReleaseDC(hWnd,hdc);
    }
    

    i2 ist in diesem Fall einfach weiß, damit das alte icon übermalt wird und i1 ist das icon, das gezeichnet werden soll. Was muss ich denn daran jetzt verbessern, damit der code schneller wird?

    Danke

    MFG

    Hansi


  • Mod

    zeichne nicht direkt auf den bildschirm, sondern erst in ein anderen hdc (kannst z.b. mit createcompatiblehdc erstellen) und wenn du fertig bist, einfach den neuen hdc z.b. mit bitblt ueber den screen zeichnen lassen.



  • Vielleicht auch einfach macl nach Double Buffering googlen, das Konzept loest dein Problem in jedem Fall. f'`8k

    Gruß, TGGC (\-/ has leading)



  • Kann zwar nichts zum Thema beitragen, aber das Programm interessiert mich. Programmierst Du das für Dich? Hättest Du Interesse an einer Kooperation?

    wenn ja kontaktiere mich mal boehnke@teqnet.de


Anmelden zum Antworten