際際滷

際際滷Share a Scribd company logo
C++ w programowaniu gier

Adam Sawicki - www.asawicki.info - 30 pa添dziernika 2010
Dlaczego C++?

 W jakim jzyku pisze si gry?


 Powa甜ne tytuy na PC i konsole - tylko C++!
 Inne platformy  r坦甜nie
   iPhone, iPad  Objective C (oraz C++)
   Android  Java (oraz C++)
   Web  ActionScript (Flash), JavaScript, 
 Amatorskie projekty  dowolnie
   XNA, Java, Python, cokolwiek

 2
Dlaczego C++?
C++ to nie najwa甜niejszy jzyk na wiecie.
TIOBE Programming Community Index for October 2010
                                               [TIOBE]




3
Dlaczego C++?

 C++ nie jest idealny [C++FQA]
   Jest trudny i obszerny
          Np. wska添niki, szablony, przeci甜enia
      Wiele rzeczy nieustandaryzowane
          Np. stringi, kontenery, obsuga bd坦w, brak ABI
      Uboga biblioteka standardowa
      Niski poziom
          Potrzeba du甜o kodu, 甜eby cokolwiek napisa
          atwo o r坦甜norodne bdy, np. w zarzdzaniu pamici




 4
Dlaczego C++?

 Jednak C++ to najlepszy/jedyny wyb坦r do gier
   Dostatecznie wysoki poziom, by pisa zo甜one programy
          Np. programowanie obiektowe
      Dostatecznie niski poziom, by pisa wydajny kod
          Np. wska添niki, brak wirtualnej maszyny, rczne zarzdzanie
           pamici
      Jest szeroko wspieranym standardem
          API, biblioteki i silniki do gier maj zwykle interfejs do C/C++
      Istniej kompilatory na interesujce nas platformy
          PC/Windows, Xbox 360, PlayStation 3



 5
Nie kombinuj

 W programowaniu gier chodzi o to, 甜eby napisa gr
 Warto pisa wszystko jak najprociej
 Dlatego nie kombinuj!
   Nie musisz by mistrzem in甜ynierii oprogramowania
          Nie powiniene przekombinowa z programowaniem
           obiektowym i wzorcami projektowymi
      Nie musisz zna na pami standardu C++
          Nie powiniene przekombinowa z preprocesorem, szablonami
           i przeci甜aniem operator坦w




 6
C++ a programowanie gier
 Programowanie gier dopiero zaczyna si tam, gdzie
     koczy si nauka C++
      Problem z konstruktorem klasy? Zrobi metod Init!
      Problem z const correctness? Immutability, koncepcja
       deskryptora.
      Problem z singletonem? Jawnie inicjalizowa i finalizowa
       podsystemy!
      Za du甜o getter坦w i setter坦w? Pisa struktury, pola
       publiczne!
      Wiele zagadnie typowych w programowaniu gier
       [GPPATTERNS]
          Np. podw坦jne buforowanie, architektura komponentowa, pula
           obiek坦w


 7
Data-Driven
                         
              "Boss": {
                   "Life": 1000,
                   "Armor": 200,
                   "Weapon": "Laser"
              },


              "Laser": {
                   "ParticleEffect":
                    "LaserEffect02",
                   "Damage": 1000,
                   "Duration": 2.5,
                   "Cooldown": 0.7
              }


8
Optymalizacja
 Optymalizacja  co w praktyce oznacza?
   Jednym kojarzy si z doborem algorytmu o dobrej
    zo甜onoci asymptotycznej
   Innym kojarzy si z przepisaniem algorytmu na asembler
 Prawda le甜y porodku!
   Du甜e obiekty przekazywa i zwraca przez wska添nik lub
    referencj, nie przez warto
   Upraszcza obliczenia matematyczne, mno甜y zamiast
    dzieli
   Nie definiowa zo甜onych zmiennych wewntrz ptli
   Nie ufa optymalizacji kompilatora 


 9
安霞糸温逮稼看
                        Dodawanie,
                       odejmowanie,
                         mno甜enie

                     Dzielenie, funkcje
                     transcendentalne

                    Branching, metody
                    wirtualne, skok pod
                         wska添nik


               Dynamiczna alokacja pamici



        Zasoby systemowe  tekstury, wtki, gniazda



                Wejcie-wyjcie  pliki, sie



10
Optymalizacja




 Nietrafienie w pami podrczn  cache miss
   1980: Odwoanie do pamici RAM  1 cykl procesora
   2009: Odwoanie do pamici RAM  400 cykli procesora
                                                      [POOP]
 11
Optymalizacja

 Lokalno odwoa wa甜niejsza, ni甜 ilo oblicze
   Programowanie obiektowe 
   Programowanie zorientowane na dane 
   Obiekty alokowane osobno, rozrzucone po pamici 
   Obiekty w tablicy, w cigym obszarze pamici 
   Pakowanie danych
         short, char
         Flagi bitowe
         Pola bitowe
         Nawet zmiana kolejnoci p坦l mo甜e wpyn na wydajno!


 12
Najlepsza optymalizacja
 Najszybszy kod to taki, kt坦ry nigdy si nie wykonuje
 Precalc  przygotowa dane wczeniej, nie liczy za
  ka甜dym razem
   Podczas wczytywania gry NIE parsowa plik坦w tekstowych,
    XML, modeli OBJ, tekstur PNG, nie kompilowa shader坦w
   Edytor lub inne narzdzia powinny przygotowa assety w
    docelowym formacie: modele do wczytania prosto do VB/VBO,
    tekstury w DDS (ewentualnie JPEG), wasne formaty plik坦w,
    VFS
   Podczas dziaania gry NIE liczy w ka甜dej klatce tego, co
    mo甜na przygotowa raz lub policzy raz na jaki czas (np. w
    AI)
 Stosowa culling i podzia przestrzeni, aby nie
  przetwarza tego, czego nie wida lub co nie jest istotne
 LOD  Level od Detail  kiedy mimo wszystko trzeba
  przetwarza du甜o danych, mo甜na mniej szczeg坦owo
 13
Wyjtki

 W kodzie powa甜nej gry wyjtki powinny by
  nieu甜ywane, a ich obsuga wyczona
   Brak standardowego sposobu obsugi bd坦w w C++
   Niedoskonao wyjtk坦w C++ - brak finally, RAII nie jest
    powszechne
   Pojcie bdu w grze nie ma takiego sensu jak w
    programie
   Wczone wsparcie dla wyjtk坦w w kompilatorze C++ to
    du甜a strata wydajnoci, nawet kiedy wyjtki nie s
    faktycznie u甜ywane
   Kompilatory C++ na konsolach nie wspieraj wyjtk坦w
    [KosztWyjtk坦w]

 14
STL
 STL-a te甜 czsto nie u甜ywa si w programowaniu
 gier
  Wprawdzie warto mie szablony kontener坦w i mog
     dziaa wydajnie,
    jednak STL robi zbyt du甜o dynamicznych alokacji
     pamici.
    String坦w u甜ywa tylko do pokazywania tekstu
     u甜ytkownikowi, nie wewntrznie w kodzie gry
    Unika std::list, std::set, std::map, najlepszy jest
     std::vector
    EASTL  implementacja STL dostosowana do
     programowania gier [EASTL], udostpniona ostatnio za
     darmo [EASTL/GIT]

15
Programowanie r坦wnolege
 To dziedzina obszerna, trudna, wci甜 dojrzewajca,
 ale bardzo wa甜na, opacalna i ju甜 obowizkowa!
 Wtki i muteksy to dopiero pocztek




 16
Narzdzia
 Jedyna suszna platforma: Windows :)
 Jedyne suszne IDE: Visual C++ :)


 Narzdzia pomocnicze:
   ledzenie wyciek坦w pamici: wasny alokator pamici,
    Visual Leak Detector
   Profilowanie: wasna instrumentacja, Very Sleepy, AMD
    CodeAnalyst, Intel Vtune
   Debugowanie bibliotek: Debug version of Direct3D, PIX,
    PhysX Visual Debugger
   Statyczna analiza kodu: CppCheck

 17
Bibliografia
 [TIOBE] TIOBE Programming Community Index for October 2010
   http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
 [C++FQA] C++ FQA, Yossi Kreinin
   http://yosefk.com/c++fqa/
 [GPPATTERNS] Game Programming Patterns, Robert Nystrom
   http://gameprogrammingpatterns.com/
 [POOP] Pitfalls of Object Oriented Programming, Tony Albrecht (Sony
  Computer Entertainment Europe)
   http://bit.ly/90fCdE
 [KosztWyjtk坦w] Koszt wyjtk坦w, forum.gamedev.pl
   http://forum.gamedev.pl/index.php/topic,19151.msg229335.html#msg229335
 [EASTL] EASTL -- Electronic Arts Standard Template Library
   http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html
 [EASTL/GIT] paulhodge / EASTL
   http://github.com/paulhodge/EASTL



 18

More Related Content

C++ w programowaniu gier

  • 1. C++ w programowaniu gier Adam Sawicki - www.asawicki.info - 30 pa添dziernika 2010
  • 2. Dlaczego C++? W jakim jzyku pisze si gry? Powa甜ne tytuy na PC i konsole - tylko C++! Inne platformy r坦甜nie iPhone, iPad Objective C (oraz C++) Android Java (oraz C++) Web ActionScript (Flash), JavaScript, Amatorskie projekty dowolnie XNA, Java, Python, cokolwiek 2
  • 3. Dlaczego C++? C++ to nie najwa甜niejszy jzyk na wiecie. TIOBE Programming Community Index for October 2010 [TIOBE] 3
  • 4. Dlaczego C++? C++ nie jest idealny [C++FQA] Jest trudny i obszerny Np. wska添niki, szablony, przeci甜enia Wiele rzeczy nieustandaryzowane Np. stringi, kontenery, obsuga bd坦w, brak ABI Uboga biblioteka standardowa Niski poziom Potrzeba du甜o kodu, 甜eby cokolwiek napisa atwo o r坦甜norodne bdy, np. w zarzdzaniu pamici 4
  • 5. Dlaczego C++? Jednak C++ to najlepszy/jedyny wyb坦r do gier Dostatecznie wysoki poziom, by pisa zo甜one programy Np. programowanie obiektowe Dostatecznie niski poziom, by pisa wydajny kod Np. wska添niki, brak wirtualnej maszyny, rczne zarzdzanie pamici Jest szeroko wspieranym standardem API, biblioteki i silniki do gier maj zwykle interfejs do C/C++ Istniej kompilatory na interesujce nas platformy PC/Windows, Xbox 360, PlayStation 3 5
  • 6. Nie kombinuj W programowaniu gier chodzi o to, 甜eby napisa gr Warto pisa wszystko jak najprociej Dlatego nie kombinuj! Nie musisz by mistrzem in甜ynierii oprogramowania Nie powiniene przekombinowa z programowaniem obiektowym i wzorcami projektowymi Nie musisz zna na pami standardu C++ Nie powiniene przekombinowa z preprocesorem, szablonami i przeci甜aniem operator坦w 6
  • 7. C++ a programowanie gier Programowanie gier dopiero zaczyna si tam, gdzie koczy si nauka C++ Problem z konstruktorem klasy? Zrobi metod Init! Problem z const correctness? Immutability, koncepcja deskryptora. Problem z singletonem? Jawnie inicjalizowa i finalizowa podsystemy! Za du甜o getter坦w i setter坦w? Pisa struktury, pola publiczne! Wiele zagadnie typowych w programowaniu gier [GPPATTERNS] Np. podw坦jne buforowanie, architektura komponentowa, pula obiek坦w 7
  • 8. Data-Driven "Boss": { "Life": 1000, "Armor": 200, "Weapon": "Laser" }, "Laser": { "ParticleEffect": "LaserEffect02", "Damage": 1000, "Duration": 2.5, "Cooldown": 0.7 } 8
  • 9. Optymalizacja Optymalizacja co w praktyce oznacza? Jednym kojarzy si z doborem algorytmu o dobrej zo甜onoci asymptotycznej Innym kojarzy si z przepisaniem algorytmu na asembler Prawda le甜y porodku! Du甜e obiekty przekazywa i zwraca przez wska添nik lub referencj, nie przez warto Upraszcza obliczenia matematyczne, mno甜y zamiast dzieli Nie definiowa zo甜onych zmiennych wewntrz ptli Nie ufa optymalizacji kompilatora 9
  • 10. 安霞糸温逮稼看 Dodawanie, odejmowanie, mno甜enie Dzielenie, funkcje transcendentalne Branching, metody wirtualne, skok pod wska添nik Dynamiczna alokacja pamici Zasoby systemowe tekstury, wtki, gniazda Wejcie-wyjcie pliki, sie 10
  • 11. Optymalizacja Nietrafienie w pami podrczn cache miss 1980: Odwoanie do pamici RAM 1 cykl procesora 2009: Odwoanie do pamici RAM 400 cykli procesora [POOP] 11
  • 12. Optymalizacja Lokalno odwoa wa甜niejsza, ni甜 ilo oblicze Programowanie obiektowe Programowanie zorientowane na dane Obiekty alokowane osobno, rozrzucone po pamici Obiekty w tablicy, w cigym obszarze pamici Pakowanie danych short, char Flagi bitowe Pola bitowe Nawet zmiana kolejnoci p坦l mo甜e wpyn na wydajno! 12
  • 13. Najlepsza optymalizacja Najszybszy kod to taki, kt坦ry nigdy si nie wykonuje Precalc przygotowa dane wczeniej, nie liczy za ka甜dym razem Podczas wczytywania gry NIE parsowa plik坦w tekstowych, XML, modeli OBJ, tekstur PNG, nie kompilowa shader坦w Edytor lub inne narzdzia powinny przygotowa assety w docelowym formacie: modele do wczytania prosto do VB/VBO, tekstury w DDS (ewentualnie JPEG), wasne formaty plik坦w, VFS Podczas dziaania gry NIE liczy w ka甜dej klatce tego, co mo甜na przygotowa raz lub policzy raz na jaki czas (np. w AI) Stosowa culling i podzia przestrzeni, aby nie przetwarza tego, czego nie wida lub co nie jest istotne LOD Level od Detail kiedy mimo wszystko trzeba przetwarza du甜o danych, mo甜na mniej szczeg坦owo 13
  • 14. Wyjtki W kodzie powa甜nej gry wyjtki powinny by nieu甜ywane, a ich obsuga wyczona Brak standardowego sposobu obsugi bd坦w w C++ Niedoskonao wyjtk坦w C++ - brak finally, RAII nie jest powszechne Pojcie bdu w grze nie ma takiego sensu jak w programie Wczone wsparcie dla wyjtk坦w w kompilatorze C++ to du甜a strata wydajnoci, nawet kiedy wyjtki nie s faktycznie u甜ywane Kompilatory C++ na konsolach nie wspieraj wyjtk坦w [KosztWyjtk坦w] 14
  • 15. STL STL-a te甜 czsto nie u甜ywa si w programowaniu gier Wprawdzie warto mie szablony kontener坦w i mog dziaa wydajnie, jednak STL robi zbyt du甜o dynamicznych alokacji pamici. String坦w u甜ywa tylko do pokazywania tekstu u甜ytkownikowi, nie wewntrznie w kodzie gry Unika std::list, std::set, std::map, najlepszy jest std::vector EASTL implementacja STL dostosowana do programowania gier [EASTL], udostpniona ostatnio za darmo [EASTL/GIT] 15
  • 16. Programowanie r坦wnolege To dziedzina obszerna, trudna, wci甜 dojrzewajca, ale bardzo wa甜na, opacalna i ju甜 obowizkowa! Wtki i muteksy to dopiero pocztek 16
  • 17. Narzdzia Jedyna suszna platforma: Windows :) Jedyne suszne IDE: Visual C++ :) Narzdzia pomocnicze: ledzenie wyciek坦w pamici: wasny alokator pamici, Visual Leak Detector Profilowanie: wasna instrumentacja, Very Sleepy, AMD CodeAnalyst, Intel Vtune Debugowanie bibliotek: Debug version of Direct3D, PIX, PhysX Visual Debugger Statyczna analiza kodu: CppCheck 17
  • 18. Bibliografia [TIOBE] TIOBE Programming Community Index for October 2010 http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html [C++FQA] C++ FQA, Yossi Kreinin http://yosefk.com/c++fqa/ [GPPATTERNS] Game Programming Patterns, Robert Nystrom http://gameprogrammingpatterns.com/ [POOP] Pitfalls of Object Oriented Programming, Tony Albrecht (Sony Computer Entertainment Europe) http://bit.ly/90fCdE [KosztWyjtk坦w] Koszt wyjtk坦w, forum.gamedev.pl http://forum.gamedev.pl/index.php/topic,19151.msg229335.html#msg229335 [EASTL] EASTL -- Electronic Arts Standard Template Library http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html [EASTL/GIT] paulhodge / EASTL http://github.com/paulhodge/EASTL 18