<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
 <channel>
  <title>szantog.com - címlap</title>
  <link>http://szantog.com</link>
  <description>szantog.com</description>
  <language>hu</language>
  <item>
   <title>Low-level iOS, hogyan lehetne gyorsabb?</title>
   <pubDate>Tue, 10 May 2011 02:00:00 +0200</pubDate>
   <headpic>http://szantog.imect.com/sites/szantog/media/etc/meetup.jpg</headpic>
   <category>Minden más</category>
   <guid>http://szantog.com/page/low-level_ios-hogyan_lehetne_gyorsabb</guid>
   <link>http://szantog.com/page/low-level_ios-hogyan_lehetne_gyorsabb</link>
   <description>&lt;div&gt;&lt;strong&gt;A mai Meetup-on tartott előadásommal kapcsolatos fejlesztői infók, kódokkal.
&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;
&lt;li&gt;Látványos eredmény megfelelő szálkezeléssel, UIKit frissítés optimalizációval és ARM Assembly-vel érhető el.&lt;/li&gt;
&lt;li&gt;A szoftver a király: sokkal több erőforrás takarítható meg jó kóddal, mint mondjuk egy új szuper GHz kétmagos CPU-val. &lt;/li&gt;
&lt;li&gt;Ha egyébként rendben van a kód. Például használjunk &quot;tiszta&quot; C-t Objective-C objektumok helyett, ha lehetséges.
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Hogyan mérjük a terhelést?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Instruments: elsősorban RAM, szivárgás és Core Animation mérésre. CPU-hoz nem jó, abból eleve sokat eszik, az apró különbségek nem látszanak.&lt;/li&gt;
&lt;li&gt;Csak a teljes, rendszerszintű idle idő számít. Mérése kódból megoldható (csatoltam).&lt;/li&gt;
&lt;li&gt;A felhasználó a teljes rendszer terhelését érzi, nem az alkalmazásunkét. Könnyű &quot;átvinni&quot; a terhelést a saját kódból az OS-hez (user % -&amp;gt; sys %), de ez nem szabadít fel semmit.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Ökölszabály&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;25-30% szabad CPU mindig kell, különben &quot;akadozik&quot; az élmény.&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;NSRunLoop&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;A main thread NSRunLoop-ja fontos. Többek között ez fogadja az érintés és egyéb felhasználói eseményeket.&lt;/li&gt;
&lt;li&gt;Ha nincs 25-30% szabad CPU, akkor későn fut, későn érkeznek az események - akad.
&lt;/li&gt;
&lt;li&gt;Main thread/main run loop blokkolására ügyelni, események lehető leggyorsabb feldolgozása, külön thread, ha kell.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Szálkezelés&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fontos a megfelelő prioritás, időszelet (mennyi CPU-t használhat adott időtartam alatt) és stratégia (FIFO, RR, OTHER) beállítása.
&lt;/li&gt;
&lt;li&gt;Nincs rá jó SDK megoldás (NSThread setThreadPriority nem megfelelő), hibrid mach/pthread kód kell. Csatoltam.
&lt;/li&gt;
&lt;li&gt;Ezzel lehetséges olyan szál futtatása, ami csak a &quot;szabadidőben&quot; fut (idle CPU).
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;UIKit&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Egy UIKit objektum (pl. UIButton) módosítása &quot;költséges&quot;, az UIKit a legtöbb esetben blokkol, amíg be nem fejezte a grafikát.
&lt;/li&gt;
&lt;li&gt;Összegyűjteni a módosításokat (pl. UIButton.highlighted), és végrehajtani később, nem a touch event kezelésekor.
&lt;/li&gt;
&lt;li&gt;CADisplayLink! Ezzel lehet időzíteni a frissítéseket.
&lt;/li&gt;
&lt;li&gt;Az iPhone utálja az átlátszóságot, alpha csatornákat, belassul.
&lt;/li&gt;
&lt;li&gt;A legtöbb objektum átlátszatlan legyen, opaque-ra Interface Builder-ben pipa (igen, végig kell kattintgatni az összeset).
&lt;/li&gt;
&lt;li&gt;Még így se &quot;halmozzuk egymásra&quot; az objektumokat.
&lt;/li&gt;
&lt;li&gt;Ha opaque egy objektum, de alpha-s PNG kép van benne, akkor átlátszó lesz így is...
&lt;/li&gt;
&lt;li&gt;Irtsuk ki az alpha csatornát a felhasznált képeknél, ha lehet.&lt;/li&gt;
&lt;li&gt;A szövegek, UILabel módosítása költséges. Saját drawRect metódus és [self.text drawInRect: vagy CGContextShowTextAtPointsokat segít.
&lt;/li&gt;
&lt;li&gt;A saját drawRect metódusok sokszor gyorsabbak.
&lt;/li&gt;
&lt;li&gt;Instruments - Core Animation - Flash Updated Regions. Meg fogsz lepődni.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Thumb mód&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ARM CPU-k, kétféle futási mód: Thumb és ARM.
&lt;/li&gt;
&lt;li&gt;Thumb mód: kisebb kód és más utasításkészlet, ezért kisebb memória sávszél igény - gyorsabb futás, régi eszközökön (nem iPhone).
&lt;/li&gt;
&lt;li&gt;Nem tud lebegőpontos számítást, ilyenkor a fordító átkapcsolja a CPU-t ARM módba, aztán pedig vissza. Ez lassú.
&lt;/li&gt;
&lt;li&gt;iOS fordító: a Thumb mód alapértelmezett, kapcsoljuk ki. Iterációknál sokat számíthat.
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Iterációk optimalizálása - ha az Assembly &quot;túl sok&quot; lenne&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Nézzük meg, hogy a compiler milyen kódot gyárt.
&lt;/li&gt;
&lt;li&gt;Elé és mögé inline asm sorok ( __asm__ volatile (&quot;#innen&quot;); ), majd pedig Build - Show Assembly Code.
&lt;/li&gt;
&lt;li&gt;Próba: &quot;register&quot; kulcsszó néhány fontos változónál, mennyit változik az Assembly kód. Nem kell annyit töltögetni a memóriából.
&lt;/li&gt;
&lt;li&gt;A compiler nem mindig jó a regiszterek hatékony elosztásában, csak néhányat használ.
&lt;/li&gt;
&lt;li&gt;Egyszeres lebegőpontos számokat érdemes használni (sima, 32-bites float), hogy a compiler használja a lebegőpontos egységet.
&lt;/li&gt;
&lt;li&gt;A memóriahozzáférés sokkal drágább, mint az asztali gépekben. A memcpy is!&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Assembly&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;XCode-ban lehet inline Assembly-t írni.
&lt;/li&gt;
&lt;li&gt;A C-változatot is meg kell hagyni, mert a Simulatorhoz felesleges külön Assembly verzió. A Simulator x86-os, a régebbi iOS eszközök-ok ARM6-os (VFP), iPhone 3GS-től felfelé pedig ARM7-es (Neon) kódot kérnek.&lt;/li&gt;
&lt;li&gt;Universal binary kell (Build Settings - Architectures - Standard (armv7 armv7), illetve -mfloat-abi=softfp -mfpu=neon kapcsolók (Other C Flags).&lt;/li&gt;
&lt;li&gt;Az Assembly-be átírás nem triviális, ne &quot;automatikusan&quot; csináljuk. Jó Assembly kód csak &quot;kézműves&quot; munka eredménye lehet.
&lt;/li&gt;
&lt;li&gt;A regiszterek hatékony kihasználása, a lehető legkevesebb memóriahozzáférés (és lehetőleg blokkban), valamint az utasítások ciklusszámának ismerete sokszoros sebességkülönbséget jelent!
&lt;/li&gt;
&lt;li&gt;Minden utasítást adott számú ciklus alatt hajt végre a processzor, de képes többet párhuzamosan is!
&lt;/li&gt;
&lt;li&gt;Használjuk az &quot;egybeépített&quot; segédprocesszort, lebegőpontos számításokra (32 bit float), főleg vektorokhoz, mátrixokhoz. Egy ilyen szorzás pl. 8 ciklus alatt megy végbe, ez idő alatt mást is csinálhat a CPU, ha a következő utasítás nem a szorzás által használt regisztereken dolgozik (párhuzamosítás).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Példa: DJ PLAYER keverő (mixer) kód iPhone 2G-n&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;C: 18% CPU.
&lt;/li&gt;
&lt;li&gt;VFP Assembly, a ciklusszámok figyelembe vétele nélkül: 8% CPU.
&lt;/li&gt;
&lt;li&gt;Végleges, optimalizált változat: 2% CPU.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Kódok&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://szantog.imect.com/sites/szantog/media/etc/thread.h&quot;&gt;Szálkezelés.&lt;/a&gt; &lt;a href=&quot;http://szantog.imect.com/sites/szantog/media/etc/cpu.c&quot;&gt;Idle CPU mérés.&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</description>
  </item>
  <item>
   <title>Red Bull BPM Launch Event</title>
   <pubDate>Fri, 04 Mar 2011 01:00:00 +0100</pubDate>
   <headpic>http://szantog.imect.com/sites/szantog/media/etc/rbamstthumb.jpg</headpic>
   <category>Minden más</category>
   <guid>http://szantog.com/page/red_bull_bpm_launch_event</guid>
   <link>http://szantog.com/page/red_bull_bpm_launch_event</link>
   <description>&lt;div&gt;&lt;strong&gt;A sajtó meggyőzése fontos, ezért különleges bulikkal próbáljuk lekenyerezni őket. Egy Red Bull BPM Launch Event mindig sokkal érdekesebb, mint egy sajtótájékoztató, vagy bármi, amit általában szoftverek körül szoktak rendezni.
&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;img src=&quot;http://szantog.imect.com/sites/szantog/media/etc/rbamstthumb.jpg&quot; alt=&quot; &quot; /&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Minden ilyen esemény egy sajtótájékoztatóval kezdődik, ahol egy műsorvezető segítségével rövid bemutatót tartunk (Ralf vagy én), majd pedig az aktuális sztár is megmutat néhány érdekességet, ami igen vicces szokott lenni, mert eddig szinte mindig csak őrültekkel volt dolunk.&lt;/p&gt;
&lt;p&gt;Ezután van egy fél/egyórás lazaság a nagyközönség beengedéséig, ez idő alatt próbálunk meg válaszolni a legáltalánosabb kérdésekre. Ez már nem színpados/konferencia-szerű szerencsétlenkedés, hanem lemegyünk és mutogatunk, ilyesmi. Természetesen Red Bull módra minden igen precízen meg van szervezve, kaja/pia pedig bőven akad, messze feljebb a pogi/aprósüti szintnél - az újságírók különösen szeretik a jó ingyenkaját.&lt;/p&gt;
&lt;p&gt;Ez a laza rész így nézett ki a hollandoknál:&lt;/p&gt;
&lt;p&gt;
&lt;iframe src=&quot;http://www.youtube.com/embed/-PLrr1xNVkc&quot; width=&quot;480&quot; height=&quot;390&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;Végül beengedik a jónépet, akik általában valami nyereményjáték vagy egyéb részvételi izé keretében szereztek jegyet, elkezdődik a show. Általában két helyen van zene (nagyterem, kisterem), plusz ott a demószoba tele iPad-ekkel és iPhone-okkal.&lt;/p&gt;
&lt;p&gt;A legnagyobb a legelső Launch Event volt Amszterdam-ban, ott kilenctől éjfélig ki sem tudtam jönni a demószobából, demózni kellett és válaszolni, folyamatos volt a roham. Jöttek újságírók, fejlesztők, hírességek, mindenféle emberek. A sajtó kb. 150 fővel volt jelen, ehhez jött még 1000 fél tízkor. Nem egy átlagos szoftverbemutató...&lt;/p&gt;
&lt;p&gt;Kb. éjféltől pedig már csak a bulizás volt téma, például így:&lt;/p&gt;
&lt;p&gt;
&lt;iframe src=&quot;http://www.youtube.com/embed/vTAeAiHM93I?rel=0&quot; width=&quot;480&quot; height=&quot;300&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;A londoni bulira is el tudtam menni (kalandos 14 óra volt odajutni az óriási 5 centis hó miatt), ott a közönség nemigazán akarta elhinni, hogy Sinden meg én a tánctér közepéről, mászkálás közben játszunk mindenféle kábelek nélkül, érzékelhető késleltetés nélkül. Mókás volt bevonni mindenkit a játékba, direkt megkértük az embereket, hogy nyúlkáljanak az effektekbe. Volt nagy rötyögés meg meglepetés, mikor az iPad megérintése azonnal hatással volt a többezer W-os hangrendszeren keresztül a tömegre.&lt;/p&gt;
&lt;p&gt;A berlini és a madridi eseményekről sajnos lemaradtam, nem volt rá időm. A madridi nagyon szép, múzeum-szerű helyen volt, Forma-1-es pilótákkal meg ibizai rezidens DJ-kel. A berliniek pedig nem normálisak, pont karácsony előtt volt a buli, mert ott ez nagy divat.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/djbroadcast/show/with/5404860279/&quot;&gt;Madrid slideshow&lt;/a&gt;, szép!&lt;/p&gt;
&lt;p&gt;Ezúton is köszönöm a szervezőknek, hogy ilyen puccos rendezvényt tesznek a seggünk alá. Nem volt semmi látni, amikor 50 ember rohangál, fúr, farag, telepít, fuvarozza a VIP-ket a reptérről és hasonlók. Mindig egy igen részletes, több oldalas táblázat tartalmazza a teendőket melósokra leosztva, aztán persze mindig csúszunk, úgyhogy be kell szállni pl. a DJ pult építésébe. :-)&lt;/p&gt;
&lt;p&gt;Jelenleg a márciusi nagy eseményre készülünk, egészen konkrétan az SXSW konferencia kellős közepén, 15-én Austin-ban USA Launch Event, Felix da Housecat, DJ Manny, meg persze mi. Nem kell ragoznom, hogy ez miért fontos. Április végén pedig irány Párizs, úgy haknizunk, mintha valami falunapos mulatósbanda lennénk.&lt;/p&gt;
&lt;p&gt;A galériában: így készül az amszterdami esemény, nekem pedig feltétlenül be kell magolnom az aktuális, feltétlenül elhangzandó kulcsszavakat.&lt;/p&gt;&lt;/div&gt;</description>
  </item>
 </channel>
</rss>
