- Symulator MaSzyna -

Symulator EU07 (i nie tylko) => Na warsztacie => Wątek zaczęty przez: panthero w 23 Kwietnia 2008, 14:06:53

Tytuł: Optymalizacja symulatora
Wiadomość wysłana przez: panthero w 23 Kwietnia 2008, 14:06:53
Więc na początek - kilka godzin męczyłem się wczoraj z portowaniem kodu z BC++B 5 na BC++B 6 - z marnym skutkiem - wprawdzie udało się ogarnąć błędy występujące zarówno w czasie kompilacji jak i linkowania, ale efekt był marny - symek nie ładował obrazków ani dźwięków - słowem tragedia. Z tego co przekazał mi @KURS90 to symek nie za bardzo chciał kompilować się w innym środowisku niż BC++ 5. Ale trzeba iść z duchem czasu więc ściągnąłem i zainstalowałem Turbo C++ Explorer - najnowsze dziecko Borlanda z tej rodziny i tutaj wszystko pięknie działa bez dodatkowych zmian w kodzie (mały rebuilt unitów pascalowych). Mam więc bazę i jako tako przyznaję - nie wszystko tutaj rozumiem, ale na początek zabieram się za optymalizację biblioteki odpowiedzialnej za obliczenia na wektorach - to będzie pierwszy punkt pracy. Na razie tyle.

Przenoszę.
Akvin
Tytuł: Odp: Optymalizacja symulatora
Wiadomość wysłana przez: panthero w 24 Kwietnia 2008, 02:26:33
Co w zasadzie mam zamiar zrobić w kodzie:

Na razie tyle
Tytuł: Odp: Optymalizacja symulatora
Wiadomość wysłana przez: Ra w 24 Kwietnia 2008, 02:50:42
Trzeba uważać z pozycjami obiektów zapisanymi w typie single. Typ ten ma mantysę 23 bit, czyli niecałe 7 cyfr dziesiętnych. Jeśli oddalimy pojazd od środka układu o 8km mamy niedokładność obliczeń rzędu 1mm. Przy 83km daje to już 10mm drgań wynikających z błędów obliczeń z użyciem takiej mantysy. (Scenerie raczej nie mają większego promienia.)

Kiedyś w symulatorze objawiało się to zwiększonymi drganiami przy oddalaniu się od środka, po czym zostało poprawione - podejrzewam, że poprzez zwiększenie typu. Może się wydawać, że wszystko jest dobrze, póki się jest niedaleko od początku układu współrzędnych. Ale w odległości np. 100km od środka będzie już rzucało.

Dobrym rozwiązaniem mogłoby być przemieszczanie środka układu współrzędnych. Ale nie wiem na ile zaawansowanych zmian to wymaga. Można by podzielić scenerię na kratki wielkości np. 8km, a numer kratki trzymać w oddzielnym bajcie.

Innym rozwiązaniem może być przechowywanie pozycji jako int z wartością w [mm]. Tylko wtedy dochodzą konwersje na typ zmiennoprzecinkowy do obliczeń. (Też trzeba przemieszczać początek układu robiąc dzielenie modulo, jedynie pamiętanie współrzędnej obiektów wymaga 32 bitów, a nie 64.)
Tytuł: Odp: Optymalizacja symulatora
Wiadomość wysłana przez: uetam w 24 Kwietnia 2008, 12:22:08
Kiedyś w symulatorze objawiało się to zwiększonymi drganiami przy oddalaniu się od środka, po czym zostało poprawione - podejrzewam, że poprzez zwiększenie typu. Może się wydawać, że wszystko jest dobrze, póki się jest niedaleko od początku układu współrzędnych. Ale w odległości np. 100km od środka będzie już rzucało.
yb właśnie poprawił to rzucanie. Jestem po testach - 100 km od środka układu nie trzęsie nic a nic.
Tytuł: Odp: Optymalizacja symulatora
Wiadomość wysłana przez: Krzysiek626 w 24 Kwietnia 2008, 13:09:32
Kiedyś w symulatorze objawiało się to zwiększonymi drganiami przy oddalaniu się od środka, po czym zostało poprawione - podejrzewam, że poprzez zwiększenie typu. Może się wydawać, że wszystko jest dobrze, póki się jest niedaleko od początku układu współrzędnych. Ale w odległości np. 100km od środka będzie już rzucało.
yb właśnie poprawił to rzucanie. Jestem po testach - 100 km od środka układu nie trzęsie nic a nic.
@Mateu, sprawdziłeś to na starym byku? Chodzi jeszcze o prawidłowe bujanie kamery.
Pytanie, jak optymalizacja exe może wpłynąć na szybkość ładowania scenerii?
W przypadku dobrze wypasionych scn ten czas obecnie dochodzi do kilkunastu minut.
Tytuł: Odp: Optymalizacja symulatora
Wiadomość wysłana przez: youBy w 24 Kwietnia 2008, 14:34:08
Ja zastosowałem sztuczkę, iż przy oddaleniu się o więcej niż 10 km od początku układu współrzędnych cała sceneria zostaje przesunięta o 10km w "tył". Nie wiem jak wyglądają wyniki po 40-50 przeskokach (sądzę, że nie ma problemów, ale to trzeba zbadać dogłębnie).

Cytuj
Pytanie, jak optymalizacja exe może wpłynąć na szybkość ładowania scenerii?
W przypadku dobrze wypasionych scn ten czas obecnie dochodzi do kilkunastu minut.
Moim zdaniem przydałyby się scenerie binarne, ale zrobienie tego może wymagać głębokich modyfikacji kodu.
Tytuł: Odp: Optymalizacja symulatora
Wiadomość wysłana przez: janek32 w 24 Kwietnia 2008, 16:41:19
Moim zdaniem przydałyby się scenerie binarne, ale zrobienie tego może wymagać głębokich modyfikacji kodu.
Takie scenerie są w TRS?
Tytuł: Odp: Optymalizacja symulatora
Wiadomość wysłana przez: uetam w 24 Kwietnia 2008, 17:26:04
Moim zdaniem przydałyby się scenerie binarne, ale zrobienie tego może wymagać głębokich modyfikacji kodu.
Takie scenerie są w TRS?
Y, ale co to ma wspolnego z tematem? Nikomu nie bedzie sie chcialo robic importu jezeli do tego zmierzasz ;]
Tytuł: Odp: Optymalizacja symulatora
Wiadomość wysłana przez: youBy w 24 Kwietnia 2008, 17:36:51
Przy optymalizacji należałoby również dokonać prób z wielordzeniowością procesorów (zawsze to troszkę więcej FPS będzie). Moje pierwsze próby wykazały tendencję spadkową, być może ze względu na złe podejście do sprawy, gdyż nie zajmowałem się tym kiedykolwiek wcześniej.
Tytuł: Odp: Optymalizacja symulatora
Wiadomość wysłana przez: kj w 30 Kwietnia 2008, 14:29:36
Programowanie wielowątkowe pociąga za sobą problem synchronizacji i blokowania danych. Problem wczytywania plików definiujących obiekty 3D faktycznie możnaby rozwiązać przy użyciu konwersji na formaty binarne (odpada konieczność parsowania pliku). Z teksturami może być nieco gorzej. Wczytywanie tekstur można by zaimplementować przy użyciu mapowania pliku w pamięci (w POSIX: mmap(), w Win32 - niestety nie wiem, nie programuję pod tą platformę). Moje małe testy wykazały 4-krotne przyspieszenie przy wczytywaniu pliku o rozmiarze 1MB oraz ponad 30-krotne w przypadku pliku o rozmiarze 10MB.

Jeśli chodzi o wstawki asemblerowe i ogólnie przepisywaniu kodu do asemblera - faktycznie, użycie SSE(2) może tutaj pomóc, jednak samo używanie wstawek w kodzie nie zawsze jest zalecane. Wstawki burzą optymalizacje, wprowadzane przez kompilator, dlatego dobrze by było dokładnie rozważyć, czy wstawienie wstawki w danym miejscu kodu przyniesie więcej pożytku, czy szkody.

Odniosę się jeszcze do pisania symulatora w dwóch językach. Może lepiej przepisać wszystko .pas na .cpp lub .c? Kompilatory Pascala mają złą sławę jeśli chodzi o jakość generowanego kodu. Nie wspomnę już o tym, że sam Pascal ma w sobie pewne mechanizmy, które są przydatne do wyszukiwania błędów, ale niekorzystnie wpływają na wydajność.

Oprócz tego warto się też zapoznać z dwoma dokumentami firmy AMD, dokładnie omawiającymi problem optymalizacji programu:
1 (http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/22007.pdf), 2 (http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/25112.PDF)