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

[c++][visual studio 2013] Przycinanie się programu w trybie release

Ostatnio zmodyfikowano 2018-12-25 19:58
Autor Wiadomość
pekfos
» 2018-12-24 01:01:41
Nudy. Wspomniałeś, że masz wątki. Nieodpowiednia synchronizacja między nimi może powodować takie objawy.
P-173310
Wicon
Temat założony przez niniejszego użytkownika
» 2018-12-24 01:16:54
Wybacz, że cię znudziłem. Które objawy masz na myśli? Warningi czy wspomniany na samym początku błąd kompilacji? Pewnie znudzę cię jeszcze bardziej jeśli powiem, że synchronizuję wątki zmiennymi bool a nie mutexami. Byłem pewien, że skoro aplikacja działa tak jak ja tego chcę, nie ma żadnych przestojów, wszystko wczytuje się na czas to jest ok.
P-173311
pekfos
» 2018-12-24 01:32:33
Nudy bo w warningach nie ma nic ciekawego.

Pewnie znudzę cię jeszcze bardziej jeśli powiem, że synchronizuję wątki zmiennymi bool a nie mutexami.
Zmiennymi dosłownie typu bool? W takim razie zrobiłeś to błędnie. Takie rozwiązanie nie zapewnia synchronizacji i ma niezdefiniowane zachowanie. Nie musi działać poprawnie i jak najbardziej może działać inaczej przy włączonych optymalizacjach.
P-173312
Wicon
Temat założony przez niniejszego użytkownika
» 2018-12-24 10:09:21
Gra działa już normalnie i w trybie debug i release, przy włączonych optymalizacjach nie kompiluje się wcale. Szukałem jakiś informacji na temat synchronizacji zmiennymi bool, być może nie znalazłem nic dlatego, że tak się nie robi. Ale też nikt nie napisał dlaczego jest to błędne? Mógłbyś objaśnić? Czemu ma niezdefiniowane zachowanie? W wątku głównym operuje na tablicy z indeksami obiektów znajdujących się w polu widzenia lub takich które za chwilę mogą się w tym polu znaleźć. Drugi wątek jednocześnie przekopuje wszystkie dane i tworzy drugą tablice z indeksami obiektów znajdujących się w pobliżu. Gdy drugi wątek kończy prace ustawia wartość zmiennej bool na 0 i wtedy główny wątek przy kolejnym przebiegu pętli kopiuje dane z nowej tablicy z indeksami do starej, po czym ustawia wartość zmiennej bool znów na 1. Główny wątek nigdy nie musi czekać na ten drugi, co więcej tylko główny wątek może nadpisywać dane obiektów, drugi wątek sprawdza jedynie ich pozycję.

EDIT: Ok, czyli jeśli w głównym wątku modyfikuję wartości x,y (pozycje bohatera) a w drugim wątku jednocześnie sprawdzam położenie obiektów porównując ich pozycję z pozycjami właśnie x i y to może to generować problem, tak? I w przypadku tablicy typu NPC, gdzie w głównym wątku także zmieniam ich pozycję a w drugim ją odczytuje to też jest błąd, tak? A fakt, że aplikacja cały czas działała to przypadek, że nigdy nie doszło do wyjątku, w którym jednocześnie nadpisuje i odczytuję to samo miejsce w pamięci? Jak w takim razie używając mutexów zapewnić żeby główny wątek nie musiał czekać? Blokować i odblokowywać mutex w drugim wątku z każdym przebiegiem pętli a w głównym wątku na czas przebiegu całej funkcji obsługującej tablicę NPC? Bo jeśli drugi wątek zajmie mutex na czas sprawdzenia całej tablicy NPC to w najgorszym przypadku wyjdzie na to samo, jak gdybym tą tablice sprawdzał w głównym wątku.
P-173313
pekfos
» 2018-12-24 18:34:45
Jeśli jeden wątek zapisuje wartość do pamięci, a drugi wątek w jakikolwiek sposób używa tej pamięci (czyta, lub też zapisuje), to taka sytuacja ma niezdefiniowane zachowanie. Dostęp do pamięci musi być synchronizowany, albo przez użycie sekcji krytycznych (std::mutex), albo przez użycie operacji atomowych (std::atomic<>, std::atomic_XYZ).
Być może wystarczy, że zamiast swojego bool użyjesz std::atomic_flag, albo od biedy std::atomic<bool>. Użycie typów "atomowych" nie znaczy, że wszystko co z nimi zrobisz będzie poprawnie zsynchronizowane. Poprawne pisanie aplikacji wielowątkowych jest nietrywialne. Poprawne pisanie wydajnych aplikacji wielowątkowych jest trudne.
P-173315
Wicon
Temat założony przez niniejszego użytkownika
» 2018-12-24 23:17:31
Ok, rozumiem. A czy obydwa wątki mogą jednocześnie odczytywać te same dane? Skoro nic się z nimi nie dzieje to chyba nie powinno być problemu? Poprawiam właśnie, synchronizuję mutexami, jutro skończę.

Trochę chyba zboczyliśmy z tematu, może to i dobrze ale nie sądzę, aby to rozwiązało problem z błędem kompilacji z włączoną optymalizacją. Chociaż mój problem częściowo został już rozwiązany, bo kompiluje się w trybie release i wydajność i tak wzrosła względem debug nawet i bez tego. Przy najbardziej obciążonej scenie różnica w fps wynosi ze 150 na 800.
P-173316
pekfos
» 2018-12-24 23:21:48
problem z błędem kompilacji z włączoną optymalizacją.
Nie ma żadnego problemu, póki nie podasz treści błędu.
P-173317
Wicon
Temat założony przez niniejszego użytkownika
» 2018-12-24 23:32:56
Podałem na samym początku:
Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets(607,5): error MSB6006: "link.exe" exited with code -1073741819.
Błąd pojawia się w trakcie generowania kodu.
P-173318
1 « 2 » 3 4
Poprzednia strona Strona 2 z 4 Następna strona