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

[SFML2]Problem z częstotliwością eventu MouseMoved

Ostatnio zmodyfikowano 2014-05-28 13:53
Autor Wiadomość
qba10
Temat założony przez niniejszego użytkownika
[SFML2]Problem z częstotliwością eventu MouseMoved
» 2014-05-26 20:27:52
Hej

Napotkałem się z bardzo dziwnym problemem.
Podczas poruszania myszką w oknie, pętla odpowiedzialna za ściąganie eventów z kolejki (while(poolEvent(Event)) ) czeka aż przestane poruszać myszką. Przez ten czas pętla obsługi zdarzeń ciągle się kręci i cały program na tą chwilę się zawiesza.
System na którym pracuje to:
 Ubuntu 14.04
 g++ 4.8.2
 SFML 2.1 ściągnięty z repo

Program kompilowałem pod Visual 2012 na Windowsie 7 ale tam problem nie występuje.
P-110920
pekfos
» 2014-05-26 20:48:14
Podaj kod.
P-110921
qba10
Temat założony przez niniejszego użytkownika
» 2014-05-26 20:55:16
C/C++
void AppWindow::Events() {
    while( this->appWindow->pollEvent( this->event ) ) {
        if( this->event.type == sf::Event::Closed ) {
            this->appWindow->close();
        }
       
        for( size_t i = 0; i < DataContainer::EventList.size(); i++ ) {
            if( this->event.type == DataContainer::EventList.at( i ).EventType ) {
               
               
                if( this->event.type == sf::Event::KeyPressed || this->event.type == sf::Event::KeyReleased ) {
                    if( DataContainer::EventList.at( i ).KeyAction != sf::Keyboard::Unknown && DataContainer::EventList.at( i ).KeyAction == this->event.key.code )
                        (( DataContainer::EventList.at( i ).object )->*( DataContainer::EventList.at( i ).ActionFunction ) )( this->event );
                   
                } else {
                    (( DataContainer::EventList.at( i ).object )->*( DataContainer::EventList.at( i ).ActionFunction ) )( this->event );
                   
                }
               
            }
        }
       
    }
}

Jeżeli Ci to coś pomoże... Raczej standardowa wersja. Metoda wykonuję się w standardowej pętli gry. W tym momencie nie mam zadeklarowanych żadnych zdarzeń myszki.
problemem jest to że w jednym obrocie głównej pętli gry ta pętla kręci się tak długo aż przestane ruszać myszką. Co implikuje że główna pętla gry czeka na tą pętle a gra się zwiesza.
P-110923
pekfos
» 2014-05-26 21:06:33
W przykładowym programie ze zdarzeniami z kursu problem też występuje?
P-110924
qba10
Temat założony przez niniejszego użytkownika
» 2014-05-26 21:15:20
tak
P-110925
qba10
Temat założony przez niniejszego użytkownika
» 2014-05-26 21:47:48
Czy jest na przykład możliwość wyczyszczenia kolejki zdarzeń?
Jeżeli tak miałbym pomysł jak obejść to dziwne zachowanie programu.

Problemem zapewne jest zbyt duża częstotliwość dodawania nowych zdarzeń. Rozwiązaniem pewnie było by również zmniejszenie tej częstotliwościowi.
Ale
P-110926
qba10
Temat założony przez niniejszego użytkownika
» 2014-05-27 18:31:48
W źródłach SFML dodałem warunek, żeby dodawało co 20 zdarzenie myszki do kolejki eventów, ale traktuje to jako rozwiązanie tymczasowe. Czy ma ktoś pomysł przez co tak się może dziać ?
P-110961
ison
» 2014-05-27 19:30:34
Czy ma ktoś pomysł przez co tak się może dziać ?
Powód dlaczego tak się dzieje jest bardzo prosty, podczas ruszania myszką generowane są bez przerwy nowe eventy, a pętla nie nadąża ich analizować (while( this->appWindow->pollEvent( this->event ) )).
Problem jest całkiem ciekawy. Rozwiązaniem byłaby asynchroniczna funkcja filtrująca eventy, które następnie są pobierane przez pollEvent. Wtedy można by filtrować eventy ruchu myszki aby brać tylko co n-ty event, aczkolwiek i tak nie byłoby to idealne rozwiązanie, gdyż kluczowy jest ostatni event ruchu myszki (tzn. końcowa pozycja), która w tym przypadku byłaby najprawdopodobniej odrzucona. SFML nie oferuje asynchronicznej funkcji do filtrowania eventów.

Inne rozwiązanie, nieco lepsze, polegałoby na użyciu metody typu pollAllEvents() i następnie przeanalizowaniu ich. Wtedy podczas analizy wszystkich pobranych eventów nie dochodziłyby nowe (czekałyby na kolejną klatkę i pollAllEvents()). Minus jest taki, że podczas ciągłego ruchu myszką, z klatki na klatkę tych eventów pobranych z pollAllEvents() byłoby coraz więcej (analizowanie eventu trwa dłużej niż dołożenie nowego), ale to byłoby akurat normalne. SFML nie oferuje jednak takiej metody.

Najprostszym rozwiązaniem będzie wymiana myszki na taką z mniejszym DPI.
P-110965
« 1 » 2
  Strona 1 z 2 Następna strona