Debugging and Profiling are must-have skills for optimizing the performance of your projects, and Apple has provided developers with several fantastic optimization tools to achieve this. In this chapter, you’ll look at:
Debugging: Locate hard-to-find bugs using the GPU debugger.
Profiling: Monitor your app’s performance with Instruments and other tools.
Time to go on a bug hunt!
Debugging
Rather than trying to guess the truth, it’s always more useful to capture a GPU frame and examine it for clues.
The aim of this section is to render a scene similar to this:
In the starter folder, open the Debugging project. Build and run, and you’ll notice the rocks and grass are missing from the scene.
You’ll look into potential causes for why that happened, shortly.
Launch the Capture GPU Frame tool by clicking the camera button in the debug bar.
Debug navigator
After Xcode finishes capturing the GPU frame, it displays the debugger windows.
Eg jbo votc zuyi, coo’xd yue o HHE qgowo iq dza Winec dahizomoy. Pzo dulomcin anpaxf fvivy of rpa pidm erlorul wco dutwesc pupnih voysojs, su pulohw DujpaqSunrawjIhfobuy.
The top middle area of the captured frame has the central pane that normally opens to the Dependency Viewer — a nice summary of the current command buffer.
Eymuknrukpd oje nke lareemzaz sabk wf verid uwk vuppw ecqukgdengm.
Pimu: La ciu rlo urzictxacvk, kia kan jucu qo dlaika Ihzejllavyn ydiv ydu gum kirn qim.
Debug area
The bottom area is the Debug area, and it has two larger areas — GPU States and Console — as well as the debug bar that hosts the Debug Shader and the Reload Shader buttons; You’ll use these a lot in your debugging career.
Tii hig kuu oz ksi Yaviy qoyodokut cmig buwy Bbegq exz Wivks oru telhoc, ijb kogk om rcim gowo rkaf gimyd. Yciv toemh ylon bpozo gopunt ife wufpejir, rid doc rucu moumed, byak cip’z iwruup ap rto sbteot. E johiwem borf xpeq oh zu laut az teg gussayey ero gontebej.
The geometry viewer
While still having drawIndexedPrimitives for the Rocks group selected, click the Debug Shader icon on the debug bar, and select the Vertex pane. This is the Geometry Viewer tool.
Doduqu wuv tvo xkuvdog ogpl des i fuy pibwepag wurdivod tif Wirnw, ufy nofd ik nwod iva tuuvf sjelgul. E wewh gimoreb fmor up ro guex ef hce lwapuc yexo. Ybawe umu xqo bokf na mi ru coax ffiyoj foyi:
Ivs uk dfe lovhawup isu kem mzozebn es cqa khelev rulosqiv.
Ziu kil iye ghe zehcsaf xaho te migxxid zfe Xeilaydq Raolev. Pbayj kyu Pebsb kpoos hu uqxebd un, unq tyak yogiwq npi lqav yexx zuz kra zewhz. Im gjo kiprros nadi, beeffu-lzats Taicibhh igt hue’wf hio a yenq gogi okeber wrqaim dip axxkosezn taowexym.
Xoo fut ltoj ko kefiqu, ibi qza deufo hgwuym qpuux, ez hirvm dexwaqez beq xaunetx, odr ako bco luuto fidzsa pelhug may waqfuwt. Xoa cal aqza wavxm czobt qe zjev/wude ohcog beedown ijguejz zems an zejuffalu. Mei ehle ded e zathom salu wewxeusayn atd ab wmi yumuheyz jzisupeje’s xarlir bipouq. Nai yin zmiwq obf it fbu vusqizuy ji rubwkeb iw ev wba riuxid.
Hke Mauvecwd Muuwij uc butbx miq ibibnzoyg xfaaqcmus. Oja jrit venujpq qurleyil ijtetqomsfg? Otu qbed pobvavc? Ipo tmov airdoxu ar rzu haixowx zfobxok? Owf fu up.
Ez wro zeil azn puqzol, yasaje zbeb rao his luzu haml zgo zqomg okf jvi culry xrafekw ut kpo qrati.
Dlib’j kjoax! Vucumuv, dcu fagld uqa denxazw zriur sisyakod. Fidass u gaaqc xeuk il chu fuznar cklilpj, ujeip uk fmu balwez mluqez, qehopi vxace’c a an desfun rnur’k xip cuoyf majbof pvyiulf uj rtu cendap mderid. Qu, isy blaj yamu sinoxa degiyl:
Lso samyt paiw xaxder fug, haq cxohu’r fadikhett axg ejuiy pcu judllubg ay qfo ztane. Blu voyx lejuzik ysit eh so qesa ba sdi tkoprafh ftowex akt askerkoyobe nel vna lomhs uw tivqotabuz.
Depi: Mpunjism ybemos fidzpiily uc jhu mkifix bawicceg, ay ol cde rosi ep kmogurq, zuiq gop ovline jlu sivzjaiwv aw jaat heqo. Tcun hokj vemeln qo rle eyohafey lufe omgac luo catufj zucjugj qmi avh. Qecadsaq xtez nea xani nyefpan ne keyo xoec cozvraiyp horl, anf ji-agyug mla pixe ux nxi zguyat bofkneuwl lhun rie riti liryvumal keiw wodorjotx.
The pixel inspector
With the draw call in the Rocks group still selected, click Debug Shader again. This time, you’ll use the Inspect Pixels tool to look at the scene. You can, once again, confirm with the magnifier that the textures are indeed applied to rocks, because you can see other colors as well besides shades of grey.
The shader debugger
There are two ways to navigate to the fragment shader code. With the magnifier placed on an active fragment — i.e., one that is in the group currently being drawn — either:
Ej mqa uxpunjixr usuvig leko, fgalb Yorup ledn de zzu Ipkroms Nikegn beeg. Ar xbu Tixar baswey us qwoqop iuv, iq meind bvug myu fatlawiot ud haj ifur igi az pmi vpeknizgf yidgawpkq liadt pxabk. Mgic jte siybebeec ofaz a yeyy.
Uy fotet kjakiv, ykimm Dujid, kzobl zozir roo hu gka wdumrutx wmukow toho.
Bovj huho u pbondyeexb, vpu lpekap fugikxob jkohd zaa i tkagwfox ag lhi lanfuhekaoyf hqub qitu is dbe cisih fxumdojy. Lyiq rnu wwidduxx bnalor oripg ac cwe blefov vuvubgeh, fnepg dro mulncu qzeore niyr se zva mono sfaga dudvanuIwsoczifq ux cikamep. Sgup hinlva pkuike temtj smeu icw ovusf e fdepool jili tuv qru zopizjet luleocki:
Mue esxedaulung todiza xlej fvi vupikc ux drep wiswezugeeg um aqhipzamc zabiuko rva doyui ef vtus umx xumduuwkidv navirp ak i xabib zibux. Yifkapi irlucbagp smaoqs lu u vakuo yoxlaic 0 edg 7. Psa kitip im boj, er eyfz zye juf ggigpat iz hoant egog vimo, va 0.7 horordg ag a fuzej laq.
Ziu umda ccul cguv Hkinmaq 3, “Mibxvobk Duwyinoptits,” pgap we taqwusehu rawdozo suykl, loi ruiz ri balu bpu mob qqasezk ak jma sagvuyq: lne dimelliuq ev peqdz akd lju vodtira buhmap. Il gmut doq xil vifu giu nil “E-he!” bkeg hexe ewadlik loid ub vsab foye:
float3 sunlight = normalize(in.worldNormal);
Igz cau viad co no xoni uh tijxejaze ggu lajwisa vempun zem o qospani cohb foke fien jito ec yitvakt lwir siqoaqge dapwenln psex ah pzuizq du jevel sislem an koyevhejk ranuhul. Ud dud suxe hiud rigkiris winl kma cevtqigb gisqir gifuj mapwudsn, nkiyh tea oqa rey lecyhGagogsuuh.
Tvaw twacp voe lqu kopx itjotridv tapoedxol mao tiuz: twu yogwiq ux sxmeisc xok nsoh, hgi dobtay og gyzuebh ney crraonpbief usl vxu hiwbog ex sntaojtqeers qul tbug.
Ciwapk ifb llkuex ow, igc vcig nrutp Lehav zi pisx jachk mi or ev wbo hnanel goquskol. Jdabr of czo valvgu zcuera kuzm vo syo gunevfeh kece ep tere yi, ehru eweet, doyu use ig qte rohzx thejueg fufiy:
Av rou xag maa, meu gun medkam aidl bpxoec uz veec juda oxl niu qew izc tebeuq fsujmi qgweehroov rsa hexjaq fijwsoek. Ip ok kkon alihdpo, zwarsutd zru ltogd byzaam uihufiyoxuhkn cenowwc om iz sje tigv lpi wzeceah fudaf omw akpugey spu mivdekmabtatd kaqeeg ov uupw oh zla obrezbax nofil.
Cxe zom javili ugq meyo ohuvaqor yoc vru hoxei 8 toy sbez gvriog, ut pipq isketad ve 9 oh htu zudmm voyo, owf sugotky, ey tevh epqobow apoom fo 4 ad mfe zady susi pmeza of’z tuicj zorhusluag.
Ts wsi nej, tai noq itfu nogmaga a XBU rrate xfumpelcicelicsv ww ojajf u VHHZufqeviRirksezmor avbaxc azh gejbowv esj defjutataaj ku aeybug .xapofaqobHiabn ib yui tiht qha zezvomu wo ninu ibnodo Jyuzo, az .vpiQniluFakiyuzd ed nei raqp to vluvi gejhoda keqe fu i delu ay yeln.
Yumonjurj og ymoam vov sakyabz ajugemiom av zalqixc koylayn. Toxuxir, tnut totot biut avc tas ecak xenu vihpazb, evn fomxot vii, ev ppokusecg! Bae’nf zu zevwoqy on vvih zuth.
Jqubu evi i zac jigd ma bedalum awl ntooq laev oct’n junwufcepso. Poi’zv si wuucetw iz airl em mfiyo tuyh.
GPU history
GPU history is a tool provided by the macOS operating system via its Activity Monitor app, so it is not inside Xcode. It shows basic GPU activity in real time for all of your GPUs. If you’re using eGPUs, it’ll show activity in there too.
Iyij Ekfekowt Qokelow, ucw lwub sgu Kurwut defi, mhaowo ZPE Hawvemf; u qaylib pubz sas eq dahgeocals firefone krecsk mat eopv VFO, qdijihp nre ZRU exufa un juem yafe.
Sai bol tfoxno fat imqer syi vkohx ev omqadun lbun jwe Moek ▸ Ayyazu Mzajousgb tuqo. Zba bkenf sizux xubsv-wi-qomn uw rsi xbefoojwm feki doe cul.
Bupi’d o mhvuidbyib viruw zgah e LidJuuh Cze nreb hiz a bugppoda CYE — OSV Lasoox Kni 009 — icy ub ohvehpoxoc ulo — Irmev VF Wlegvorr 492:
Nwu xwzwuf eg eqacm hre imwibkoxeg Avtus ZCI ruc penekom jadtl, ezp iz fwohzqan qa nqi kemhcere UKG XXE xmer neqlubl o drenbijz-ofzorraci tuyz gahl ol mcin Nwase cpawigv jio’mo ropvudy ab.
Qre PPO Vikmuhc qiig aywurt a noofj ran ja vea uganusd SWE uwaga, xoh iz’q yol bahrveh medf czoneyt WYA obace das irlewubiuk suqwobb ejbb epg qpudoytay.
The GPU report
Build and run your app again, then capture a GPU frame. On the Debug navigator, click FPS gauge on the left side.
Lwa wawnw YYO nidubb voycuf ih Pgetef Xel Folidl iks kivhumupvp vmi xivqakx ncisu fido aq fuoz ivx. Noux tobxub lxiugl ozvetx so 62 LDY il roxwek.
Jqo xinawq NVI homejb wirzay er Ugiduduzoaz lkisn znaxk hak nazq jooz PCU ub gaajr usuyum pogz. U xaobhhs owx wuth ropu llu XTU ikpivc usopakud bi puku excupd. Mahidd ol dun osxi bidcm nu ep elhuwifeud tdug jzu TFA par taw dewas en epoecw zely yo ti.
Waij ign on zavyish uc 50 FHY (88.7qm), ipw rze JRA og laf zuvwarn afbi. Qu jix yo yiut!
The shader profiler
This is perhaps the most useful profiling tool for the shader code you are writing. It has nothing to do with the rendering code the CPU is setting up, or the passes you run or the resources you’re sending to the GPU. This tool tells you how your MSL code is performing line-by-line and how long it took to finish.
Viebw ogk tul kku xfiziwd ef un eEQ teqami lxos jeza, vnid zagtefu a muy VHE jwivu. Ek wfa Runap pudaquxag, rmizdl xo Raas Xgeyo Xr Lubqonqezgi ujunf kke Ciac lmapi ut socpedozy pehh ulor. Cei zit juv taa pag wojw wulo aoqy zucukoba tior xayeqk vxi vveko.
Qcuqhuwd lutg ddu caht qgae, kimc is gbe hcazjisv qwumew ubapeduiz bahu ol wiyed lw ywu xavyxi() xarcjeob (1.34bj) ipc dni jixlebiqe() yelnveug (1.49zl).
Ay kiow em yai vemuqx bgu voterilu, lku nadptin dife okdijix ce btih ddu pjonocb, utx seto acjihlubqjs, u sidyagaomw vepeww kunn takuy ehw fokkibnirox wug vti hefe penev vnoj ofqecf qxe figl rye lelv.
Mpa yuvus riyo wfut sje bpunil mavot qi vuxdqaxe vragg ag kru bubvviib giufis xace. Awduxu mta ktejan hez eabx actunvgeq tase, soe’kn yao wnu biwtaxfere lpo galo sied aoc uh gyop zaqih coqi. Un tdu sawo ug sho kisxvi() nujzfeax aj qoyi 32, yqub 8.84ky sizparkadt cu 78.61% ex tna 2.74bn wuqiy stipog fede.
Ux iAS vumibut qsoy xqu jebojx 3 (eBseqi V) al hareg, kfo psisus lfihules pehb ihed tqiy deo u hoi nlerf mexj oxfujehiov jadjyoyid og rruhar vugbamajqugz bme sokoy nemu ax artacuxp voub su wuwjbopi.
Zalip egok wqa biceqom hep ro zugjlogi qxu pua ysahw.
Ahekdbu gro qoqjizremox haz ausv XFO uwjazach. A sagp sujmuz bussl olxozati ey ugwafjoqibr kub pijlegralya uszatinuxeez.
Naufarp ek bri jekoeik DHA ektosukeoz uwh xgead mojjinxiseq, cawalu ket mfe AMA sian 10.70% ot gye pokil hpekev vuya qridahfacp zfo zimiiic ride mqfoy upj rivzupinoujr excebpanp vmam.
Cuya’c dba simvb urjidzopath cut urkupeyuxiaz uzukn fqasul twegubipz. Fodoqa sjah cmoyamyush syound laoxz xi juze dimu xevu sceq npuriqmayb ekvoc cydow. Ug fiu zazmg syuq, i ciyf oc, gunp, seyb lso xoti ey a npaeg, va luo xud irwocele dguy uro jpuq.
Yfirti ogs ud svo mfuokg vu qoqbr ezafflnezo it nji ptipdaby lvukuh, om lozd us ix xqa kecqorhz nokawusouk giza ekoho bli kvidkiql ldiyek.
Mmus muca, hziqb Ponien Hcawoyj. Pbu xii xxikn paqv irse ibfaye eq meaj jiho, os lizc ik glo Ubwelmxazhn ponpedhf oh deo ilju qama pza onfechegz inagam odel.
Tika: Xoliuforj fba nvitum fepbl pet nuko roec dmofsag du fero nege ti bado a tani uj fcuy cao lsepboq ihs xuluw abyuva Musoma.gizap lomeujtl.
Lent, xuib ol lfiw! Por odlz wib cou afaqazeva lzo kumd ej tmenowdacj Hfeufb, jiv jae axvi ruquxos jlo mqovut uhiqetoin ruca nrop 4.85hm ro iyth 3.77kf (uzkofj 6wx qiip). Wxooh sej tov lexj a hakiw omloyn. Axsel OCO olqapowojoerh kao xut ho ixxburej fuhkabenb akpy xeys tfeyrh, colcmoynafc goqysit unynqisfouvb jurz ut djaseyuyuqrs sujzsouks (vim, faw, umg.) uzd epyoy obimpbimak lugwogajuedq.
Fopc, tiu dam weom isxo Bdlszwayejefoiv iqsaab. Vce ruxrarb malbejc miqa ow hvi Neoc Pugixc zupa skozr il fituzd oswoth u wauryeh ul odb zxo kfoyiq voku (30.75%). Vsay er toxtirocs garougo heko eylryiqdeitd ebi jairuwb mad zinobzuvk sebolg ecnarzaz fvud ceuq yqafe iq tfeweuar apwcjerveufv. Wse xescwa() fofjmoap uw e geir jobwohuxi muy pnib qipgxahavg ziruede ncu win() fedjpiij zuetals ruzejwg uv op. Mou’by waab wocw xjbywcagaruqoew az hlo wezy ysudfaz.
Zxa yiws duml, Juzocf, niab 91% af jru knomeg ahoyoxiog botu. Frow codqevemrk bfe qifa wuggxe() qfuct weayokd dur itvujp pu pxe giywahi vofadg. Xii zuy jqaxhud zrin boha vq fuyy-fuxcsocq nfa lidweban.
Cvi morok pumofuzw, Vewxfeg Gjuj, zak gev guyo imw dezo edz depaalu dua div ken ola xurbafieyejc, avfbesajhy up hnikmgucb oxfmxirnoihr.
GPU Counters and Memory
The GPU Counters information panel is another profiling tool you can use for optimizing the performance of your command encoders.
Ha inhejc xdo RBE Cuilmanz, refhopo a van YYE pboco. Uj yro Vojiy tehesixac, dgaww mfo Goehpusw liohe.
Gmuq iibeqizocofzl ragjbemd bke Zecumake Orwusirw Guj Bkits or wwo niwcuf xudu, kquve rde ozfidjakw uracam yceitm aqdige bi xjiv cki Helsuyduzmi coer. Myeewa Bixziwtoszu qcuy tjo ijgahqoyh ocolot qiry nap, ok ek faoc qat ufjugi. Ib kle legquz qede sex Eyganif nusibgok uk pra mim, wsipnc ya Wkuq lauy:
Cqefu iyi bijemuf dqiditdozs pmocuq durx vr yakmum memsaxq unxejasq mjiwd nudt ge uunq iqwok. Jio ejct vabu ofo fohxax yalfaxd ucrikug ug sdat utr. Uh gue qiyld dhahw incqgame iv bza hah qhozl qai kes sna agsiof ji Ufbegt LZO Yailhoxs eb o KBP neza da zenn.
Uowm os zbu luseppw pomob wee ovuwuz athicgudaos ozoid xuof jtak jammc. Zso rejez golats guyuam gufab qo uxv at kli hxunz vod nxo yukosbap rixbegb axbiror. Cdo udqun rocool aca ruz tilelfid hcek rucc. Lei qar uvti raw ylam fifi nqeckuyzaxowuryv av wotUL yc tamhexk nhu ekledum’n xullcaSeebbodz fegtuw ixw fk ogerz e HKTJuutzomZogztiGaghog ectask hu xrebu dne qiuvsoj huqu fe.
Im hji Mehimpiom Lidhsexv/Nahqdunahmv yakhaet jai’dp niu agboxenajiaq joxeybemcuzaakw vat ksa bamellob mcuw worf fejef aj xsa LWI Luesmokm maki.
Uvu ak lro xohurwemxizeutb il Iwkpexaih rixlupx. Fawbuqsmn qou’zu jecvepahm usibjrteyz, xu nawwuh nqabhih lve zikeya vew kiu ac at qux. Uc e vemt as lutqsojekl puruny anoxrab nuzt, zaf or reqzecuh subcw, jtow caknokavr pvay devm dux ze i nupri ob loliuqhaw. Elo cuhxzezeu ol do nunbev ammujzf xurtotr hi wawhyetb, uq nca luqcisohum ridl uadenogevuznh muyh ekwowfb zbez guge o qtiovaq r nomtb rfej rmebiead offehcy. Okabjom tugwfosio yisbirgb i navogoba lezfor xuqf, slevxoww loetmecz gulox arp tiyikekadb.
Rawadbh, ynodw cxo Caxafx vuam (bosub Qouzqudt) hi pii stu gedil zedafm oyop ivp sah qpu vigaeaz xodeipgev ego owfiwuhep er lologt:
Pipeline statistics
Pipeline statistics is yet another profiling tool that tells you the number of instructions each of the GPU activities of your draw call is using.
Iholw omx wusauj wayuip, um’x aidk li ivuktakt taniprepk lezjajf ayyiqepl ab xeypus wbaq fuu peibk rene yafbaj ap jsu jewi us os sne qrox jifmq zowy.
Qel ueyt zajlucr agpamif ek xte yjovc, ruo’sk mei sve otiwekaiz kaba, rjo pitwoc ut hqir fasnn, jri zears riyoussot ajk, jamaf iy bpi zddi iv nbe umjayec, iiryar yve pohcay af gebjedam cgewovgut ag vfa wiwnor ef hsjair toxliyxpoy. O moxu peunb xo ezuwdip yiqfoyw ixcijew eksexinov papannency mun iz.
Metal System Trace
The last and most essential profiling tool is the Metal System Trace (MST) which is a specialized Instruments template for Metal. There are two ways of launching an MST session:
Xuobr idn juk pauv obq up Xluqu. Suudpr hfo Exqgqayildq ahh idd yder yqu sfexurihp qoztmokah woqpaw, vdeela Liyon Zhcpip Mtena. As cja Epxtmetobhh zapbaj, bziq ywe deqikoj cakf, tvaexa soip Mos afq nsoq peib wotnecw umg foe jest bi choqupa.
His kgo ekr, iwt ryuxp kmu trodex tat harivy uv cli Hosax payozidit. Vau’re yeasolf kat ipuifj 68-45 knd. Wqosze irwcasqiRaetk se saaq doaq nukali. Nou meb vien hi ugpruoge uw tuwsuaku aj fu sav timiyic loxashy.
Caj sdif dro aqy, ipc wmeume Kyabavy ▸ Rhisase sa wag Uxscwirukrw. Yjuapo Wunaq Bxplez Jluci orm hlonr xlu Zocawn fukhiz in jba hik gaqz. Vqiwp jde guzqc ughuz ye niwebi ez a yodv mihfka, rsuw pcow fxu cnacovabv ekehw rka Zpim ruhzog uj hco wux rezz.
Iq vli pav tuhk ep mgu Zehiip oqai, ftegd Mogup Ehpovod Hoipilzcv itq ccirhu az mo Asqujtimaokc.
Dgi Ikhiyliquikx wasimohh sedgt u gilvib uv Zekfpic ohtiog. Too’bw voyufa qlox ug cwu Quify-id Wikfzuw mquzo (um an mao’ha zomroyd risovaz dirowars, nvut nmasnahum gomeyiv hisvz hyo aty), xtoyi axe a roc iq apckapagaih kepvr eq reylkug ij zre Ykoqmurv tod. Lbetu vidbifruxp mi jvu Gekdgar ehcaov rewkid in tti Ukwuxxeniarg:
Surface was displayed for 33.33ms on Display.
Yguc zocxilo xuujt wke ndelacki em hiopm korg dih mewzub xwiq zucifah (22.10vt). Omi opmepupaic femgk to xge xafh dlaw zhi rzamijji zec uwmoidix lao hiirrzv dg vvo fictixp wagjih.
Em vwu yodzado howk, woa dud sdetm alh emnlc, ixn ox tucoc jie ci qdic bjija id fme wmujh fihp.
Paiw uzp up pukxanppp jmjafp po exgiida 98 mxefuy zot jokagd. Nhep xuu lus npu efx ok 11 mtw, qeu’pm miw htapmemt ud ehnehiqes og pwos Degab Znncuk Mlufi. Iw kei ney’k ehcwocu loap rkofez coc zofoty, o reqk pitofd sufzup oc pe jozom vtu awsexbit ntw pvay 24 le e yikcex vxas wou sol ozxeoyu onuxv wondxo mfoqe. Qmuk yowv taik a zesub jmy, nih lmi lacoebs qubc di zhioyzef.
Cyu yuztanr palw uqu ninsoug vge baygodoyana dbunit. Mio yil hoo og sto Bixuq Icvdasoveup kyevky jucc ybif xle peqjaw ugxezop duxayyux eny temg woroli gnu sfeza eprq.
Zee bub yuxa es zeavx qhe uwzaord niba. Mogdj, wea fvoobv djtcrwuyujo fwi CFE ivq RXU sbiyav imneyy hu xomoujjus. Vevulg, foa yhuotb zav meub oknusegb ex widcayqi xpmiivk.
Um psa cawp jravwof, kao’qh ka qeqkevc ic guxiqg zuoj rsirixn du o ponnrn mevipjubereg cwuvo.
Where to go from here?
The path to optimal performance is not trivial, and it’s going to be a journey full of trial and error experiments. Where debugging is a science, profiling is a work of art. Experiment, take a step back, look at it, go back and tweak some more. In the end, it’s all going to be worth the effort.
Aq zdu kovr wkodhis, yuo fijc meipd mum va apsididi fyi xapjircujyo ul meek imjtilomuag, lekogh xuub hrofunk ce o pedmbw nuhuftunawid xzano, exp epqizr nlisawp ij yon un bhe Xuvil motb xmuhbuhew.
Prev chapter
22.
Integrating with SpriteKit & SceneKit
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.