Projektowanie pod kątem wydajności

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Projektowanie pod kątem wydajności oznacza przestrzeganie kilku najlepszych praktyk podczas tworzenia 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ć dużo czasu i wysiłku.

Urządzenia niskiej klasy

Urządzenia niskiej klasy, szczególnie urządzenia mobilne, mają poważne ograniczenia pamięci i są podatne na awarie z powodu błędów braku pamięci (OOM):

  • Jeśli chcesz wspierać urządzenia niskiej klasy, wybierz przynajmniej jedno "bazowe" urządzenie, testuj swoją grę na nim przez cały proces rozwoju i zwracaj szczególną uwagę na liczbę klatek na sekundę oraz zużycie pamięci. Gdy znajdziesz problematyczne obszary w swojej grze, użyj tych obszarów, aby określić limity swojego urządzenia.

    Na przykład, możesz testować grę z włączonymi statystykami debugowania Render (ShiftF2) i Podsumowanie (ShiftF2). Jeśli liczba klatek na sekundę zaczyna spadać w szczególnie zagraconym obszarze, możesz zbadać liczby Rysowania (scena) i ustalić, ż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 bazowym urządzeniu.

    Lub możesz zbadać 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 budowanie swojej gry.

    Gra Roblox z trzema aktywnymi nakładkami.

  • Emulator urządzenia w Roblox Studio jest przydatny do sprawdzania proporcji i kontroli, ale nie jest dokładny w kwestii zużycia pamięci; gdy testujesz grę w Studio, uruchamia serwer i klienta, więc zużycie pamięci jest znacznie wyższe.

Poziomy jakości grafiki

Roblox automatycznie dostosowuje jakość renderowania do możliwości każdego urządzenia. Na niższych poziomach jakości silnik redukuje funkcje takie jak zasięg rysowania, ale nawet na najniższym poziomie jakości zasięg rysowania wynosi co najmniej 500 studów. Woda w terenie pozostaje przezroczysta, a promienie zachowują swoją liczbę segmentów na wszystkich poziomach jakości. Roblox nieustannie dostosowuje te wartości, więc unikaj projektowania wokół dokładnych zasięgów rysowania.

  • Aby podglądać swoją grę na różnych poziomach jakości w Studio, otwórz Ustawienia Studio, wybierz Renderowanie i zmień Poziom jakości edytora. Testuj swoje wizualizacje zarówno na najniższym, jak i najwyższym poziomie.
  • Jeśli podniesienie poziomu jakości nie ujawnia więcej twojej sceny, obiekty mogą nie zostać załadowane. Sprawdź swoje ustawienie streaming StreamingTargetRadius.
  • Unikaj zmiany efektów wizualnych w skryptach na podstawie UserGameSettings.SavedQualityLevel. Utrudnia to działanie automatycznego skalowania silnika.

Ogólnie rzecz biorąc, testowanie na różnych urządzeniach może pomóc ci sprawdzić, czy gra spełnia twoje oczekiwania wizualne i wydajnościowe na różnych poziomach jakości grafiki. Aby uzyskać znacznie bardziej szczegółowy przykład, jak możesz myśleć o optymalizacji swojej gry dla urządzeń mobilnych niskiej klasy, zobacz Optymalizacja budowania i skryptów w rzeczywistym świecie.

Streaming i teleportacja

  • Streaming instancji pozwala Robloxowi dynamicznie ładować i odładowywać 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 społecznymi i zatłoczonymi wydarzeniami, które pozostają wizualnie zaludnione, jednocześnie skalując się w szerokim zakresie możliwości urządzeń. Aby uzyskać więcej informacji, zobacz SLIM i Popraw wydajność.

  • Rozważ podzielenie dużych miejsc na mniejsze i użycie teleportacji do przenoszenia graczy między nimi. Takie podejście może zmniejszyć początkowe czasy dołączenia, ale narzuca dodatkowe czasy dołączenia, gdy gracze teleportują się z miejsca do miejsca. Korzyści w zakresie zużycia pamięci różnią się w zależności od rozmiaru miejsca i tego, czy włączyłeś streaming.

    Nawet ignorując kwestie wydajności, możesz stwierdzić, że posiadanie wielu miejsc upraszcza proces rozwoju, szczególnie jeśli regularnie dodajesz nową zawartość do swojej gry lub jesteś częścią większego zespołu.

Materiały i duplikacja

  • Wbudowane materiały zużywają znacznie mniej pamięci niż niestandardowe tekstury, ale mogą nie pasować do twojej wizji artystycznej. Staraj się używać materiałów, gdy tylko to możliwe, aby zachować budżet pamięci na tekstury, które są kluczowe dla twojej gry.

  • Gdy tworzysz zasoby, 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ć duplikaty. Poprzez zmienianie rozmiaru, obracanie i nakładanie, możesz tworzyć bogate, zróżnicowane środowiska, które wymagają bardzo niewielu 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 unikać wysokiej przezroczystości.

Skrypty

  • Kiedy to możliwe, pisz kod oparty na zdarzeniach, a nie obliczenia na każdą klatkę. Przy 60 FPS całkowity budżet na każdą klatkę wynosi 16,67 milisekundy (ms). Nawet pozornie drobne obliczenia na każdą klatkę mogą wykorzystać znaczną część tego budżetu.

  • Znajdź sposoby na podzielenie długotrwałego kodu na mniejsze kawałki. Jeśli fragment kodu zajmuje 100 ms do wykonania i uruchamiasz go w każdej klatce, twoja gra może działać tylko przy 10 FPS. Jeśli zdecydujesz się uruchomić kod tylko raz na sekundę w grze, która w przeciwnym razie działa przy 60 FPS, 59 twoich klatek przychodzi po 16,67 ms... a potem jedna po 100 ms, co powoduje szarpanie.

    Zamiast tego zbadaj, jak możesz podzielić kod. Może możesz wykonać 5 ms pracy na klatkę, użyć task.wait() i mieć zakończone obliczenie co 20 klatek, jednocześnie utrzymując 60 FPS. Wielowątkowość, czasami nazywana równoległym Luau, może również pomóc.

  • Użyj metody RBXScriptConnection:Disconnect(), aby zatrzymać wywoływanie funkcji niepotrzebnie przy następnym wywołaniu zdarzenia.

  • Nie wywołuj tej samej metody za każdym razem, gdy potrzebujesz wartości. Wywołaj metodę raz, zapisz wartość, a następnie nadpisz ją później w razie potrzeby.

  • Nie przechowuj 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.

©2026 Roblox Corporation. Nazwa Roblox, logo Roblox oraz hasło „Powering Imagination” należą do naszych zarejestrowanych i niezarejestrowanych znaków towarowych na terenie Stanów Zjednoczonych oraz w innych krajach.