Pracuję nad grą na iOS, która ma na celu co najmniej 3gs. Używamy zasobów HD dla urządzeń wyświetlających Retina (iPhone 4, iPod touch 4 generacji).
Jeśli chodzi o pamięć, Ipod Touch 4.generacji wydaje się być dla nas najbardziej ograniczającym urządzeniem, ponieważ ma taką samą ilość pamięci RAM (256 w porównaniu do 512 w Iphone 4) co 3Gs, ale używamy na nim zasobów HD. Aplikacja ulegała awarii podczas próby załadowania 100-110 MB pamięci RAM, ale teraz, gdy spadliśmy do 70 MB, nigdy nie mieliśmy awarii ładowania.
Po wielu poszukiwaniach wydaje się, że nie ma oficjalnego twardego limitu, więc jak powinniśmy wiedzieć, jakiego budżetu pamięci użyć, aby był bezpieczny? Chcemy dać artystom budżet, z którego mogą korzystać, bez obaw o pamięć dla każdej mapy.
źródło
Odpowiedzi:
Myślę, że odpowiedziałeś na własne pytanie: staraj się nie przekraczać limitu 70 Mb, jednak tak naprawdę zależy to od wielu rzeczy: jakiej wersji iOS używasz (nie SDK), ile aplikacji działa w tle, jakiej dokładnie pamięci używasz itp.
Po prostu unikaj natychmiastowych rozprysków pamięci (np. Używasz 40 MB pamięci RAM, a następnie przydzielasz 80 MB więcej na krótkie obliczenia). W takim przypadku iOS natychmiast zabiłby twoją aplikację.
Powinieneś również rozważyć leniwe ładowanie zasobów (ładuj je tylko wtedy, gdy naprawdę potrzebujesz, a nie wcześniej).
źródło
Wyniki testów za pomocą narzędzia Split napisał (link w jego odpowiedzi):
urządzenie: (kwota awarii / całkowita kwota / procent całości)
źródło
Stworzyłem małe narzędzie, które próbuje przydzielić jak najwięcej pamięci do awarii i rejestruje, kiedy wystąpiły ostrzeżenia pamięci i awaria. Pomaga to dowiedzieć się, jaki jest budżet pamięci dla dowolnego urządzenia z systemem iOS.
https://github.com/Split82/iOSMemoryBudgetTest
źródło
W mojej aplikacji wrażenia użytkownika są lepsze, jeśli używane jest więcej pamięci, więc muszę zdecydować, czy naprawdę powinienem zwolnić całą dostępną pamięć
didReceiveMemoryWarning
. W oparciu o odpowiedź Splitu i Jaspera Pol, użycie maksymalnie 45% całkowitej pamięci urządzenia wydaje się być bezpiecznym progiem (dzięki chłopaki).Gdyby ktoś chciał spojrzeć na moją rzeczywistą realizację:
Swift (na podstawie tej odpowiedzi ):
źródło
Tworząc repozytorium SPLITS, zbudowałem je, aby przetestować pamięć iOS, którą można przydzielić do dzisiejszego rozszerzenia
iOSMemoryBudgetTestForExtension
Oto wynik, który otrzymałem w telefonie iPhone 5s
Ostrzeżenie dotyczące pamięci przy 10 MB
Awaria aplikacji przy 12 MB
W ten sposób Apple po prostu zezwala, aby wszelkie rozszerzenia działały z pełnym potencjałem .
źródło
Powinieneś obejrzeć sesję 147 z filmów z sesji WWDC 2010 . Jest to „Zaawansowana optymalizacja wydajności w systemie iPhone OS, część 2”.
Istnieje wiele dobrych rad dotyczących optymalizacji pamięci.
Oto kilka wskazówek:
NSAutoReleasePool
s, aby upewnić się, że użycie pamięci nie gwałtownie wzrośnie.CGImageSource
podczas tworzenia miniatur z dużych obrazów.źródło
NSLog
wnętrze,didReceiveMemoryWarning
a następnie przeprowadzić testy, w których przydzielisz różne ilości pamięci, a następnie zobacz, kiedy zacznąPocząwszy od iOS13, istnieje obsługiwany przez Apple sposób wykonywania zapytań przy użyciu
Wprowadzono tutaj: https://developer.apple.com/videos/play/wwdc2019/606/
Około min 29 lat.
Edycja: dodanie linku do dokumentacji https://developer.apple.com/documentation/os/3191911-os_proc_available_memory?language=objc
źródło
Jeśli użyje się TASK_BASIC_INFO_COUNT zamiast MACH_TASK_BASIC_INFO, otrzymasz
kerr == KERN_INVALID_ARGUMENT (4)
źródło
Stworzyłem jeszcze jedną listę, sortując listę Jaspers według pamięci RAM urządzenia (zrobiłem własne testy za pomocą narzędzia Split i poprawiłem niektóre wyniki - sprawdź moje komentarze w wątku Jaspers).
pamięć RAM urządzenia: procentowy zakres awarii
Przypadki specjalne:
Pamięć RAM urządzenia można łatwo odczytać:
Z mojego doświadczenia wynika, że można bezpiecznie używać 45% dla urządzeń 1 GB, 50% dla urządzeń 2/3 GB i 55% dla urządzeń 4 GB. Procent dla macOS może być nieco większy.
źródło
Pracując z wieloma powyższymi odpowiedziami, zaimplementowałem nową metodę Apples
os_proc_available_memory()
dla iOS 13+, w połączeniu zNSByteCountFormatter
którą oferuje szereg przydatnych opcji formatowania dla ładniejszego wyjścia pamięci:Ważna uwaga: nie zapomnij
()
o końcu. W metodzie zawarłem obieNSLog
opcje,memoryLoggingOutput
ponieważ nie ostrzega, że ich brakuje, a brak nawiasów zwraca nieoczekiwany, ale stały wynik.Ciąg zwrócony z metody
memoryStringForBytes
zwraca wartości, takie jak:źródło