2013-07-02 10 views
6

Tak, zrobiłem trochę czytania wokół forów o AssetBundles i folderze Zasoby w Unity 3D, i nie mogę znaleźć optymalnego rozwiązania dla problem, przed którym stoję. Oto problem:Unity 3D: Asset Bundles vs. Resource Folder vs www.Texture

Mam program przeznaczony do samodzielnego, który ładuje "książki" pełne obrazów .png i .jpg. Strony są w tej chwili takie same za każdym razem, gdy program się uruchamia. Na początku sceny dla dowolnej "książki", ładuje wszystkie te obrazy naraz za pomocą www.texture i ścieżki. Teraz jednak zdaję sobie sprawę, że jest to prawdopodobnie nieskuteczna metoda uzyskiwania dostępu do rzeczy w czasie wykonywania - jest powolna! Co oznacza, że ​​użytkownik nie może nic zrobić przez 5-20 sekund, gdy rozpoczyna się scena i ładuje obrazy strony książki (na niewiarygodnych komputerach). WIĘC, nie mogę określić, która z trzech rzeczy byłaby najszybsza:

1) Ładowanie jednego zestawu zasobów na książkę (np. 20 tekstur po 1 mb każdego).

2) Ładowanie jednego zestawu zasobów na stronę (po 1 mb).

3) Pierwsza z dwóch opcji, ale załadowana z folderu zasobów.

Który z nich byłby szybszy i dlaczego? Rozumiem, że pakiety zasobów są spakowane przez jedność, ale czy oznacza to, że tekstury wewnątrz będą wstępnie skompresowane i łatwiejsze w pamięci w czasie ładowania? Czy folder zasobów powoduje mniej czasu wczytywania? Co daje? Jak rozumiem, folder zasobów ładuje się do pamięci podręcznej - ale czy jest to ta sama pamięć podręczna, z której korzysta normalny odtwarzacz? Czy to dodatkowe, nieużywane miejsce? Sądzę, że inną kwestią jest to, że nie jestem pewien, jaka jest różnica pomiędzy ładowaniem rzeczy z pamięci i przechowywaniem ich w pamięci podręcznej.

zdrowie, ludzie ...

Odpowiedz

8

Foldery zasobów są dołączane zarządzanych aktywów. Oznacza to, że będą one skompresowane przez Unity, zgodnie z ustawieniami, które zastosujesz w IDE. W związku z tym są wydajne do ładowania w czasie wykonywania. Możesz dostosować kompresję dla każdej platformy, co powinno dodatkowo zoptymalizować wydajność.

Kosztownie wykorzystujemy metodę Resources.Load() do pobierania zasobów i działa ona dobrze zarówno na komputerze stacjonarnym, jak i mobilnym.

Dostępny jest również specjalny folder o nazwie StreamingAssets, za pomocą którego można umieścić spakowane niezarządzane zasoby. Tutaj umieszczamy filmy, które chcemy odtwarzać w środowisku uruchomieniowym, ale nie chcemy, aby Unity konwertowały je do domyślnego kodeka ogg. Na urządzeniach mobilnych odtwarzane są w natywnym odtwarzaczu wideo. Możesz także umieścić tam obrazy i ładować je jak przy użyciu klasy WWW. Powolne, ponieważ Unity musi dezynfekować i kompresować obrazy w czasie ładowania.

Ładowanie WWW jest wolniejsze ze względu na narzut przetwarzanego zasobu, jak wspomniano powyżej. Ale możesz pobierać dane z serwera lub spoza aplikacji "sandbox".

  • Załaduj tylko to, czego potrzebujesz, aby wyświetlić i wdrożyć proces w tle, aby pobrać dodatkową zawartość, gdy użytkownik jest zajęty przeglądaniem pierwszych stron każdej książki. To pozwoliłoby uniknąć zbyt długiego blokowania interfejsu.
  • Optymalizuj obrazy, aby zmniejszyć rozmiar pliku. Użyj tinypng, jeśli potrzebujesz przezroczystych obrazów lub trzymaj się skompresowanych plików JPG
  • Spróbuj użyć potęgi 2 obrazów, gdzie to możliwe. To powinno nieco przyspieszyć przetwarzanie środowiska wykonawczego.

ath.

+0

To jest świetna odpowiedź na temat folderu zasobów, choć wciąż jestem trochę zdezorientowany, w jaki sposób mogę użyć AssetBundles. Spróbuję załadować rzeczy z folderu zasobów i zobaczyć, jak to działa. – Catlard

+2

AssetBundles są jak folder Resources ładowany w czasie wykonywania z zewnątrz. Możesz załadować pakiet z lokalnego źródła lub serwera. Po załadowaniu możesz uzyskać dostęp do jego zasobów, podobnie jak te, które są w kompilacji w folderach zasobów. AssetsBundles są świetne, aby zmniejszyć rozmiar skompilowanej aplikacji i załadować dynamiczną zawartość (najprawdopodobniej z serwera) w czasie wykonywania, aby upewnić się, że użytkownik ma najnowsze zasoby. –

4

Świetna odpowiedź od Hieronima na temat zasobów. Aby dodać kilka dodatkowych informacji dla przyszłych wyszukiwań dotyczących AssetBundles, tu są dwa scenariusze:

gra jest zbyt duży

Masz mnóstwo faktur, powiedzmy, a iOS gra jest ponad 100 MB - co oznacza, że ​​Apple wyświetli ostrzeżenie dla użytkowników i uniemożliwi ich pobieranie przez sieć komórkową. Zasoby nie pomogą, ponieważ wszystko w tym folderze jest dołączone do aplikacji.

Rozwiązanie: Przenieś dzieło sztuki, które nie jest absolutnie konieczne, w pierwszym uruchomieniu w pakiety zasobów. Zbuduj pakiety, przenieś je na serwer gdzieś, a następnie pobierz je w czasie rzeczywistym. Teraz twoja gra jest znacznie mniejsza i nie będzie żadnych przerażających ostrzeżeń.

Trzeba różne wersje kompozycji dla różnych platform

Alternatywny scenariusz: jesteś rozwijanie dla iPhone i iPad. Z tych samych powodów, jak powyżej, zmniejszaj swoją kompozycję tak bardzo, jak to możliwe, aby osiągnąć limit 100 MB dla iPhone'a. Ale teraz gra wygląda okropnie na iPadzie. Co robisz?

Rozwiązanie: Tworzysz pakiet aktywów z dwoma wariantami. Jedna dla telefonów z grafiką o niskiej rozdzielczości i jedna dla tabletów z grafiką o wysokiej rozdzielczości. W tym przypadku pakiety zasobów mogą zostać wysłane z grą lub wysłane na serwer. W czasie wykonywania wybierzesz odpowiedni wariant i załadujesz pakiet zasobów, uzyskując odpowiednią grafikę bez konieczności, jeśli/else wszędzie.

Z tego wszystkiego wynika, że ​​pakiety zasobów są bardziej skomplikowane w użyciu, słabo udokumentowane, a dema Unity nie działają poprawnie. Tak poważnie oceń, czy ich potrzebujesz.