2012-03-19 20 views
27

Uso un codice piuttosto semplice per visualizzare un PDF zoomabile in una vista a scorrimento e ha funzionato perfettamente su iPad 2 e iPad originale. Ma è tremendamente lento su iPad 3. So che sto spingendo più pixel, ma le prestazioni di rendering sono semplicemente inaccettabili.CATiledLayer Prestazioni PDF scadenti su Retina Display iPad 3

In iOS 5.0 e versioni successive, la proprietà tileSize viene arbitrariamente bloccata a 1024, il che significa che le piastrelle appaiono la metà di quelle dimensioni sul display retina. Qualcuno ha trovato un modo per superare questa limitazione?

In caso contrario, qualcuno ha trovato un modo per migliorare la velocità dello CATiledLayer sull'iPad 3?

+2

vedere http://stackoverflow.com/questions/9691891/catiledlayer-in-ipad-retina-simulator-yields-poor-performance – Mat

+1

La domanda Mat indicò ha un soluzione per il tuo problema. Guarda tutte le risposte poiché esiste una soluzione alternativa migliore per il tuo caso disponibile, rispetto a quella presente nella risposta accettata. –

+0

Grazie, Mihai. Sfortunatamente, quel collegamento non ha una soluzione di per sé; solo alcune modifiche. E quelli per lo più sono orientati per il simulatore e quindi non sono di interesse per quelli di noi che sviluppano per il dispositivo vero e proprio. Ad esempio, un tweak suggerisce di abbassare contentScaleFactor a 0.5, il che fa sì che il layer esegua il rendering con risoluzione iPad 2 (non retina). Più veloce, sì, ma non accettabile per un prodotto di spedizione. – dkmp

risposta

1

Hai provato a impostare shouldRasterize su YES sul livello?

+0

Beh, sì - la rasterizzazione del livello ovviamente migliora le prestazioni. Ma la rasterizzazione elimina il vantaggio dei livelli piastrellati: il ridisegno delle tessere quando l'immagine viene ingrandita. Le piastrelle rasterizzate appaiono terribili a qualsiasi livello di zoom maggiore di 1.0. – dkmp

0

Hai eseguito un time profiler su questi progetti e hai escluso la possibilità di estrazioni ridondanti?

Ho avuto qualche doppio disegno strano, che era facilmente trovato usando:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 
{ 
    NSLog(@"draw %@", NSStringFromCGRect(CGContextGetClipBoundingBox(context))); 
    // draw pdf 
} 

C'è anche una varietà di impostazioni con cui giocare:

  • tiledLayer.levelsOfDetail = 2
  • tiledLayer.levelsOfDetailBias = 4
  • tiledLayer.tileSize = self.bounds.size
  • CGContextSetInterpolationQuality(context, kCGInterpolationLow)
  • CGContextSetRenderingIntent(context, kCGRenderingIntentDefault)
  • self.contentScaleFactor = 1.0
Problemi correlati