2012-02-13 14 views
5

Wydajność iPada 2 GPU jest sposób lepszy niż iPad 1. Chciałbym włączyć moją aplikację i dodać trochę dodatkowej przyjemnej graficznej subtelności, gdy wiem, że GPU może sobie z tym poradzić.Najlepsza technika dla tabletu iPad 1 vs iPad 2?

Chciałbym więc móc w zasadzie wykryć rozróżnienie między iPadem 1 i 2 (i nowszym), najlepiej przy użyciu tak blisko wykrywania możliwości, jak tylko mogę. Istnieje wiele niepowiązanych ze sobą rzeczy, które mogłem włączyć (obecność kamery itp.), Ale najlepiej chciałbym znaleźć coś, być może funkcję OpenGL, która będzie wyróżniać GPU bardziej bezpośrednio.

Ten Apple page nie wymienia coś pożytecznego dla iPad 1 vs 2 i this article opowiada o benchmarkingu i łukowych GPU różnice, ale nie wskazać coś, co wygląda jak mogę zapytać bezpośrednio (na przykład liczbę jednostek tekstury lub cokolwiek).

Ktoś zastanawia się, jak to zrobić, czy też brakuje mi czegoś oczywistego? Dzięki.

+1

Hej, myślę, że powinno to pomóc: http://stackoverflow.com/questions/448162/determine-device-iphone-ipod-touch-with-iphone-sdk Możliwości są określane przez wartość zwracaną przez UIDevice. IPad 2 jest zwracany jako "iPad2, x", gdzie "x" jest podwersją iPada 2. –

+2

Czy jesteś pewien, że wykrywanie możliwości jest tutaj właściwym sposobem? Takie podejście może mieć sens w dzikim świecie aplikacji internetowych, w których każda wersja każdej przeglądarki działa inaczej, ale nie jestem pewien, czy dotyczy to aplikacji na iOS. Aplikacje na iOS będą działać na ograniczonym, specyficznym zestawie sprzętu i oprogramowania. Prawdopodobnie będziesz bezpieczny z * czarną listą * garstki urządzeń, o których wiesz, że nie działają dobrze, włączając w to całkiem ładne efekty. – Charles

+1

@Charles - W tym przypadku sens ma określenie mocy GPU, ponieważ istnieje ogromna różnica w wydajności między iPadami 1 i 2 (w niektórych przypadkach widziałem 7X różnice między nimi). W przypadku prezentacji treści trójwymiarowych bardzo przydatne może być skalowanie tekstur, geometrii i cieniowania w zależności od mocy danego urządzenia. Wolniejsza czarna lista urządzeń jest prawdopodobnie w porządku, ale trochę podoba mi się moje rozwiązanie oparte na OpenGL ES, ponieważ powinno to zabezpieczyć Apple przed wprowadzeniem nowego modelu wykorzystującego starszy procesor graficzny. –

Odpowiedz

10

Jednym z wyróżnień, o które można zapytać, jest maksymalny rozmiar tekstury. Na iPadzie 2 i iPhonie 4S maksymalny rozmiar tekstury to 4096 x 4096, gdzie na wszystkich innych urządzeniach z systemem iOS wynosi 2048 x 2048. Wydaje mi się, że jest to bezpieczne założenie, że przyszłe, mocniejsze urządzenia iOS będą miały również maksymalną teksturę rozmiar co najmniej tak duży.

Aby wyszukać maksymalny rozmiar tekstury, najpierw utworzyć kontekstu OpenGL ES, a następnie ustawić go jako bieżącego kontekstu i wykonaj następujące zapytanie:

GLint maxTextureSize; 
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize); 

Na moim iPhone 4, to zwraca 2048 w maxTextureSize, ale na mój iPad 2 oraz iPhone 4S to oddaje wartość 4096.

można również przeprowadzić test na obecność niektórych nowych rozszerzeń, że iPad 2 podpory, takie jak EXT_shadow_samplers (więcej udokumentowanych w „What's New in iOS: iOS 5.0”), ale te testy będą działać tylko w systemie iOS 5.0. Partnerzy, którzy wciąż korzystają z systemu iOS 4.x, nie będą mieli możliwości zarejestrowania tych funkcji.

+0

Dzięki Brad. Brakowało mi maksymalnej zmiany rozmiaru tekstury w procesorach graficznych. To jest dobre shibboleth. –

1

Dziś z większą liczbą dostępnych procesorów graficznych, oto, co wymyśliłem dla własnych potrzeb.

enum GpuClass { 
    kGpuA5 = 0, 
    kGpuA6, 
    kGpuA7, 
    kGpuA8, 
    kGpuUnknown, 
} ; 

- (enum GpuClass)reportGpuClass { 

    NSString *glVersion = [NSString stringWithUTF8String:(char *)glGetString(GL_VERSION)]; 

    if ([glVersion containsString:@"Apple A5"] || [glVersion containsString:@"S5L8"]) { 
     NSLog(@"Running on a A5 GPU"); 
     return kGpuA5; 
    } 

    if ([glVersion containsString:@"Apple A6"] || [glVersion containsString:@"IMGSGX5"]) { 
     NSLog(@"Running on a A6 GPU"); 
     return kGpuA6; 
    } 

    if ([glVersion containsString:@"Apple A7"] || [glVersion containsString:@"G6430"]) { 
     NSLog(@"Running on a A7 GPU"); 
     return kGpuA7; 
    } 

    if ([glVersion containsString:@"Apple A8"] || [glVersion containsString:@"GXA6850"]) { 
     NSLog(@"Running on a A8 GPU"); 
     return kGpuA8; 
    } 

    return kGpuUnknown; 
} 

Możesz dalej rozróżniać określone żetony, określając bardziej pełne numery wersji. na przykład określ IMGSGX543 zamiast tylko IMGSGX5.