onscreen vs. offscreen rendering v ios - for-mobile 3/2013
DESCRIPTION
Slidy z mé prezentace na téma "ONscreen vs. OFFscreen rendering v iOS", která proběhla na For-Mobile iOS v březnu 2013 v prostorách Microsoft ČR. Více o události For-Mobile: http://srazy.info/for-mobile/3293 #forMobileCZTRANSCRIPT
ONscreen vs. OFFscreen rendering
Tomáš Jukin@Inza
www.for-mobile.cz
@forMobileCZ #forMobileCZ
www.srazy.info/for-mobile
Březen 2013 - iOS
www.iknow.eu/cvut/
ONscreen vs. OFFscreen rendering
Tomáš Jukin@Inza
iOS StackUIKitUIKit
Core AnimationCore Animation
OpenGL ES Core Graphics
GPU CPU
iOS StackUIKitUIKit
Core AnimationCore Animation
OpenGL ES Core Graphics
GPU CPU
UIButtonUILabel
smooth transitions
2D/3D Graphics Quartz
iOS StackUIKitUIKit
Core AnimationCore Animation
OpenGL ES Core Graphics
GPU CPU
UIButtonUILabel
smooth transitions
2D/3D Graphics Quartz
C languageC language
iOS StackUIKitUIKit
Core AnimationCore Animation
OpenGL ES Core Graphics
GPU CPU
Hardware Acceleration
GPU
ONscreen rendering
data obrazovka
OFFscreen rendering
CPUdata
GPU
bitmapa
obrazovka
Kdy se použije OFFscreen rendering?
• Core Graphics (když použiju cokoliv s CG*)• drawRect() metoda, i prázdná!• CALayer s shouldRasterize == YES.• CALayer s maskami (setMasksToBounds)
dynamickými stíny (setShadow*).• drawText včetně Core Text.• použití group opacity (UIViewGroupOpacity).
Proč a kdy to vadí?
“Offscreen drawing affects performance when animation is involved”
Jak to testovat?
Nebo to umí i Instruments...
Case Study: UIButton
Předrenderované assety
CALayer
drawRect
Jak udělat grafiku pro UIButton?
Předrenderované assetyGPU + předrenderované malé resizeable/tileable obrázky
ZENové, náročné na údržbu a realizaci
CALayernutné OFFscreen průběhy pro maskování rohů
v Core Animation je defaultně zapnutá animace
Overkill
drawRectdrawRect -> Core Graphics
touch -> setNeedsDisplay -> redraw
CPU & memory waste
hodně tlačítek v UI naráz = smrt
Závěr? Máme tedy JEN assety?NE!
Je tu hybridní přístup:
Kód -> obrázek -> assetový postup pro všechny instance
One more thing...
GPU OFFscreen rendering!CPU OFFscreen rendering je synchronní s aplikací- je to zápis do bitmapy pixel by pixel
OFFscreen rendering může dělat i GPU! -> render server - asynchronně
Změna kontextu mezi ON a OFF je pro GPU ale strašně drahá!
GPU OFFscreen rendering!důsledek: GPU může kreslit pomaleji než CPU! (flush + bariéra)
Proto je CoreGraphics přes CPU
[CALayer setShouldRasterize:] vs. CG - nutno testovat!
Next
Next ?
KVC, KVO a Cocoa Bindings
Document Oriented Programing v Cocoa
Advanced Cora Data