2013-10-07 63 views
5

Próbuję zawinąć mój umysł wokół problemu (nie udało mu się w this question). Kontekst to: turowa gra, opracowana przy pomocy cocos2d w wersji 2.0, obj-c, bez ARC, obecnie przygotowująca aktualizację AppStore do konta z niektórymi problemami z iOS 7 (moje, nie iOS7).Wzrost stałej pamięci aplikacji (IOAccelResource)

Moje własne oprzyrządowanie, jak również Instrumenty, nie wykazują żadnych nieszczelności, nie opuszczają pamięci, nic ... płaskiego. Tak było również w przypadku iOS 4,5,6.1. Jednak w moim testowym wyniszczeniu przed przesłaniem, podczas profilowania na urządzeniu widzę wzrost o 1 Mb na 2 minuty, gdy gra siedzi bezczynnie, tj. Bez interakcji użytkownika (patrz rysunek poniżej).

enter image description here

Jedyne co widzę to ta kategoria IOAccelResource działa amuck pomiędzy wychwytywania generacji.

  1. Czy masz jakieś sugestie, co to może być?
  2. Nie mogę znaleźć wiele informacji na temat IOAccelResource ... Czy ktokolwiek z was może wskazać mi właściwy kierunek czytania? Jeśli rzeczywiście jest to związane z cocos2d, nie miałbym nic przeciwko kopaniu tam, ale nie wiem, gdzie zacząć szukać.
  3. Chciałbym również uruchomić kompilację "tak blisko wydania", jak to możliwe, i nadal będę w stanie zmierzyć ślad pamięci w czasie. Czy mógłbyś zaproponować mi metodę pomiaru wielkości procesu?

    tia.

+0

Mam taki sam problem z grą Cocos2d-x 2.2 zakodowaną w C++ i Objective C++. Nie mogę dowiedzieć się, skąd się bierze :( –

+0

@CoryTrese zobacz moją odpowiedź poniżej: bieżące wydanie i monitorowanie wielkości procesu z zewnątrz wyglądające, rozmiar procesu jest stabilny ... ta sama podstawa kodu, to samo wszystko oprócz: brak debugowania, zoptymalizowany dla rozmiar i szybkość – YvesLeBorg

+0

Mam do czynienia z tym samym problemem, różnica polega na tym, że używam 'OpenGL ES'. Tak, myślę, że nawet jeśli usunąłeś związek między' UIAccelerometer' i 'Cocos2D' i chociaż obserwujesz rosnącą alokację wykres, to prowadzi mnie do wniosku, że nie ma problemu nawet z 'OpenGL' .Jednak jest jedna rzecz, o której wspomniałeś w poniższym komentarzu to' DisplayLink', który może być częścią wspólną zarówno dla 'Cocos2d' i' OpenGL ES 'do renderowania grafiki na ekranie.Jeśli tak jest, to jest błąd z iOS lub Instrumentem. – sam18

Odpowiedz

1

Ricardo ma połowę odpowiedzi: obiekty zombie są tego częścią. Musisz mieć włączone Zombie i dołączony proces, aby uzyskać pełzanie.

Podsumowując:

  • żaden zombie nie pełzanie pamięci.
  • z zombie, bez dołączonego procesu debugowania, bez pełzania pamięci.
  • z zombie, proces debugowania dołączony, porwanie pamięci.
+0

Jestem prawie pewien, że doświadczyłem pełzania pamięci w kompilacji z wydaniem, bez dołączonego procesu debugowania (przy użyciu [tej metody] (http://stackoverflow.com/questions/7989864/watching-memory-usage-in- ios) do raportowania pamięci). Dlaczego zamiast edytować nowe pytanie, zamiast dodawać nowe? –

+0

Prawdopodobnie coś innego w naszych kontekstach: zasadniczo używam cocos2d do wszystkich rzeczy z UI. Zostawiłem wczoraj aplikację działającą godzinami (bez zombie, z dołączonym debugowaniem) bez żadnych creepów.Aby upewnić się, że zrobiłem cocos2d, aby zgłosić rozmiar procesu z fps przez cały czas, w porównaniu z Instruments (Monitor, nie dołącza). Naprawdę to dziwne. – YvesLeBorg

1

Zgadnij: IOAccelResource może być używany przez UIAccelerometer. Z pewnością brzmi to jak coś w rodzaju akcelerometru.

Ponieważ UIAccelerometer jest nieaktualny w systemie iOS 7, ale nadal jest używany przez cocos2d, być może jest tam problem, którego Apple nie złapało lub nie obchodziło. Tylko do testowania spróbuj usunąć wszelkie odniesienia UIAccelerometer z cocos2d, aby zobaczyć, czy to zniknie. Wydania kompilacji nie powinny wpływać na monitorowanie pamięci Instrumentów, a kompilacja archiwum jest po prostu kompilacją wydania z perspektywy kodu.

+0

hmmmm ... nice ewag! Poddam to trzęsąc i wrócę wkrótce – YvesLeBorg

+0

PS: może to jest więc mewhat related: http://stackoverflow.com/questions/13231570/is-it-normal-that-my-cocos2d-app-increase-real-memory-usage-every-second Przynajmniej wydaje się wskazywać, że to może być problem z kokosem2d. Z pewnością widziałem to zachowanie wcześniej, ale nie w każdej aplikacji. – LearnCocos2D

+0

ok ... i naprawiłem cocos2d, aby usunąć wszelkie odniesienia do klas akcelerometru (tylko w CCLayer) ... bez różnicy. Zbadanie prawdopodobnej innej przyczyny już teraz: Instrumenty. – YvesLeBorg

1

Możesz spróbować monitorować przydziały za pomocą analizy heapshotu za pomocą instrumentów. To powinno dać ci wskazówkę, gdzie jest przydzielana dodatkowa pamięć. Może już próbowałeś tego?

+0

hmmmm .... szukałem "stosu sterty" na instrumentach mil-std-xcode5, ale go nie znalazłem (o czym wspomniał inny wątek). Jaki to instrument i jak go "odsłonić"? – YvesLeBorg

+0

Tak, zmieniły one nieco terminologię dla XCode5. Analiza heapshotu nazywa się teraz "Pokolenia", a wykonywanie migawek jest teraz "Generacją Znaku". To instrument, którego potrzebujesz. Kliknij miejsce, w którym zobaczysz "Statystyki" na swoim zrzucie ekranu, aby móc przejść do strony Generacje. –

+0

+1 dla kursu "xcode". fyi: 86,3% pełzania to IOAccelResource, głęboko w CS :: Display :: DisplayLink :: dispatch_item. Reszta to moje własne rzeczy, które w tej chwili są przedmiotem uważnego śledztwa. Także FYI, jeśli buduję z AppCode (ten sam schemat, ta sama konfiguracja kompilacji) i uruchamiam instrument przez IDE, nie dostaję żadnego pełzania. Jeśli z drugiej strony podłączę instrumenty do działającego procesu, dostaję pełzania. – YvesLeBorg

2

O ile wiem, jest to fałszywy (prawdopodobnie błąd instrumentu). Podczas korzystania z wersji "wydania" tej samej bazy kodu ... tj. Bez debugowania ... i monitorowania rozmiaru procesu (tj. Bez procesu debugowania dołączonego do działającego procesu), nie występuje brak pamięci.

+0

To nie dotyczy mnie. Mam ten problem, uruchomiłem wersję bez procesu debugowania związanego z uruchomionym procesem, a rozmiar procesu wciąż wzrastał. Najdziwniejsze jest to, że niektórzy członkowie mojego zespołu to dostają, podczas gdy inni nie. Myślę, że jest to związane z OpenGL, czy używacie go? –

+0

Hmm, w sprawie dalszego badania 'Enable Zombie Objects' na' Edit Scheme> Run> Diagnostics' spowodowało to. –

+0

To jest dla mnie nowe. Każdego dnia weryfikuję, czy w trybie debugowania występuje tylko pełzanie pamięci (i tylko). Na przykład kompiluj i uruchom z xcode, creep. Zatrzymaj proces w kodzie X i uruchom ponownie aplikację (ta sama wersja) na urządzeniu, bez pełzania. Korzystając z GL-2, jest to aplikacja do gier zbudowana za pomocą cocos2d. Ale widzę dowód na to samo z prostą aplikacją waniliową UIsomething. – YvesLeBorg

1

Opcja Enable Zombie Objects na Edit Scheme > Run > Diagnostics może powodować takie zachowanie. Pamiętaj, aby go wyłączyć, jeśli masz go włączony.

+0

zobacz pełną odpowiedź poniżej. Dzięki za upadek. – YvesLeBorg