2017-02-15 9 views
6

Stworzyłem prosty projekt, w którym około. 7000 sześcianów jest tworzonych w scenie (z kamerą VR), ale problem polega na tym, że kiedy poruszam kamerą, aby zobaczyć wszystkie kostki, FPS staje się bardzo zły, podobnie jak 5-6 klatek. Mój komputer to i7 z GTX 1070, i pomyślałem, że musi on narysować setki tysięcy kostek bez żadnych problemów. Naprawdę, widziałem Minecrafta, wygląda na to, że nie ma problemów z rysowaniem kostek))Jedność tarła wiele obiektów w czasie wykonywania wolny

Pytanie brzmi więc, czy można zoptymalizować scenę tak, aby wszystkie kostki były malowane jednym wezwaniem czy czymś, co zapewni dobrą wydajność?

ja faktycznie wszystkie kostki statyczne i nie ma tekstury tylko standardowy materiał ...

Oto jak to wygląda teraz: enter image description here

Używam domyślny światło kierunkowe i byłoby bądź dobry, aby nie zmieniać standardowego shadera z powodu jego świetnej pracy ze światłem.

Oto jak ja generowania kostki:

private void AddCube(Vector3 coords) 
{ 
    var particle = (Transform)MonoBehaviour.Instantiate(prototype.transform, holder.transform); 

    SetScale(particle); 
    SetPosition(particle, coords); 

    cubes.Add(particle.gameObject); 
    particle.gameObject.isStatic = true; 

} 

private void SetScale(Transform particle) 
{ 
    particle.localScale = new Vector3(Scale, Scale, Scale); 
} 

private void SetPosition(Transform particle, Vector3 coords) 
{ 
    particle.position = coords; 
} 

To jest zrzut ekranu statystyka: Stats screenshot mam tutaj 41 fps, bo przeniósł aparat z dala od kostek mieć czyste tło dla statystyk płyta. Właściwie po tym, jak robię "statyczne" kostki, FPS zależy od tego, czy kostki są widoczne na ekranie, czy nie.

+0

Jakie masz oświetlenie? Czy pozywasz GI w czasie rzeczywistym? Również standardowy moduł cieniujący jest dość drogi, więc jako pierwszy krok optymalizacji sugerowałbym zmianę go na przestarzały Diffuse. –

+0

Minecraft nie ma tylu obiektów co sześcian. Łączą kostkę, aby wykonać tylko jedną siatkę. A więc siatka (na przykład) 256 kostek. Dokładnie to, co możesz zrobić, ale ponieważ powiedziałeś, że kostka może się poruszać, musisz zregenerować wszystkie za każdy ruch, aby nie było to rozwiązanie. – Alaanor

+0

Pokaż nam kod z generacją kostki. Ponadto, w widoku Gry, naciśnij Statystyki w prawym górnym rogu i pokaż zrzut ekranu okien statystyk. Podejrzewam, że renderowanie połączeń rysunkowych będzie bardzo wysokie. –

Odpowiedz

5

Problem jest najprawdopodobniej spowodowany liczbą pojedynczych obiektów, które tworzysz. Jeśli kostki nie zmieniają transformacji po wygenerowaniu, powinieneś móc użyć StaticBatchingUtility, aby połączyć je w jedną partię.

Zadzwoń do tego po wygenerowaniu kostki.

StaticBatchingUtility.Combine(GameObject cubesRoot); 
+0

wygląda na to, że działa, ale ... po wprowadzeniu pewnych zmian mam FPS ~ 35, gdy wszystkie kostki są widoczne na ekranie, a ~ 55 jeśli dodam kod wspomniałeś StaticBatchingUtility.Combine (GameObject cubesRoot); Czy to maksimum, co mogę dostać? – Vetal

+0

To był twój główny powód. Zmień shader na coś lżejszego. Proszę również zaznaczyć to jako poprawną odpowiedź –

Powiązane problemy