Wspólne podejście do korzystania z wielu rdzeni jest po prostu mylące. Rozdzielenie podsystemów na różne wątki rzeczywiście podzieli część pracy na wiele rdzeni, ale wiąże się to z poważnymi problemami. Po pierwsze, bardzo ciężko z tym pracować. Kto chce wymazać z blokadami, synchronizacją, komunikacją i innymi rzeczami, gdy zamiast tego mogą po prostu pisać kod renderowania lub fizyki? Po drugie, podejście tak naprawdę się nie zwiększa. W najlepszym wypadku pozwoli Ci to wykorzystać trzy lub cztery rdzenie, a jeśli naprawdę wiesz, co robisz. W grze jest tylko tyle podsystemów, a tych, które zajmują dużo czasu procesora, jest jeszcze mniej. Jest kilka dobrych alternatyw, które znam.
Jednym z nich jest posiadanie głównego wątku wraz z wątkiem roboczym dla każdego dodatkowego procesora. Niezależnie od podsystemu główny wątek deleguje izolowane zadania do wątków roboczych za pośrednictwem pewnego rodzaju kolejek; zadania te same mogą tworzyć jeszcze inne zadania. Jedynym celem wątków roboczych jest każde pobranie zadań z kolejki i wykonywanie ich. Najważniejsze jest jednak to, że jak tylko wątek potrzebuje wyniku zadania, jeśli zadanie jest ukończone, może uzyskać wynik, a jeśli nie, może bezpiecznie usunąć zadanie z kolejki i kontynuować samo zadanie. Oznacza to, że nie wszystkie zadania zostaną zaplanowane równolegle. Mając więcej zadań niż mogą być wykonywane równolegle jest dobryrzecz w tym przypadku; oznacza to, że prawdopodobnie skaluje się wraz z dodawaniem kolejnych rdzeni. Jednym minusem tego jest to, że wymaga dużo pracy z góry, aby zaprojektować przyzwoitą kolejkę i pętlę roboczą, chyba że masz dostęp do biblioteki lub środowiska wykonawczego, które już to zapewnia. Najtrudniejsze jest upewnienie się, że Twoje zadania są naprawdę odizolowane i bezpieczne dla wątków, oraz upewnienie się, że Twoje zadania znajdują się na szczęśliwym środku między gruboziarnistym i drobnoziarnistym.
Inną alternatywą dla wątków podsystemu jest zrównoleglenie każdego podsystemu w izolacji. Oznacza to, że zamiast uruchamiać renderowanie i fizykę we własnych wątkach, napisz podsystem fizyki, aby używać wszystkich swoich rdzeni naraz, napisz podsystem renderowania, aby używać wszystkich rdzeni jednocześnie, a następnie poproś, aby oba systemy działały sekwencyjnie (lub przeplatane, w zależności od innych aspektów architektury gry). Na przykład w podsystemie fizyki możesz wziąć wszystkie masy punktowe w grze, podzielić je na swoje rdzenie, a następnie wszystkie rdzenie zaktualizować je jednocześnie. Każdy rdzeń może następnie pracować na twoich danych w ciasnych pętlach z dobrą lokalizacją. Ten równoległy styl blokowania jest podobny do tego, co robi GPU. Najtrudniejszą częścią jest upewnienie się, że dzielisz swoją pracę na drobnoziarniste kawałki, tak aby dzielić ją równomierniefaktycznie powoduje jednakową pracę we wszystkich procesorach.
Czasami jednak najłatwiej jest, ze względu na politykę, istniejący kod lub inne frustrujące okoliczności, nadać każdemu podsystemowi wątek. W takim przypadku najlepiej unikać tworzenia większej liczby wątków systemu operacyjnego niż rdzeni w przypadku dużych obciążeń procesora (jeśli masz środowisko wykonawcze z lekkimi wątkami, które akurat równoważą się w rdzeniach, nie jest to aż tak duże). Unikaj także nadmiernej komunikacji. Jedną fajną sztuczką jest wypróbowanie potoku; każdy główny podsystem może jednocześnie pracować w innym stanie gry. Przetwarzanie potokowe zmniejsza niezbędną komunikację między podsystemami, ponieważ nie wszystkie potrzebują dostępu do tych samych danych w tym samym czasie, a także może zniwelować niektóre szkody spowodowane przez wąskie gardła. Na przykład, jeśli ukończenie podsystemu fizyki zajmuje dużo czasu, a podsystem renderowania zawsze na niego czeka, bezwzględna liczba klatek na sekundę może być większa, jeśli uruchomisz podsystem fizyki dla następnej klatki, podczas gdy podsystem renderowania nadal działa na poprzedniej rama. W rzeczywistości, jeśli masz takie wąskie gardła i nie możesz ich usunąć w żaden inny sposób, potokowanie może być najbardziej uzasadnionym powodem do niepokoju z wątkami podsystemu.