Proto je pomocí static int v mém akcelerometru zpětného volání o tolik pomalejší než při použití instance proměnné?

hlasů
0

Hraju s příkladem GLGravity přijít na některé z výkonnostních nuance spojených s nakládání s akcelerometrem.

Tady je ten problém kód:

- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration
{
    static int accelCallCount;
    accelCallCount++;
    if (accelCallCount % 100 == 0) {
        NSLog(@accelCallCount:%d, accelCallCount);
    }

    //Use a basic low-pass filter to only keep the gravity in the accelerometer values
    accel[0] = acceleration.x * kFilteringFactor + accel[0] * (1.0 - kFilteringFactor);
    accel[1] = acceleration.y * kFilteringFactor + accel[1] * (1.0 - kFilteringFactor);
    accel[2] = acceleration.z * kFilteringFactor + accel[2] * (1.0 - kFilteringFactor);

    //Update the accelerometer values for the view
    [glView setAccel:accel];
}

Tento kód běží velmi pomalu. Vizuálně, mohu říci, že pohyb konvici stane velmi opožděné, a to prostě dostane pomalejší a pomalejší. Nakonec pohyby konvici jsou snadno 2+ minut zpožděné od doby, kdy jsem vlastně pohyboval zařízení.

Výstup v ladicí konzoli dělá vykazují určité zpoždění, taky, ale to není moc. Je téměř (ale ne úplně) dvakrát tak pomalu, jak by to mělo být.

2009-11-27 02:18:58.874 GLGravity[419:207] accelCallCount:100
2009-11-27 02:19:00.507 GLGravity[419:207] accelCallCount:200
2009-11-27 02:19:02.174 GLGravity[419:207] accelCallCount:300

Akcelerometr zpětná volání Zdá se hromadit, když v jakési frontě. Takže to, co začíná jako ne příliš špatné, se rychle stává nesnesitelně pomalé.

Tento problém zmizí, nicméně, když jsem jen přesunout prohlášení accelCallCount do záhlaví souboru a deklarovat jako například var:

int accelCallCount;

Proč se to opravit?

Na příbuznou notu, jestli mohu použít tento kód nebo „pevnou“ (accelCallCount jako Ivar) kód, celá ta věc také zpomaluje když jsem se dotknout displeje. Proč by to mohlo být?

Položena 27/11/2009 v 11:29
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

Získáte spoustu událostí přicházejících do a všichni jsou zpracovávány v metodě delegáta sám v současné době, na hlavním vlákně. Pokud je vaše zpráva glView je drahé, stejně, bude systém zpracování, který i příchozí události budou ve frontě.

Jednou z možností by mohlo být šarže až do událostí v delegáta hovoru, pak je pravidelně zpracovat a přijmout souhrnné výsledky a aktualizovat zobrazení. To by mělo dát hlavní čas vlákno ke zpracování dotykových událostí stejně.

Tak například přidání události do pole v metodě delegáta, s co nejmenším kódem jak je to možné tam (aby pole předběžně vyčleněná blok, který smyčku přes pomocí hlavu a ocas indexy), poté každých n události deach závit zpracovat je a mít to místo zpět do hlavního vlákna s hodnotami aktualizací glView (nebo ještě lépe, mějte na pozadí vlákno naživu, který dělá zpracování pravidelně, chrání data s semafor v případě potřeby).

Také si můžete nastavit updateInterval na objekt akcelerometru, možná stačí zpomalit?

Co se týče například vs metodou statické ... můj odhad je, že instance var budou přístupné po celou dobu, aniž by nad hlavou, ale statická rámci metody bude poměrně drahý přístup. Ale to je pozoruhodné, a něco, co bude muset dávat pozor na stejně.

Snad to pomůže.

Odpovězeno 27/11/2009 v 12:54
zdroj uživatelem

hlasů
1

Snížit četnost akcelerometru.

snížena jsem to 50,0 Hz a aktualizace zrychlení události zastavil budování, čímž se zlepší rychlost vykreslování. Při 50 Hz aplikace běží perfektní (iPhone nelze vykreslit na 100 Hz tak jako tak).

#define kAccelerometerFrequency     50.0 // Hz
Odpovězeno 05/01/2010 v 18:49
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more