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:
while( oknoApp.isOpen() ) { sf::Event event; while( oknoApp.pollEvent( event ) ) { if( event.type == sf::Event::Closed ) oknoApp.close(); } 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 ? |
|
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. |
|
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: while( oknoApp.isOpen() ) { oknoApp.clear( sf::Color::White ); drawBoardOrSomethingLikeThat(); sf::Event event; while( oknoApp.pollEvent( event ) ) { if( event.type == sf::Event::Closed ) oknoApp.close(); } 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? |
|
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: k->rysujSzachownice(); while( oknoApp.isOpen() ) { 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. |
|
Glazus |
» 2014-05-24 12:58:53 W takim razie "problemem" jest to, że SFML wykorzystuje podwójne bufforowanie. Przykładowo: 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. |
|
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 ? |
|
MrPoxipol |
» 2014-05-24 15:09:39 Nie możesz dwa razy wywoływać metody sf::Window::display(). |
|
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. |
|
« 1 » |