Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.x] Kod działa poprawnie na linuxie, na windowsie juz nie - migający ekran.

Ostatnio zmodyfikowano 2014-05-24 20:06
Autor Wiadomość
S1cK
Temat założony przez niniejszego użytkownika
[SFML 2.x] Kod działa poprawnie na linuxie, na windowsie juz nie - migający ekran.
» 2014-05-23 06:59:50
Mam klasę nazwa, w niej mam zmienną sf::RenderWindow *reWin;
Konstruktor wywołuje tak:
nazwa *k = new nazwa(&oknoApp, dlugosc);
Później następuje przypisanie wskaźników:  reWin = okno;, gdzie okno to argument pobierany w konstruktorze.
Robie jakieś rzeczy rekurencyjnie, w każdej z rekurencji wywołuje funkcję RysujKwadrat, która rysuje kwadrat na reWin i potem go wyświetla: reWin->display(); Kwadraty (koloru np. zielonego) rysuje na narysowanym tle w SFML (szachownicy kwadraty białe i czarne). Niestety podczas reWin->display(); kwadraty jak i tło (szachownica) zaczyna migać (bardzo).
Następnie w głównej pętli mam:
 
C/C++
// tutaj przed pętlą rysuje szachownice, nie moge jej rysować wewnątrz pętli, żeby nie zamazywać rysowanych kwadratów.

while( oknoApp.isOpen() )
{
    //oknoApp.clear(sf::Color::White); zeby nie zamazywac rysowanych kwadratow jest w komentarzu!
    sf::Event event;
    while( oknoApp.pollEvent( event ) )
    {
        if( event.type == sf::Event::Closed )
             oknoApp.close();
       
    }
    // k->rysuj_szachownice();
    // tutaj wywolanie funkcji, ktora wywoluje sie rekurencyjnie
   
    oknoApp.display();
}
Sam algorytm i wyświetlanie działa dobrze. Na linuxie nie miałem żadnych problemów z miganiem okna, kod przerzuciłem z linuxa na windowsa - i bum! Podczas wyświetlania kolejnych kwadratów okno miga bardzoo. Niestety nie mogę zrezygnować z reWin->display() w funkcji RysujKwadrat, gdyż muszę je rysować na bierząco a nie po tym jak algorytm się wykona.. Nie mogę też czyścić ekranu, bo wcześniejsze narysowane kwadraty znikną. jakieś pomysły ?
P-110713
akwes
» 2014-05-23 10:14:31
Spróbuj utworzyć najprostszy przypadek na windowsie i linuksie. Czyli rysując jakiś prosty kwadrat. Zobacz wtedy czy miga i przedstaw kod, którym testowałeś, jeżeli problem nadal występuje.
P-110721
Glazus
» 2014-05-23 10:51:33
Robie jakieś rzeczy rekurencyjnie, w każdej z rekurencji wywołuje funkcję RysujKwadrat, która rysuje kwadrat na reWin i potem go wyświetla: reWin->display(); Kwadraty (koloru np. zielonego) rysuje na narysowanym tle w SFML (szachownicy kwadraty białe i czarne).
Ale... czemu musisz wywoływać funkcję display()?

Nie lepiej zrobić coś takiego:
C/C++
while( oknoApp.isOpen() )
{
    oknoApp.clear( sf::Color::White );
    drawBoardOrSomethingLikeThat(); // w tej funkcji instrukcje które wcześniej zamieszczałeś przed pętlą
    sf::Event event;
    while( oknoApp.pollEvent( event ) )
    {
        if( event.type == sf::Event::Closed )
             oknoApp.close();
       
    }
    // k->rysuj_szachownice();
    // tutaj wywolanie funkcji, ktora wywoluje sie rekurencyjnie
   
    oknoApp.display();
}

Niestety nie mogę zrezygnować z reWin->display() w funkcji RysujKwadrat, gdyż muszę je rysować na bierząco a nie po tym jak algorytm się wykona..
Czemu?
P-110722
S1cK
Temat założony przez niniejszego użytkownika
» 2014-05-24 08:14:08
@akwes
Niestety nie mam dostępu do linuxa aktualnie, na którym odpalałem tamten program. Problem jest taki, że samo display w pętli mruga..
Przykład:
C/C++
k->rysujSzachownice(); // rysowanie szachownicy na reWin (wskaznik na glowne okno)
while( oknoApp.isOpen() )
{
    //oknoApp.clear(sf::Color::White); zeby nie zamazywac rysowanych kwadratow jest w komentarzu!
    sf::Event event;
    while( oknoApp.pollEvent( event ) )
    {
        if( event.type == sf::Event::Closed )
             oknoApp.close();
       
    }
   
    oknoApp.display();
}
Jak widać, nic nie robie w pętli głównej (pierwszym while - isOpen) tylko daje oknoApp.display().. a i tak szachownica mruga.. Czemu ?

@Glazus:
Oczywiście chciałbym tak zrobić, jednak muszę pokazać krok-po-kroku algorytm graficznie. Niestety algorytm opiera się na rekurencji i nie mam jak wrócić do głownej pętli, wyświetlić i potem znowu wrócić do algorytmu.
P-110765
Glazus
» 2014-05-24 12:58:53
W takim razie "problemem" jest to, że SFML wykorzystuje podwójne bufforowanie.

Przykładowo:
C/C++
void test()
{
    sf::RenderWindow Window( sf::VideoMode( 600, 480, 32 ), "Test migania" );
   
    Window.clear( sf::Color::Red );
    Window.display();
    Window.clear( sf::Color::Blue );
   
    while( true )
    {
        Window.display();
    }
}
Taki kod sprawi, że okno będzie nam mrugać na czerwono-niebiesko.
P-110773
S1cK
Temat założony przez niniejszego użytkownika
» 2014-05-24 14:10:18
Więc czemu ten kod działa na linuxie normalnie a na windowsie już nie ?
P-110781
MrPoxipol
» 2014-05-24 15:09:39
Nie możesz dwa razy wywoływać metody sf::Window::display().
P-110784
Glazus
» 2014-05-24 20:06:27
Nie wiem, tym niemniej ciężko cokolwiek więcej powiedzieć nie wiedząc nawet jak wygląda kod, który  sprawia problemy.
P-110796
« 1 »
  Strona 1 z 1