2016-03-21 6 views
7

Wbudowany system ma sprzęt wymagany do uruchamiania aplikacji Qt Quick, ma ładny procesor i dobry układ GPU, ale ma bardzo wolną pamięć nieulotną.Jak radzić sobie z dużymi plikami zasobów Qt w systemie o bardzo wolnym miejscu?

Jak GUI ma wiele obrazów, mam następujący dylemat:

  • jeśli kładę obrazy do pliku QRC, zostanie skompilowany do pliku wykonywalnego, więc aplikacja będzie ładować bardzo powoli .
  • jeśli załadować obrazy jako normalne pliki na żądanie (nie wszystkie z nich są widoczne w każdym menu i okna), program będzie zawiesić na jakiś czas, kiedy takie menu lub okno dialogowe, czekając na zdjęcia do załadowania z pamięci flash.
  • Zarządzanie poszczególnymi zdjęciami ręcznie (na przykład w ręcznie napisanym wątku tła) wydaje się zbyt dużym wysiłkiem, więc mam nadzieję, że istnieje bardziej eleganckie rozwiązanie.

Czy istnieje dobry sposób na wykorzystanie systemu zarządzania zasobami Qt do załadowania zasobów w tle? Obrazy używane w głównym interfejsie graficznym powinny być załadowane, a ekran powitalny wyświetla ładny pasek postępu, a pozostałe mogą być ładowane cicho w tle po uruchomieniu głównej aplikacji. Dobrym dodatkiem byłoby, gdybym mógł selektywnie ładować i zwolnić określone pliki zasobów (w niektórych stanach aplikacji niektóre pliki zasobów nie są potrzebne, więc byłoby miło, gdybym mógł zwolnić trochę pamięci)

Czy istnieje elegancki sposób na rozwiązanie tego problemu z systemem zasobów Qt, czy muszę ręcznie zarządzać wszystkimi obrazami?

+0

Czy można je załadować w tle na ekranie, zanim zasoby zostaną użyte? – Simple

+0

Wątpię, czy możesz zdecydować, co załadować najpierw, a potem w ramach zasobów, myślę, że może być możliwe pewnego rodzaju "podpięcie" do ładowania zasobów, ale z Qt zawsze jest zły pomysł z użyciem "sztuczek", ponieważ możesz stracić wiele -platform capabiliies. Gdybym był na twoim miejscu, ładowałbym obrazy jako zwykłe pliki w rodzaju inteligentnej pamięci podręcznej, w której ładujesz najpierw to, czego naprawdę potrzebujesz, a potem poznaję, czego możesz potrzebować później, i starasz się zachować jak najwięcej w pamięci RAM. – Marco

+0

@Marco: Nawet gdybym nie mógł określić, w jakiej kolejności są ładowane pliki w qrc, byłoby bardzo użyteczne, gdybym mógł zarządzać załadowaniem pliku qrc w tle, gdy aplikacja jest już uruchomiona. Jeśli zajdzie taka potrzeba, będę mógł użyć wielu plików qrc i załadować tylko ten, którego potrzebuję. Mój problem polega na tym, że jeśli qrc zostanie skompilowany do pliku wykonywalnego, plik wykonywalny będzie bardzo duży i dlatego rozpocznie się bardzo wolno. – vsz

Odpowiedz

0

A więc nie chcesz, aby zasoby były osadzone w aplikacji, ponieważ to powoduje, że plik zostanie odciążony i ładowanie jest zbyt wolne, a nie chcesz zasobów poza aplikacją, ponieważ są one zbyt wolne do załadowania?

Przede wszystkim, jako zasób w pliku wykonywalnego, nie oznacza, że ​​jesteś gotowy do użycia obiektu w pamięci. W większości przypadków nadal będzie trzeba załadować te dane do obiektu Qt, na przykład plik obrazu do QImage. Nadal będziesz mieć takie opóźnienie. A jeśli ta część danych jest stronicowana w pamięci, nie będzie ona szybsza od bezpośredniego odczytu z dysku.

Najlepszym i dość dużo jedyne co można zrobić, to zamaskować opóźnienia zewnątrz. Jest to możliwe tylko wtedy, gdy wiesz, które zasoby są potrzebne dla każdego stanu aplikacji, a za każdym razem, gdy zmieniasz stan, ładujesz wszystkie dane potrzebne do stanów, z których możesz uzyskać dostęp z bieżącego stanu. W ten sposób zasoby zostaną załadowane z wyprzedzeniem i miejmy nadzieję, zanim dotrzesz do nowego stanu wymagającego wtedy. Wadą jest to, że będziesz musiał śledzić te obiekty, a będziesz mieć narzut pamięci - możesz ładować dane dla więcej niż jednego stanu, ale wpisać tylko jeden. Plusem - większość ładowań może być ukryta przed użytkownikiem, a preinstalowany jest tylko podzbiór wszystkich danych, a nie wszystkie dane. Naturalnie, ograniczenie nakładu zasobów w miarę możliwości jest koniecznością.

Poza tym niewiele można zrobić. Jeśli Twoja pamięć jest wolna, najlepszym rozwiązaniem jest jej uaktualnienie, jeśli możesz, po drugie, być realistką co do tego, czego możesz oczekiwać od sprzętu.

+0

Domyślnie plik qrc jest zarządzany jako skompresowany zasób w głównym pliku wykonawczym. ponieważ ładowanie dużego skompresowanego pliku jest czasochłonne, uruchomienie będzie powolne. –

1

Wydaje się być pomocne wspomnieć kilka uwag (w moim doświadczeniu):

  • zdjęć zasobów, które będą wykorzystywane jako zasoby interfejsu (takie jak ikon), powinny być osadzone w domyślnym qrc pliku zasobów. One powinny mieć mały rozmiar.
  • Niektóre pliki zasobów są duże i nie będą często ładowane . Zasoby te mogą być ładowane dynamicznie jako pliki zewnętrzne .
  • Powinieneś załadować asynchronicznie duże obrazy (używając właściwości asynchronous).
  • Należy użyć elementu Loader dla ładowania dużych/złożonych komponentów.
  • Możesz użyć rozwiązań/trików UX , aby uczynić opóźnienie niewidzialnym (np. Wyświetlając paski postępu, odtwarzając mikro-animacje, przejścia, ...).
  • Jak badałem kilka godzin, to wydaje się być pomocne w użyciu plików zasobów dynamicznych (rcc plików) z/bez kompresji dla dużych zasobów lub używać rodzimych plik systemowy .
Powiązane problemy