Projektowanie dla wydajności oznacza przestrzeganie kilku najlepszych praktyk podczas tworzenia twojej gry. W porównaniu do znajdowania i naprawiania problemów z wydajnością później w procesie rozwoju, projektowanie pod kątem wydajności na wczesnym etapie może zaoszczędzić Ci wiele czasu i wysiłku.
Urządzenia o niższej klasie
Urządzenia o niższej klasie, szczególnie urządzenia mobilne, mają poważne ograniczenia pamięci i są podatne na awarie z powodu błędów związanych z brakiem pamięci (OOM):
Jeśli chcesz wspierać urządzenia o niższej klasie, wybierz przynajmniej jedno "podstawowe" urządzenie, przetestuj swoją grę na nim przez cały proces rozwoju i zwracaj szczególną uwagę na liczbę klatek oraz zużycie pamięci. W miarę jak znajdziesz problematyczne obszary w swojej grze, wykorzystaj je do określenia limitów swojego urządzenia.
Na przykład, możesz przetestować grę z aktywnymi statystykami debugowania Render (ShiftF2) i Podsumowanie (ShiftF2). Jeśli liczba klatek zaczyna spadać w szczególnie zaśmieconym obszarze, możesz dokładnie przeanalizować liczby Draw (scene) i stwierdzić, że musisz pozostać poniżej 1000 wywołań rysowania i 1 000 000 trójkątów, aby gra działała dobrze na twoim podstawowym urządzeniu.
Możesz również sprawdzić Konsolę Dewelopera (F9) i zauważyć, że zużycie pamięci jest nieco wysokie, chyba że włączysz streaming. Posiadanie jasnego zrozumienia limitów urządzenia może pomóc Ci pozostać poniżej nich, gdy kontynuujesz budowę swojej gry.

Emulator urządzenia w Roblox Studio jest przydatny do sprawdzania proporcji i kontroli, ale nie jest dokładny dla zużycia pamięci; gdy testujesz grę w Studio, uruchamia serwer i klienta, co powoduje znacznie wyższe zużycie pamięci.
Ogólnie rzecz biorąc, testowanie na różnych urządzeniach może pomóc Ci upewnić się, że gra spełnia Twoje wizualne i wydajnościowe oczekiwania na różnych poziomach jakości grafiki. Aby zobaczyć bardziej szczegółowy przykład tego, jak możesz myśleć o optymalizacji swojej gry dla urządzeń mobilnych o niższej klasie, zobacz Real World Building and Scripting Optimization.
Streaming i teleportacja
Streaming instancji pozwala Robloxowi dynamicznie ładować i zwalniać treści 3D i jest świetną opcją dla większości miejsc, szczególnie większych. Streaming poprawia czasy dołączenia, zmniejsza zużycie pamięci i zwiększa liczbę klatek na sekundę.
Na przykład, gdy włączysz Workspace.EnableSLIMAvatars i ustawisz właściwość LevelOfDetail swoich modeli świata na SLIM, możesz tworzyć światy z przestrzeniami socjalnymi i zatłoczonymi wydarzeniami, które pozostają wizualnie zaludnione, jednocześnie skalując się na szerokim zakresie możliwości urządzeń. Aby uzyskać więcej informacji, zobacz Popraw wydajność.
Rozważ podzielenie dużych miejsc na bardziej zarządzalne oraz użycie teleportacji do przenoszenia graczy między nimi. Podejście to może zmniejszyć początkowe czasy dołączenia, ale nakłada dodatkowe czasy dołączenia, gdy gracze teleportują się z miejsca do miejsca. Korzyści w zużyciu pamięci różnią się w zależności od rozmiaru miejsca i tego, czy włączono streaming.
Nawet ignorując kwestie wydajnościowe, możesz zauważyć, że posiadanie wielu miejsc upraszcza proces rozwoju, zwłaszcza jeśli regularnie dodajesz nową zawartość do swojej gry lub jesteś częścią większego zespołu.
Materiały i duplikacja
Wbudowane materiały używają znacznie mniej pamięci niż niestandardowe tekstury, ale mogą nie odpowiadać Twojej wizji artystycznej. Staraj się korzystać z materiałów, kiedy tylko to możliwe, aby zachować budżet pamięci na tekstury, które są centralne dla Twojej gry.
Podczas tworzenia zasobów przekształć je w pakiety. Uczynienie pakietów częścią Twojego przepływu pracy pomaga uniknąć powszechnego problemu z duplikatami zasobów o różnych identyfikatorach, co może zaszkodzić wydajności.
Gdy dodajesz siatki i tekstury, używaj ich i ponownie wykorzystuj, zamiast importować zduplikowane kopie. Dzięki zmienianiu rozmiaru, rotacji i nakładaniu, możesz tworzyć bogate, różnorodne środowiska, które wymagają bardzo mało wywołań rysowania. Aby uzyskać więcej informacji, zobacz Usuń duplikaty tekstur.
Przezroczystość
- Unikaj wartości przezroczystości innych niż 0 (widoczne) i 1 (niewidoczne). Gdy używasz częściowej przezroczystości, bądź szczególnie ostrożny, aby uniknąć dużego nałożenia przezroczystości.
Skrypty
Kiedy tylko to możliwe, pisz kod oparty na zdarzeniach, a nie obliczenia na każdą klatkę. Przy 60 FPS całkowity budżet dla każdej klatki wynosi 16,67 milisekundy (ms). Nawet pozornie drobne obliczenia na każdą klatkę mogą pochłonąć znaczną część tego budżetu.
Znajdź sposoby na podzielenie długoterminowego kodu na zarządzalne fragmenty. Jeśli fragment kodu potrzebuje 100 ms na wykonanie i uruchamiasz go przy każdej klatce, twoja gra może działać tylko przy 10 FPS. Jeśli postanowisz uruchamiać ten kod tylko raz na sekundę w grze, która w przeciwnym razie działa przy 60 FPS, 59 z Twoich klatek przyjdzie po 16,67 ms... a następna po 100 ms, co powoduje nagłe zacięcia.
Zamiast tego, zbadaj, jak możesz podzielić kod. Może uda Ci się wykonać 5 ms pracy na każdą klatkę, użyć task.wait() i otrzymać zakończone obliczenia co 20 klatek, zachowując 60 FPS. Wielowątkowość, czasami nazywana Parallel Luau, również może pomóc.
Użyj metody RBXScriptConnection:Disconnect(), aby zapobiec niepotrzebnemu wywoływaniu funkcji za każdym razem, gdy zdarzenie się zfires.
Nie wywołuj tej samej metody za każdym razem, gdy potrzebujesz wartości. Wywołaj metodę raz, zapisz wartość, a następnie w razie potrzeby przekaż ją ponownie.
Nie trzymaj wszystkiego w ReplicatedStorage. Klient ładuje wszystko, co znajduje się w tym kontenerze. Zamiast tego, użyj ServerStorage dla wszystkiego, do czego klient nie potrzebuje dostępu.