Tam, gdzie pracowałem, zawsze używamy wielu poziomów profilowania; jeśli zauważysz problem, po prostu przesuń się nieco dalej w dół listy, aż zorientujesz się, co się dzieje:
- „Human profiler”, czyli po prostu zagraj w grę ; czy czasami wydaje się powolny lub „zaczep”? Zauważyłeś gwałtowne animacje? (Jako programista pamiętaj, że będziesz bardziej wrażliwy na niektóre problemy z wydajnością i nieświadomy innych. Odpowiednio zaplanuj dodatkowe testy).
- Włącz wyświetlacz FPS , który jest przesuwanym 5-sekundowym średnim FPS. Bardzo małe koszty ogólne do obliczenia i wyświetlenia.
- Włącz paski profilu , które są tylko serią quadów (kolory ROYGBIV), które reprezentują różne części ramki (np. Vblank, preframe, update, collision, render, postframe) za pomocą prostego timera „stopera” wokół każdej sekcji kodu . Aby podkreślić to, czego chcemy, ustawiliśmy pasek o szerokości jednego ekranu, aby był reprezentatywny dla ramki docelowej 60 Hz, więc naprawdę łatwo jest sprawdzić, czy np. Masz 50% mniej budżetu (tylko pół słupka), czy 50% więcej ( pasek owija się i staje się półtora paska). Łatwo jest również stwierdzić, co ogólnie zjada większość ramki: czerwony = renderowanie, żółty = aktualizacja itp.
- Zbuduj specjalną oprzyrządowaną kompilację, która wstawia „stoper” jak kod wokół każdej funkcji. (Pamiętaj, że możesz przy tym zrobić ogromne uderzenie wydajności, dcache i icache, więc jest to zdecydowanie ingerujące. Ale jeśli brakuje odpowiedniego profilera próbkowania lub przyzwoitej obsługi procesora, jest to dopuszczalna opcja. Możesz także być sprytny o nagrywaniu minimum danych o wejściu / wyjściu funkcji i późniejszej przebudowie śladów wywołań.) Kiedy budowaliśmy nasze, naśladowaliśmy wiele formatu wyjściowego gprof .
- Co najlepsze, uruchom profilowanie próbkowania ; VTune i CodeAnalyst są dostępne dla x86 i x64, masz różne środowiska symulacji lub emulacji, które mogą dawać ci dane tutaj.
(Zabawna historia z ubiegłorocznego GDC programisty grafiki, który zrobił sobie cztery zdjęcia - szczęśliwego, obojętnego, zirytowanego i wściekłego - i pokazał odpowiednie zdjęcie w rogu wewnętrznych kompilacji na podstawie liczby klatek na sekundę. twórcy treści szybko nauczyli się nie włączać skomplikowanych shaderów dla wszystkich swoich obiektów i środowisk: rozgniewałyby programistę. Zobacz moc sprzężenia zwrotnego).
Pamiętaj, że możesz również robić zabawne rzeczy, takie jak ciągłe wykresy „pasków profilu”, dzięki czemu możesz zobaczyć wzorce pików („tracimy ramkę co 7 klatek”) lub podobne.
Aby odpowiedzieć bezpośrednio na twoje pytanie: z mojego doświadczenia, podczas gdy kuszące (i często satysfakcjonujące - zwykle czegoś się uczę), przepisanie pojedynczych funkcji / modułów w celu zoptymalizowania liczby instrukcji lub wydajności icache lub dcache, i faktycznie musimy to zrobić czasami, gdy mamy szczególnie wstrętny problem z wydajnością, zdecydowana większość problemów z wydajnością, z którymi regularnie się borykamy, sprowadza się do projektowania . Na przykład:
- Czy powinniśmy buforować w pamięci RAM lub ponownie ładować z dysku ramki animacji stanu „ataku” odtwarzacza? Co powiesz na każdego wroga? Nie mamy pamięci RAM, aby wykonać je wszystkie, ale obciążenia dysków są drogie! Możesz zobaczyć zaczep, jeśli pojawi się 5 lub 6 różnych wrogów naraz! (Dobra, a co powiesz na oszałamiające tarło?)
- Czy wykonujemy jeden rodzaj operacji na wszystkich cząsteczkach, czy wszystkie operacje na pojedynczej cząsteczce? (Jest to kompromis icache / dcache, a odpowiedź nie zawsze jest jasna.) Co powiesz na rozebranie wszystkich cząstek i przechowywanie razem pozycji (słynna „struktura tablic”) w porównaniu do przechowywania wszystkich danych cząstek w jednym miejscu („ tablica struktur ”).
Słyszysz go, dopóki nie stanie się nieprzyjemny na kursach informatycznych na uniwersytecie, ale: tak naprawdę chodzi o struktury danych i algorytmy. Poświęcenie czasu na projektowanie algorytmów i przepływów danych zapewni ci więcej korzyści. (Upewnij się, że zapoznałeś się z doskonałymi slajdami z zakresu programowania obiektowego przedstawionymi przez pracowników Sony Developer Services, aby uzyskać wgląd tutaj.) To nie „wydaje się” jak optymalizacja; to głównie czas spędzany z tablicą lub narzędziem UML lub tworzeniem wielu prototypów, zamiast przyspieszania bieżącego kodu. Ale ogólnie jest o wiele bardziej opłacalne.
I jeszcze jedna przydatna heurystyka: jeśli jesteś blisko „rdzenia” silnika, warto zoptymalizować (np. Wektoryzację mnożenia macierzy!) Dodatkowego eksperymentu i eksperymentów. Im dalej od rdzenia, tym mniej powinieneś się tym przejmować, chyba że jedno z narzędzi profilujących mówi inaczej.