2009-10-23 5 views
5

Core Animation używa wątku tła, aby wykonać to zadanie. Problem polega na tym, że w głównym wątku mam ciężkie obliczenia. Core Animation natychmiast zawiesza się, dopóki nie zostaną wykonane obliczenia. A potem nadal kończy się animacje. Pamiętam, jak czytałem w dokumencie, że CA ma niski priorytet w czasie przetwarzania, co oznacza, że ​​niezależnie od tego, co chce zrobić główny wątek, jest wysoki prio i będzie wykonywany częściej niż jakakolwiek fantazyjna animacja w tym samym czasie.Czy istnieje sposób na zmusić Core Animation do uruchomienia wątku?

Chcę zmusić Core Animation, aby zaplanowała ładowanie tła z głównym wątkiem niezależnie od okoliczności. Lub alternatywnie oddzielny wątek, który będzie wykonywał ciężkie obliczenia poza głównym wątkiem. Próbowałem już tego, ale CA nadal zamarza, aż to zrobi. Oczekuję, że program planujący szybko zmieni czas przetwarzania między urzędem certyfikacji a tymi obliczeniami.

W jaki sposób CA może być zmuszony do dalszej pracy? Jeśli sprawy pójdą trochę wolniej, to w porządku. Ale najważniejsze jest to, że wszystko dzieje się z punktu widzenia użytkownika.

Odpowiedz

5

Nie należy wykonywać ciężkich obliczeń na głównym wątku, ponieważ będą one blokować interfejs użytkownika i prowadzić do złego doświadczenia użytkownika. Uruchom je w wątku tła.

To powiedziawszy, iPhone jest systemem jednordzeniowym, więc jeśli obliczenia ustalają procesor w jednym wątku, wydajność każdego innego wątku może zostać niemal zatrzymana. Jeśli możesz, spróbuj podzielić obliczenia na mniejsze elementy i uruchomić je jako NSOperations w NSOperationQueue. Jeśli upewnisz się, że segmenty obliczeń nie są tak małe, że obciążenie związane z tworzeniem dla nich NSIperacji staje się zbyt duże, może to pozwolić na zmniejszenie przepustowości obliczeń, tak aby twoje animacje nie były spowolnione.

Core Animation ma tendencję do wykonywania szeregu obliczeń z góry, zanim animacja może zostać uruchomiona, a więc może zostać spowolniona przez ciężki wątek obliczeniowy. Możesz również rozpocząć ciężkie obliczenia w ramach metody -animationDidStart: delegate dla CAAnimation, dzięki czemu obliczenia zaczną się tylko wtedy, gdy animacja będzie w toku. Wierzę, że postęp animacji wykorzystuje mniejszą liczbę obliczeń niż jej początek, więc może być lepiej w stanie współistnieć z twoimi ciężkimi obliczeniami.

+0

Dzięki. Czy NSOperations są w stanie robić limity czasu? Moje obliczenia są już podzielone na części. Każda z nich jest zaplanowana z opóźnieniem wynoszącym 0,05 sekundy. Więc faktycznie jest trochę wolnego czasu pomiędzy nimi. Jednak, gdy CA musi wykonać wstępne klasyfikacje na początku, twój pomysł oczekiwania na -animationDidStart jest znakiem zachęty. Próbowałem go, opóźniając wezwanie do rozpoczęcia pierwszego bloku obliczeń z 1 sekundą. CA zaczyna się animować, a następnie ciężkie kalorie pojawiają się i CA zawiesza się. To nie pomaga. Wykonuję obliczenia w nowym wątku. –

+0

Chodzi o to, że po obliczeniu każdego bloku danych, nastąpiła aktualizacja w interfejsie użytkownika. Te aktualizacje są szybkie i płynne zgodnie z oczekiwaniami. Byłoby idealnie, gdyby był sposób zaplanowania tego wszystkiego w taki sposób, aby CA współuczestniczył w czasie procesora tym ... zajrzeniem do rzeczy NSOperationQueue, chociaż nie brzmią one tak, jakby zapewniały limity czasowe, takie jak opóźnione wykonanieWybór połączeń wykonuje (?) –

+0

NSOperationQueue tworzy wątki dla twoich NSOperations, w razie potrzeby.Jest rozsądnie inteligentny, jeśli chodzi o zarządzanie zadaniami, które są wykonywane, ale nie wiem, czy ma on podobną świadomość systemu na iPhone'ie, jak na Snow Leopard (gdzie jest nałożony na GCD). Obsługuje także zależności między zadaniami, które możesz wykorzystać na swoją korzyść. –

-1

Nie jestem pewien, ale możesz spróbować zadzwonić pod numer [NSThread setThreadPriority:1.0], jeśli używasz urzędu certyfikacji w innym wątku.

+0

to ma znaczenie, jeśli zadzwonię CA w innym wątku? O ile mi wiadomo, CA utrzymuje swój proces i wątek dla tego rodzaju rzeczy (lub przynajmniej z własnego wątku, z bardzo niskim priorytetem). –

7

można używać do spłukiwania [CATransaction flush] rdzenia animacji, jeśli nie niech runloop podejmuje oczywiście

+0

Chociaż wydaje się, że działa tylko na iOS 4.0 i wyżej. Wcześniej to nie wymusza poprawnego odrysowywania, ale nie powoduje też problemów. – monkeydom

+0

Wiem, że to jest stare, ale czy mógłby Pan zastanowić się, w jaki sposób [CATransaction flush] pomaga w rozwiązywaniu problemu z gwintowaniem? – Warpling