Flashplatform optimizing content türkçe

  • 1,610 views
Uploaded on

Flashplatform optimizing content türkçe

Flashplatform optimizing content türkçe

More in: Education , Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,610
On Slideshare
0
From Embeds
0
Number of Embeds
6

Actions

Shares
Downloads
6
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. ADOBE®FLASH®PLATFORMiçin Performansı En İyileştirme
  • 2. Son güncelleme 30/3/2011Telif Hakkı© 2011 Adobe Systems Incorporated and its licensors. All rights reserved.Adobe® Flash® Platform için Performansı En İyileştirmeThis user guide is protected under copyright law, furnished for informational use only, is subject to change without notice, and should not be construed as acommitment by Adobe Systems Incorporated. Adobe Systems Incorporated assumes no responsibility or liability for any errors or inaccuracies that may appearin the informational content contained in this guide.This guide is licensed for use under the terms of the Creative Commons Attribution Non-Commercial 3.0 License. This License allows users to copy, distribute,and transmit the user guide for noncommercial purposes only so long as (1) proper attribution to Adobe is given as the owner of the user guide; and (2) anyreuse or distribution of the user guide contains a notice that use of the user guide is governed by these terms. The best way to provide notice is to include thefollowing link. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/.Adobe, the Adobe logo, Acrobat, Acrobat Capture, Acrobat Connect, Acrobat Messenger, Acrobat 3D Capture, ActionScript, ActiveTest, Adobe ActionSource,Adobe AIR, Adobe AIR logo, Adobe Audition, Adobe Caslon, Adobe Connect, Adobe DataWarehouse, Adobe Dimensions, Adobe Discover, Adobe FinancialServices, Adobe Garamond, Adobe Genesis, Adobe Griffo, Adobe Jenson, Adobe Kis, Adobe OnLocation, Adobe Originals logo, Adobe PDF logo, AdobePremiere, AdobePS, Adobe SiteSearch, Adobe Type Manager, Adobe Wave, Adobe Wave logo , Adobe WebType, Adobe Wood Type, After Effects, AIR , Alexa,Andreas, Arno, ATM, Authorware, Balzano, Banshee, Benson Scripts, Better by Adobe. , Bickham Script, Birch, Blackoak, Blue Island, Brioso, BusinessCatalyst,Buzzword, Caflisch Script, Cairngorm, Calcite, Caliban, Captivate, Carta, Chaparral, Charlemagne, Cheq, Classroom in a Book, ClickMap, Co-Author,ColdFusion, ColdFusion Builder, Conga Brava, Contribute, Copal, Coriander, Cottonwood, Creative Suite, Critter, Cronos, CS Live, Custom Insight,CustomerFirst, Cutout, Digital Pulse, Director, Distiller, DNG logo, Dreamweaver, DV Rack, Encore, Engaging beyond the Enterprise, ePaper, Ex Ponto,Fireworks, Flash, Flash logo, Flash Access, Flash Access logo, Flash Builder, Flash Cast , FlashCast, Flash Catalyst, FlashHelp, Flash Lite, Flash on., FlashPaper,Flash Platform Services logo , Flex, Flex Builder, Flood, Font Folio, Frame , FrameCenter, FrameConnections, FrameMaker, FrameManager, FrameViewer,FreeHand, Fusaka, Galahad, Giddyup, Giddyup Thangs, GoLive, GoodBarry, Graphite, HomeSite, HBX, HTML Help Studio, HTTP Dynamic Streaming logo ,Hypatia, Illustrator, ImageReady, Immi 505, InCopy, InDesign, Ironwood, Jimbo, JRun, Juniper, Kazuraki, Kepler, Kinesis, Kozuka Gothic, Kozuka Mincho,Kuler, Leander Script, Lens Profile Creator logo , Lightroom, Lithos, LiveCycle, Macromedia, Madrone, Mercado, Mesquite, Mezz, Minion, Mojo, Montara,Moonglow, MXML, Myriad, Mythos, Nueva, Nyx, 1-Step RoboPDF, Omniture, Open Screen Project, Open Source Media Framework logo, OpenType logo,Ouch!, Ovation, PageMaker, PageMaker Portfolio, PDF JobReady, Penumbra, Pepperwood, Photoshop, Photoshop logo, Pixel Bender, Poetica, Ponderosa,Poplar, Postino, PostScript, PostScript logo, PostScript 3, PostScript 3i, Powered by XMP, Prana, PSPrinter, Quake, Rad, Reader, Real-Time Analytics, Reliq,RoboEngine, RoboHelp, RoboHTML, RoboLinker, RoboPDF, RoboScreenCapture, RoboSource Control, Rosewood, Roundtrip HTML, Ryo, Sanvito, Sava,Scene7, See What’s Possible , Script Teaser, Shockwave, Shockwave Player logo, Shuriken Boy, Silentium, Silicon Slopes, SiteCatalyst, SiteCatalyst NetAverages,Software Video Camera, Sonata, Soundbooth, SoundEdit, Strumpf, Studz, Tekton, Test&Target, 360Code, Toolbox, Trajan, TrueEdge, Type Reunion, Ultra,Utopia, Vector Keying, Version Cue, VirtualTrak, Visual Call, Visual Communicator, Visual Sciences, Visual Sensor, Visual Server, Viva, Voluta , Warnock,Waters Titling, Wave , Willow, XMP logo, Zebrawood are either registered trademarks or trademarks of Adobe Systems Incorporated in the United States and/orother countries.Android is a trademark of Google Inc. ActiveX and Windows are either registered trademarks or trademarks of Microsoft Corporation in the United States andother countries. Windows is either a registered trademark or a trademark of Microsoft Corporation in the United States and/or other countries. Macintosh is atrademark of Apple Inc., registered in the U.S. and other countries. All other trademarks are the property of their respective owners.Updated Information/Additional Third Party Code Information available at http://www.adobe.com/go/thirdparty.Portions include software under the following terms:This product includes software developed by the Apache Software Foundation (http://www.apache.org/).MPEG Layer-3 audio compression technology licensed by Fraunhofer IIS and Thomson Multimedia (http://www.mp3licensing.com).This software is based in part on the work of the Independent JPEG Group.Speech compression and decompression technology licensed from Nellymoser, Inc. (www.nellymoser.com).Video in Flash Player is powered by On2 TrueMotion video technology. © 1992-2005 On2 Technologies, Inc. All Rights Reserved. http://www.on2.com.This product contains either BSAFE and/or TIPEM software by RSA Security, Inc.Sorenson Spark™ video compression and decompression technology licensed from Sorenson Media, Inc.Adobe Systems Incorporated, 345 Park Avenue, San Jose, California 95110, USA.Notice to U.S. Government End Users: The Software and Documentation are “Commercial Items,” as that term is defined at 48 C.F.R. §2.101, consisting of“Commercial Computer Software” and “Commercial Computer Software Documentation,” as such terms are used in 48 C.F.R. §12.212 or 48 C.F.R. §227.7202,as applicable. Consistent with 48 C.F.R. §12.212 or 48 C.F.R. §§227.7202-1 through 227.7202-4, as applicable, the Commercial Computer Software andCommercial Computer Software Documentation are being licensed to U.S. Government end users (a) only as Commercial Items and (b) with only those rightsas are granted to all other end users pursuant to the terms and conditions herein. Unpublished-rights reserved under the copyright laws of the United States.Adobe agrees to comply with all applicable equal opportunity laws including, if appropriate, the provisions of Executive Order 11246, as amended, Section 402of the Vietnam Era Veterans Readjustment Assistance Act of 1974 (38 USC 4212), and Section 503 of the Rehabilitation Act of 1973, as amended, and theregulations at 41 CFR Parts 60-1 through 60-60, 60-250, and 60-741. The affirmative action clause and regulations contained in the preceding sentence shall beincorporated by reference.
  • 3. iiiSon güncelleme 30/3/2011İçindekilerBölüm 1: GirişÇalışma zamanı kodunu çalıştırmanın temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1Algılanan performans ile gerçek performansın karşılaştırılması . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2En iyileştirmelerinizin hedefini belirleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3Bölüm 2: Belleği saklamaGörüntüleme nesneleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4İlkel türler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4Nesneleri yeniden kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6Belleği boşaltmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11Bitmapleri kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12Filtreleri ve dinamik bitmapi kaldırma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18Doğrudan mipmap oluşturma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193B efektlerini kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20Metin nesneleri ve bellek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21Olay modeli ile geri aramaların karşılaştırması . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22Bölüm 3: CPU kullanımını en aza indirmeCPU kullanımı için Flash Player 10.1 geliştirmeleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23Uyku modu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25Nesneleri dondurma ve çözme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Olayları etkinleştirme ve devre dışı bırakma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Fare etkileşimleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30Zamanlayıcılarla ENTER_FRAME olaylarının karşılaştırılması . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31Hareket arası oluşturma sendromu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33Bölüm 4: ActionScript 3.0 performansıVector sınıfının Array sınıfıyla karşılaştırılması . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34Çizim APIsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35Olayı dıştan içe ve içten dışa tetikleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36Piksellerle çalışma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38Normal ifadeler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39Çeşitli en iyileştirmeler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40Bölüm 5: Performans oluşturmaYeniden çizilen bölgeler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46Sahne alanı dışı içerik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47Film kalitesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48Alfa karıştırma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50Uygulama kare hızı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51Bitmapleri önbelleğe alma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52Bitmapleri elle önbelleğe alma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60Metin nesnelerinin oluşturulması . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66GPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
  • 4. ivFLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEİçindekilerSon güncelleme 30/3/2011Eş zamanlı olmayan işlemler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73Saydam pencereler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74Vektör şekli düzleştirme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75Bölüm 6: Ağ etkileşimini en iyileştirmeAğ etkileşimi için geliştirmeler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77Harici içerik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78Girdi çıktı hataları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81Flash Remoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82Gereksiz ağ işlemleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84Bölüm 7: Medya ile çalışmaVideo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85StageVideo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85Ses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85Bölüm 8: SQL veritabanı performansıVeritabanı performansı için uygulama tasarımı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87Veritabanı dosyası en iyileştirmesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90Gereksiz veritabanı çalışma zamanı işleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90Etkili SQL sözdizimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91SQL ifadesinin performansı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92Bölüm 9: Kıyaslama ve konuşlandırmaKıyaslama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93Dağıtma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
  • 5. 1Son güncelleme 30/3/2011Bölüm 1: GirişAdobe® AIR® ve Adobe® Flash® Player uygulamaları, masaüstleri, mobil aygıtlar, tabletler ve televizyon aygıtları gibibirçok platformda çalışır. Bu belge, bu uygulamaları dağıtan geliştiriciler için en iyi çalışma biçimlerini ana hatlarıylakod örnekleri ve kullanım durumları üzerinden anlatır. Konular şunlardır:• Belleği saklama• CPU kullanımını en aza indirme• ActionScript 3.0 performansını geliştirme• Oluşturma hızını artırma• Ağ etkileşimini en iyileştirme• Ses ve videoyla çalışma• SQL veritabanı performansını en iyileştirme• Uygulamaları kıyaslama ve konuşlandırmaBu en iyileştirmelerin çoğu, hem AIR çalışma zamanında hem de Flash Player çalışma zamanında tüm aygıtlardakiuygulamalar için geçerlidir. Belirli aygıtlar için eklemeler ve istisnalar da ele alınmaktadır.Bu en iyileştirmelerin bazıları, Flash Player 10.1 ve AIR 2.5te sunulan yeteneklere odaklanır. Ancak bu eniyileştirmelerin çoğu, önceki AIR ve Flash Player sürümleri için de geçerlidir.Çalışma zamanı kodunu çalıştırmanın temelleriUygulama performansının nasıl iyileştirileceğini anlamanın bir püf noktası da Flash Platform çalışma zamanının kodunasıl çalıştırdığını anlamaktır. Çalışma zamanı, karelerin her birinde gerçekleşen belirli hareketlerle döngü içindeçalışır. Bu durumda, bir kare, uygulama için belirtilen kare hızının belirlediği basit bir zaman bloğudur. Karelerin herbirine paylaştırılan süre doğrudan kare hızına karşılık gelir. Örneğin, saniyede 30 karelik bir kare hızı belirlerseniz,çalışma zamanı, her karenin bir saniyenin 30’da biri kadar sürmesini sağlamaya çalışır.Uygulamanızın ilk kare hızını geliştirme zamanında belirlersiniz. Kare hızını Adobe® Flash® Builder™ veya FlashProfessionaldaki ayarları kullanarak ayarlayabilirsiniz. Birinci kare hızını kodda da belirtebilirsiniz. YalnızcaActionScript olan bir uygulamada, kare hızını kök belge sınıfınıza [SWF(frameRate="24")] meta veri etiketiniuygulayarak ayarlayın. MXML’de, Application veya WindowedApplication etiketindeki frameRate niteliğiniayarlayın.Her kare döngüsü üç bölüme ayrılmış iki aşamadan oluşur: olaylar, enterFrame olayı ve oluşturma.Birinci aşama iki bölüm içerir (olaylar ve enterFrame olayı), ikisi de büyük olasılıkla kodunuzun çağrılmasıylasonuçlanır. Birinci aşamanın ilk bölümünde, çalışma zamanı olayları gelir ve gönderilir. Bu olaylar, bir ağ üzerindenyapılan veri yüklemeden gelen bir yanıt gibi senkronize olmayan işlemlerin tamamlanmasını veya ilerlemesini temsiledebilir. Ayrıca, bu olaylar kullanıcı girdisinden gelen olayları da içerir. Çalışma zamanı, olaylar gönderilirkenkodunuzu, kaydettirdiğiniz dinleyicilerde çalıştırır. Herhangi bir olay gerçekleşmezse, çalışma zamanı bu çalıştırmaaşamasını herhangi bir işlem gerçekleştirmeden tamamlamayı bekler. Çalışma zamanı, bir etkinliğin olmamasındandolayı, kare hızını asla hızlandırmaz. Olaylar çalıştırma döngüsünün diğer bölümleri sırasında gerçekleşirse, çalışmazamanı bu olayları sıraya dizer ve bir sonraki karede gönderir.
  • 6. 2FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEGirişSon güncelleme 30/3/2011Birinci karenin ikinci bölümü enterFrame olayıdır. Bu olay, her karede bir defa gönderildiği için diğerlerindenfarklıdır.Tüm olaylar gönderildiğinde, kare döngüsünün oluşturma aşaması başlar. Bu noktada, çalışma zamanı ekrandagörünür olan tüm öğelerin durumunu hesaplar ve bu öğeleri ekranda çizer. Ardından bu süreç, bir parkurunetrafından koşan bir koşucu gibi kendini tekrar eder.Not: Bir updateAfterEvent özelliğini içeren olaylar için, görüntü oluşturma oluşturma aşamasının başlamasınıbeklemeden zorla başlatılabilir. Ancak, sıklıkla performans sorunlarına neden oluyorsa, updateAfterEvent öğesinikullanmaktan kaçının.Kare döngüsündeki iki aşamanın eşit miktarda süre harcadığını düşünmek en kolay yoldur. Bu durumda, karedöngülerinin her birinin yarısı için, olay işleyicileri ve uygulama kodu çalışır ve diğer yarısı için oluşturma gerçekleşir.Ancak, gerçekte meydana gelen durum genellikle farklıdır. Bazen uygulama kodu, kendisine ayrılan süreyi uzatarak veoluşturma için ayrılan süreyi kısaltarak karedeki kullanılabilir sürenin yarısından fazlasını alır. Özellikle de filtreler vekarıştırma modları gibi karmaşık görsel içeriğin olduğu başka durumlarda, oluşturma işlemi, kare hızının yarısındanfazlasını gerektirir. Aşamaların kullandığı gerçek süre esnek olduğundan, kare döngüsü genellikle “elastik parkur”olarak bilinir.Kare döngüsü işlemlerinin bileşimi (kod çalıştırma ve oluşturma) fazla uzun sürerse, çalışma zamanı kare hızınıkoruyamaz. Kare, kendisine ayrılan süreden daha fazlasını alarak genişler, böylece bir sonraki kare tetiklenmeden öncebir gecikme olur. Örneğin, bir kare döngüsü saniyenin otuzda birinden daha uzun süre alıyorsa, çalışma zamanı ekranı30 kare/sn hızında güncelleştiremez. Kare hızı yavaşladığında, kullanıcının deneyimi kötüleşir. En iyi durumda bileanimasyon kesik olur. Daha kötü durumlarda, uygulama kilitlenir ve boş pencere görüntülenir.Flash Platform çalışma zamanı kodunu çalıştırmayla ve oluşturma modeliyle ilgili daha fazla ayrıntı için, aşağıdakikaynakları inceleyin:• Flash Player Mental Model - The Elastic Racetrack (Flash Player Zihin Modeli - Elastik Parkur) (makale Ted Patricktarafından yazılmıştır)• Asynchronous ActionScript Execution (ActionScript’i Senkronize Olmayan Bir Şekilde Çalıştırma) (makale TrevorMcCauley tarafından yazılmıştır)• Adobe AIRyi kod yürütme, bellek ve oluşturma için en iyi hale getirme:http://www.adobe.com/go/learn_fp_air_perf_tv_tr (Sean Christmannın MAX konferansındaki sunumununvideosu)Algılanan performans ile gerçek performansınkarşılaştırılmasıUygulamanızın iyi performans gösterip göstermediği konusunda en son kararı verecek kişiler, uygulamanınkullanıcılarıdır. Geliştiriciler, uygulamanın performansını belirli işlemlerin çalışmak için ne kadar süre gerektirdiğiveya nesnelerin kaç tane örneğinin oluşturulduğuna göre ölçebilir. Ancak, bu ölçümler son kullanıcılar için önemlideğildir. Bazen kullanıcılar performansı değişik kriterlere göre ölçerler. Örneğin, uygulama hızlı ve sorunsuz birşekilde çalışıp girdilere hızlı bir şekilde yanıt veriyor mu? Sistem performansı üzerinde negatif bir etkisi var mı?Algılanan performansla ilgili sınama yapmak için kendinize aşağıdaki soruları sorun:• Animasyonlar düzgün mü yoksa kesik mi?• Video içeriği düzgün mü yoksa kesik mi görünüyor?• Ses klipleri devamlı oynatılıyor mu, yoksa duraklatılıp devam mı ediyor?
  • 7. 3FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEGirişSon güncelleme 30/3/2011• Uzun işlemler sırasında pencere titriyor mu veya boş görünüyor mu?• Yazmaya başladığınızda, metin girişi yazma hızıma yetişiyor mu yoksa gecikiyor mu?• Bir öğeyi tıklattığınızda hemen işlem gerçekleşiyor mu, yoksa gecikme mi var?• Uygulama çalışırken CPU fanı daha fazla gürültü çıkarıyor mu?• Uygulama bir dizüstü bilgisayarda veya mobil aygıtta çalıştırılırken, pil gücü hızla tükeniyor mu?• Uygulama çalışırken diğer uygulamalar yavaş yanıt veriyor mu?Algılanan performans ve gerçek performansın arasındaki farklar önemlidir. En iyi algılanan performansıgerçekleştirmenin yolu her zaman mutlak en hızlı performansı sağlamakla aynı yol değildir. Uygulamanızın, çalışmazamanının sık sık ekranı güncelleme ve kullanıcı girdisi alma işlemlerini gerçekleştiremeyeceği kadar kodçalıştırmadığından emin olun. Bazı durumlarda bu dengeyi sağlamak için, bir program görevi parçalara ayrılabilir,böylece çalışma zamanı, parçaların arasında ekranı günceller. (Daha özel konularda yardım almak için bkz.“Performans oluşturma” sayfa 46.)Burada açıklanan ipuçları ve teknikler hem asıl kod çalıştırma performansını hem de kullanıcıların performansıalgılayış biçimini iyileştirmeyi hedefler.En iyileştirmelerinizin hedefini belirlemeBazı performans geliştirmeleri kullanıcılar için fark edilebilir bir geliştirme oluşturmaz. Performans eniyileştirmelerini sizin belirli uygulamanızda sorun çıkaran alanlar üzerinde yoğunlaştırmanız önemlidir. Bazıperformans en iyileştirmeleri genel olarak faydalı uygulamalardır ve her zaman takip edilebilir. Diğer eniyileştirmelerin kullanışlı olup olmadığı uygulamanızın gereksinimlerine ve öngörülen kullanıcı tabanına bağlıdır.Örneğin, herhangi bir animasyon, video veya grafik filtresi ve efekt kullanmazsanız uygulamalar her zaman daha iyiperformans gösterir. Ancak, uygulama oluşturmak için Flash Platform kullanmanın nedenlerinden biri de zengin veetkileyici uygulamalara olanak veren medya ve grafik özellikleridir. Uygulamada istediğiniz zenginlik düzeyininuygulamanın çalıştığı makine ve aygıtların performans özellikleriyle uygun bir şekilde eşleşip eşleşmediğini düşünün.Bu konuda genel olarak verilebilecek iyi bir öneri “en iyileştirme işlemini erken yapmaktan olabildiğince kaçınmak”tır.Bazı performans en iyileştirmeleri, kodun daha zor okunacak veya daha az esnek bir şekilde yazılmasını gerektirir.Böyle kodlar, en iyileştirildiğinde, daha zor korunur. Bu en iyileştirmeler için, genelde kodu en iyileştirmeden öncebekleyip kodun belirli bir bölümünün başarısız performans gösterip göstermediğini belirlemek daha faydalıdır.Bazen, performansı iyileştirmek için bir denge kurmak gerekir. İdeal olarak, bir uygulama tarafından kullanılan belleğidüşürmek, o uygulamanın bir görevi gerçekleştirme hızını arttırır. Ancak, ideal olan iyileştirme her zaman mümkündeğildir. Örneğin, bir uygulama işlem sırasında kilitleniyorsa, çözüm genellikle işi birden fazla kare üzerindençalıştırılacak şekilde bölmektir. İş ayrıldığından, genel olarak işlemin gerçekleşme süresinin uzaması mümkündür.Ancak, uygulama girdiye yanıt vermeye devam eder ve donmazsa kullanıcı bu ek zamanı fark etmeyebilir.Neyin en iyileştirileceği ve en iyileştirmelerin faydalı olup olmadığı konusunda fikir edinmeye ilişkin püfnoktalarından biri performans testleri yapmaktır. Performansın test edilmesiyle ilgili çeşitli teknikler ve ipuçları“Kıyaslama ve konuşlandırma” sayfa 93 bölümünde açıklanmaktadır.Uygulamanın en iyileştirme için iyi birer aday olan parçalarının belirlenmesi hakkında daha fazla bilgi için aşağıdakikaynakları inceleyin:• AIR için performans ayarlama uygulamaları: http://www.adobe.com/go/learn_fp_goldman_tv_tr (OliverGoldmanın MAX konferansındaki sunumunun videosu)• Performans ayarlayan Adobe AIR uygulamaları: http://www.adobe.com/go/learn_fp_air_perf_devnet_tr (OliverGoldmanın sunuma dayalı Adobe Developer Bağlantısı makalesi)
  • 8. 4Son güncelleme 30/3/2011Bölüm 2: Belleği saklamaBelleği saklamak, masaüstü uygulamalarında bile uygulama gelişimi açısından her zaman önemlidir. Ancak, mobilcihazlarda bellek tüketimi daha önemlidir ve uygulamanızın kullandığı bellek miktarını sınırlamakta fayda vardır.Görüntüleme nesneleriUygun bir görüntüleme nesnesi seçin.ActionScript 3.0 büyük bir görüntüleme nesneleri kümesi içerir. Bellek kullanımını kısıtlamaya ilişkin en basit eniyileştirme ipuçlarından biri uygun bir görüntüleme nesnesi türü kullanmaktır. Etkileşimli olmayan basit şekiller için,Shape nesneleri kullanın. Bir zaman çizelgesi gerektirmeyen etkileşimli nesneler için, Sprite nesneleri kullanın. Birzaman çizelgesi kullanan animasyonlar için, MovieClip nesneleri kullanın. Her zaman uygulamanız için en etkili nesnetürünü seçin.Aşağıdaki kod farklı görüntüleme nesneleri için bellek kullanımını gösterir:trace(getSize(new Shape()));// output: 236trace(getSize(new Sprite()));// output: 412trace(getSize(new MovieClip()));// output: 440getSize() yöntemi bir nesnenin bellekte kaç bayt kullandığını gösterir. MovieClip nesnesinin özelliklerine ihtiyaçyoksa basit Shape nesneleri yerine çoklu MovieClip nesnelerin kullanılması durumunda belleğin boşa kullanıldığınıgörebilirsiniz.İlkel türlerKodu kıyaslamak ve görev için en etkili nesneyi seçmek için getSize() yöntemini kullanın.String haricindeki tüm ilkel türler bellekte 4 - 8 bayt kullanır. Belleği ilkel bir tür için herhangi bir tür kullanarak eniyileştirmenin bir yolu yoktur.
  • 9. 5FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEBelleği saklamaSon güncelleme 30/3/2011// Primitive typesvar a:Number;trace(getSize(a));// output: 8var b:int;trace(getSize(b));// output: 4var c:uint;trace(getSize(c));// output: 4var d:Boolean;trace(getSize(d));// output: 4var e:String;trace(getSize(e));// output: 464 bitlik bir değeri temsil eden bir Sayıya bir değer atanmadıysa, o sayıya ActionScript Virtual Machine (AVM)tarafından 8 bayt ayrılır. Diğer ilkel türlerin tümü 4 baytlık bölümler halinde saklanır.// Primitive typesvar a:Number = 8;trace(getSize(a));// output: 4a = Number.MAX_VALUE;trace(getSize(a));// output: 8Davranış String türü için farklıdır. Ayrılan saklama miktarı Stringin uzunluğuna bağlıdır.var name:String;trace(getSize(name));// output: 4name = "";trace(getSize(name));// output: 24name = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsumhas been the industrys standard dummy text ever since the 1500s, when an unknown printer tooka galley of type and scrambled it to make a type specimen book. It has survived not only fivecenturies, but also the leap into electronic typesetting, remaining essentially unchanged. Itwas popularized in the 1960s with the release of Letraset sheets containing Lorem Ipsumpassages, and more recently with desktop publishing software like Aldus PageMaker includingversions of Lorem Ipsum.";trace(getSize(name));// output: 1172Kodu kıyaslamak ve görev için en etkili nesneyi seçmek için getSize() yöntemini kullanın.
  • 10. 6FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEBelleği saklamaSon güncelleme 30/3/2011Nesneleri yeniden kullanmaMümkünse, nesneleri yeniden oluşturmak yerine yeniden kullanın.Belleği en iyileştirmenin başka bir basit yolu nesneleri yeniden kullanmak ve mümkün olduğunda onları yenidenoluşturmaktan kaçınmaktır. Örneğin, bir döngüde, aşağıdaki kodu kullanmayın:const MAX_NUM:int = 18;const COLOR:uint = 0xCCCCCC;var area:Rectangle;for (var:int = 0; i < MAX_NUM; i++){// Do not use the following codearea = new Rectangle(i,0,1,10);myBitmapData.fillRect(area,COLOR);}Her yinelemede yeni bir nesne yaratıldığından her döngü yinelemesinde Rectangle nesnesinin yeniden oluşturulmasıdaha fazla bellek kullanır ve daha yavaştır. Aşağıdaki yaklaşımı kullanın:const MAX_NUM:int = 18;const COLOR:uint = 0xCCCCCC;// Create the rectangle outside the loopvar area:Rectangle = new Rectangle(0,0,1,10);for (var:int = 0; i < MAX_NUM; i++){area.x = i;myBitmapData.fillRect(area,COLOR);}Önceki örnek daha ufak bir bellek etkisine sahip bir nesne kullandı. Bir sonraki örnek bir BitmapData nesnesikullanarak daha büyük bellek tasarrufunu gösterir. Aşağıda bir döşeme efekti oluşturan kod bellek harcar:var myImage:BitmapData;var myContainer:Bitmap;const MAX_NUM:int = 300;for (var i:int = 0; i< MAX_NUM; i++){// Create a 20 x 20 pixel bitmap, non-transparentmyImage = new BitmapData(20,20,false,0xF0D062);// Create a container for each BitmapData instancemyContainer = new Bitmap(myImage);// Add it to the display listaddChild(myContainer);// Place each containermyContainer.x = (myContainer.width + 8) * Math.round(i % 20);myContainer.y = (myContainer.height + 8) * int(i / 20);}
  • 11. 7FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEBelleği saklamaSon güncelleme 30/3/2011Not: Pozitif değerler kullanırken, yuvarlanan değerin int öğesine dağıtılması Math.floor() yöntemininkullanılmasından çok daha hızlıdır.Aşağıdaki resim bitmap döşemenin sonucunu gösterir:Bitmap döşemenin sonucuEn iyileştirilmiş bir sürüm birden fazla Bitmap örneği tarafından başvurulan ve aynı sonucu üreten tek bir BitmapDataörneği oluşturur.// Create a single 20 x 20 pixel bitmap, non-transparentvar myImage:BitmapData = new BitmapData(20,20,false,0xF0D062);var myContainer:Bitmap;const MAX_NUM:int = 300;for (var i:int = 0; i< MAX_NUM; i++){// Create a container referencing the BitmapData instancemyContainer = new Bitmap(myImage);// Add it to the display listaddChild(myContainer);// Place each containermyContainer.x = (myContainer.width + 8) * Math.round(i % 20);myContainer.y = (myContainer.height + 8) * int(i / 20);}Bu yaklaşım yaklaşık 700 KBlık bellek tasarrufu sağlar, bu da geleneksel bir mobil cihaz için önemli bir tasarruftur.Her bitmap kabı Bitmap özelliklerini kullanarak orijinal BitmapData örneğini değiştirmeden işlenebilir:
  • 12. 8FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEBelleği saklamaSon güncelleme 30/3/2011// Create a single 20 x 20 pixel bitmap, non-transparentvar myImage:BitmapData = new BitmapData(20,20,false,0xF0D062);var myContainer:Bitmap;const MAX_NUM:int = 300;for (var i:int = 0; i< MAX_NUM; i++){// Create a container referencing the BitmapData instancemyContainer = new Bitmap(myImage);// Add it to the DisplayListaddChild(myContainer);// Place each containermyContainer.x = (myContainer.width + 8) * Math.round(i % 20);myContainer.y = (myContainer.height + 8) * int(i / 20);// Set a specific rotation, alpha, and depthmyContainer.rotation = Math.random()*360;myContainer.alpha = Math.random();myContainer.scaleX = myContainer.scaleY = Math.random();}Aşağıdaki resim bitmap dönüştürmelerinin sonucunu gösterir:Bitmap dönüştürmelerinin sonucuDaha fazla Yardım konusu“Bitmapleri önbelleğe alma” sayfa 52
  • 13. 9FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEBelleği saklamaSon güncelleme 30/3/2011Nesne kuyruğuMümkünse, nesne kuyruğu kullanın.Başka bir önemli en iyileştirmeye nesne kuyruğu adı verilir, nesne kuyruğu zaman içinde nesnelerin yenidenkullanımını içerir. Uygulamanızın başlatılması sırasında tanımlı bir sayıda nesne oluşturup onları bir Array veyaVector nesnesi gibi bir kuyruk içerisinde saklayabilirsiniz. Bir nesne ile gerçekleştirdiğiniz işlem tamamlandığında,onu işlemci kaynaklarını tüketmemesi için devre dışı bırakabilirsiniz ve karşılıklı başvuruları kaldırırsınız. Ancakbaşvuruların null değerine ayarlanması bu öğeyi çöp toplama için uygun hale getireceğinden bu işlemigerçekleştiremezsiniz. Basitçe nesneyi kuyruğa geri koyarsınız ve yeni bir nesneye ihtiyaç duyduğunuzda geri alırsınız.Nesnelerin tekrar kullanılması, nesneleri örneklendirme ihtiyacını azaltır ve bu durum fazla çaba gerektirebilir. Buayrıca çöp toplayıcının uygulamanızı yavaşlatarak çalışma ihtimalini de düşürür. Aşağıdaki kod, nesne kuyruğutekniğini gösterir:package{import flash.display.Sprite;public final class SpritePool{private static var MAX_VALUE:uint;private static var GROWTH_VALUE:uint;private static var counter:uint;private static var pool:Vector.<Sprite>;private static var currentSprite:Sprite;public static function initialize( maxPoolSize:uint, growthValue:uint ):void{MAX_VALUE = maxPoolSize;GROWTH_VALUE = growthValue;counter = maxPoolSize;var i:uint = maxPoolSize;pool = new Vector.<Sprite>(MAX_VALUE);while( --i > -1 )pool[i] = new Sprite();}
  • 14. 10FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEBelleği saklamaSon güncelleme 30/3/2011public static function getSprite():Sprite{if ( counter > 0 )return currentSprite = pool[--counter];var i:uint = GROWTH_VALUE;while( --i > -1 )pool.unshift ( new Sprite() );counter = GROWTH_VALUE;return getSprite();}public static function disposeSprite(disposedSprite:Sprite):void{pool[counter++] = disposedSprite;}}}SpritePool sınıfı uygulamanın başlangıcında yeni nesnelerden oluşan bir kuyruk oluşturur. getSprite() yöntemi, bunesnelerden örnekler döndürür ve disposeSprite() yöntemi onları bırakır. Kod, kuyruk tamamen kullanıldığındaonun büyümesine olanak verir. Ayrıca, kuyruk yorulduğunda yeni nesnelerin ayrılmayacağı sabit boyutlu bir kuyrukoluşturmak da mümkündür. Mümkünse, döngüler halinde yeni nesneler oluşturmaktan kaçının. Daha fazla bilgi için,bkz. “Belleği boşaltmak” sayfa 11. Aşağıdaki kod yeni örnekler almak için SpritePool sınıfını kullanır:const MAX_SPRITES:uint = 100;const GROWTH_VALUE:uint = MAX_SPRITES >> 1;const MAX_NUM:uint = 10;SpritePool.initialize ( MAX_SPRITES, GROWTH_VALUE );var currentSprite:Sprite;var container:Sprite = SpritePool.getSprite();addChild ( container );for ( var i:int = 0; i< MAX_NUM; i++ ){for ( var j:int = 0; j< MAX_NUM; j++ ){currentSprite = SpritePool.getSprite();currentSprite.graphics.beginFill ( 0x990000 );currentSprite.graphics.drawCircle ( 10, 10, 10 );currentSprite.x = j * (currentSprite.width + 5);currentSprite.y = i * (currentSprite.width + 5);container.addChild ( currentSprite );}}Aşağıdaki kod fare tıklatıldığında tüm görüntüleme nesnelerini görüntüleme nesnesinden kaldırır ve daha sonraonları başka bir görev için yeniden kullanır.
  • 15. 11FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEBelleği saklamaSon güncelleme 30/3/2011stage.addEventListener ( MouseEvent.CLICK, removeDots );function removeDots ( e:MouseEvent ):void{while (container.numChildren > 0 )SpritePool.disposeSprite (container.removeChildAt(0) as Sprite );}Not: Kuyruk vektörü her zaman Sprite nesnelerine başvurur. Nesneyi bellekten tamamen kaldırmak isterseniz, sizeSpritePool sınıfında, kalan tüm başvuruları kaldıracak bir dispose() yöntemi gerekir.Belleği boşaltmakÇöp toplamanın tetiklenmesini sağlamak için nesnelere olan tüm başvuruları silin.Flash Player’ın yayınlama sürümünde çöp toplayıcıyı doğrudan başlatamazsınız. Bir nesnenin çöp olaraktoplandığından emin olmak için, nesneye yapılan tüm başvuruları silin. ActionScript 1.0 ve 2.0’da kullanılan eskidelete operatörünün ActionScript 3.0’da farklı davrandığını unutmayın. Operatör yalnızca dinamik nesnelerindinamik özelliklerini silmek için kullanılabilir.Not: Adobe® AIR® uygulamasında ve Flash Player’ın hata ayıklayıcı sürümünde çöp toplayıcısını doğrudançağırabilirsiniz.Örneğin, aşağıdaki kod bir Sprite başvurusunu null değerine ayarlar:var mySprite:Sprite = new Sprite();// Set the reference to null, so that the garbage collector removes// it from memorymySprite = null;Şunu unutmayın ki, bir nesnenin null değerine ayarlanması bellekten kaldırılacağı anlamına gelmez. Bazenkullanılabilir bellek yeterince düşük sayılmıyorsa çöp toplayıcı çalışmaz. Çöp toplama tahmin edilemez. Nesne silmeyerine bellek ayırma işlemi çöp toplamayı tetikler. Çöp toplayıcı çalıştığında, henüz toplanmamış nesne grafikleribulur. Grafiklerde birbirine başvuran nesneleri bularak etkin olmayan ancak uygulamanın artık kullanmadığınesneleri algılar. Bu şekilde algılanan etkin olmayan nesneler silinir.Büyük uygulamalarda, bu işlem yoğun CPU kullanımına neden olabilir, performansı etkileyebilir ve uygulamada farkedilir bir yavaşlama meydana getirebilir. Mümkün olduğunca nesneleri yeniden kullanarak çöp toplamayı kısıtlamayıdeneyin. Ayrıca, mümkün olduğunda, başvuruları null olarak ayarlayın, böylece çöp toplayıcı, nesneleri bulmak içindaha az işleme zamanı harcar. Çöp toplama işlemini garanti sağlayan bir işlem olarak göz önünde bulundurun vemümkünse her zaman nesne ömürlerini açık bir şekilde yönetin.Not: Bir görüntüleme nesnesine yapılan başvurunun null olarak ayarlanması, nesnenin donduğunu garantilemez.Nesne, çöp olarak toplanana kadar CPU döngülerini kullanmaya devam eder. Başvurusunu null olarak ayarlamadanönce nesnenizi düzgün şekilde devre dışı bıraktığınızdan emin olun.Çöp toplayıcı Adobe AIR’de ve Flash Player’ın hata ayıklayıcı sürümünde mevcut olan System.gc() yöntemikullanılarak başlatılabilir. Adobe® Flash® Builder™ ile paketlenen profil oluşturucu, çöp toplayıcıyı el ile başlatmanızaolanak tanır. Çöp toplayıcıyı çalıştırmak uygulamanızın nasıl yanıt verdiğini ve nesnelerin bellekten doğru bir şekildesilinip silinmediğini görmenize olanak verir.Not: Bir nesne bir olay dinleyicisi olarak kullanılmışsa, başka bir nesne ona başvurabilir. Bu durumda, başvuruları nullolarak ayarlamadan önce removeEventListener() yöntemini kullanan olay dinleyicilerini kaldırın.
  • 16. 12FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEBelleği saklamaSon güncelleme 30/3/2011Neyse ki, bitmapler tarafından kullanılan bellek miktarı hızlı bir şekilde azaltılabilir. Örneğin, BitmapData sınıfı birdispose() yöntemi içerir. Bir sonraki örnek 1.8 MBlık bir BitmapData örneği oluşturur. Kullanımda olan geçerlibellek 1,8 MBa çıkar ve System.totalMemory özelliği daha küçük bir değer döndürür:trace(System.totalMemory / 1024);// output: 43100// Create a BitmapData instancevar image:BitmapData = new BitmapData(800, 600);trace(System.totalMemory / 1024);// output: 44964Daha sonra, BitmapData bellekten elle kaldırılır (atılır) ve bellek kullanımı bir defa daha kontrol edilir:trace(System.totalMemory / 1024);// output: 43100// Create a BitmapData instancevar image:BitmapData = new BitmapData(800, 600);trace(System.totalMemory / 1024);// output: 44964image.dispose();image = null;trace(System.totalMemory / 1024);// output: 43084dispose() yöntemi pikselleri bellekten kaldırsa da, başvuru yine de onu tamamen bırakmak için null değerineayarlanmalıdır. Belleğin hemen boşaltılması için artık bir BitmapData nesnesine ihtiyaç duymadığınızda her zamandispose() yöntemini çağırın ve başvuruyu null değerine ayarlayın.Not: Flash Player 10.1 ve AIR 1.5.2, System sınıfında disposeXML() adlı yeni bir yöntem sunar. Bu yöntem XMLağacını bir parametre olarak ileterek bir XML nesnesini anında çöp toplamaya uygun hale getirir.Daha fazla Yardım konusu“Nesneleri dondurma ve çözme” sayfa 26Bitmapleri kullanmaBitmapler yerine vektörlerin kullanılması bellek kazanmanın iyi bir yoludur. Ancak, özellikle yüksek sayıda vektörkullanımı, işlemci ve GPU kaynağı ihtiyacını önemli ölçüde artırır. Çalışma zamanı ekranda piksel çizmek için vektöriçeriği oluşturmaya kıyasla daha az işleme kaynağı gerektireceğinden, bitmap kullanmak, oluşturmayı en iyileştirmekiçin iyi bir yoldur.Daha fazla Yardım konusu“Bitmapleri elle önbelleğe alma” sayfa 60
  • 17. 13FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEBelleği saklamaSon güncelleme 30/3/2011Bitmap altörneklemeBelleği daha etkili bir şekilde kullanmak için, Flash Player bir 16-bit ekran algıladığında 32-bit opak görüntüler 16-bitgörüntülere indirgenir. Bu altörnekleme, bellek kaynaklarının yarısını tüketir, ve görüntüler daha hızlı oluşturulur. Buözellik yalnızca Windows Mobile için Flash Player 10.1de mevcuttur.Not: Flash Player 10.1den önce bellekte oluşturulan tüm pikseller 32 bitlik (4 bayt) bölümler halinde saklanıyordu. 300x 300 piksellik basit bir logo 350 KBlık bellek harcıyordu (300*300*4/1024). Bu yeni davranışla, aynı opak logosuyalnızca 175 KB harcar. Logo saydamsa, 16 bit’e aşağı örneklenmez ve bellekte aynı boyutta yer kaplar. Bu özellikyalnızca gömülü bitmapler veya çalışma zamanında yüklenmiş görüntüler (PNG, GIF, JPG) için geçerlidir.Mobil cihazlarda, 16 bit ile oluşturulan bir görüntüyle 32 bit ile oluşturulan aynı görüntü arasındaki farkı anlamak zorolabilir. Yalnızca birkaç renk içeren basit bir görüntü için, algılanabilir bir fark yoktur. Daha karmaşık bir görüntü içinbile farkları algılamak zordur. Ancak, resmi yakınlaştırırken az miktarda renk bozulması olabilir ve bir 32 bit degradegörüntü 16 bit olanından daha düzgün görünebilir.Tekli BitmapData başvurusuÖrnekleri mümkün olduğunca tekrar kullanarak BitmapData sınıfının kullanımını en iyileştirmek önemlidir. FlashPlayer 10.1 ve AIR 2.5, tüm platformlar için tekli BitmapData başvurusu adında yeni bir özellik sunar. Gömülügörüntüden BitmapData örnekleri oluştururken, bütün BitmapData örnekleri için tek bir bitmap sürümü kullanılır.Bir bitmap daha sonra değiştirilirse, ona bellekte kendi benzersiz bitmap’i verilir. Gömülü görüntü, kütüphanedenveya bir [Embed] etiketinden gelebilir.Not: Ayrıca, Flash Player 10.1 ve AIR 2.5, bitmapleri otomatik olarak yeniden kullandığından mevcut içerik de buözellikten faydalanır.Gömülü bir görüntüyü örneklediğiniz zaman bellekte ilişkili bir bitmap oluşturulur. Flash Player 10.1 ve AIR 2.5tenönce, aşağıdaki şemada gösterildiği gibi bellekte her örneğe ayrı bir bitmap veriliyordu:Flash Player 10.1 ve AIR 2.5 öncesinde bellekteki bitmaplerFlash Player 10.1 ve AIR 2.5te, aynı görüntünün birden fazla örneği oluşturulduğunda, tüm BitmapData örnekleri içinbitmapin tek bir sürümü kullanılır. Aşağıdaki şema bu kavramı gösterir:Bellekteki GörüntülenenLogo ÖrneğiLogo ÖrneğiBitmap KaynağıBitmap Kaynağı
  • 18. 14FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEBelleği saklamaSon güncelleme 30/3/2011Flash Player 10.1 ve AIR 2.5te bellekteki bitmaplerBu yaklaşım bir uygulama tarafından birçok bitmap ile kullanılan bellek miktarını önemli ölçüde düşürür. Aşağıdakikod bir Star sembolünün birden fazla örneğini oluşturur:const MAX_NUM:int = 18;var star:BitmapData;var bitmap:Bitmap;for (var i:int = 0; i<MAX_NUM; i++){for (var j:int = 0; j<MAX_NUM; j++){star = new Star(0,0);bitmap = new Bitmap(star);bitmap.x = j * star.width;bitmap.y = i * star.height;addChild(bitmap)}}Aşağıdaki resim kodun sonucunu gösterir:Bellekteki GörüntülenenLogo ÖrneğiLogo ÖrneğiBitmap Kaynağı
  • 19. 15FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEBelleği saklamaSon güncelleme 30/3/2011Birden fazla sembol örneği oluşturacak kod sonucuÖrneğin, Flash Player 10 ile yukarıdaki animasyon 1008 KB bellek kullanır. Flash Player 10.1 ile, masaüstü ve mobilaygıttaki animasyon yalnızca 4 KB kullanır.Aşağıdaki kod bir BitmapData örneğini değiştirir:const MAX_NUM:int = 18;var star:BitmapData;var bitmap:Bitmap;for (var i:int = 0; i<MAX_NUM; i++){for (var j:int = 0; j<MAX_NUM; j++){star = new Star(0,0);bitmap = new Bitmap(star);bitmap.x = j * star.width;bitmap.y = i * star.height;addChild(bitmap)}}var ref:Bitmap = getChildAt(0) as Bitmap;ref.bitmapData.pixelDissolve(ref.bitmapData, ref.bitmapData.rect, newPoint(0,0),Math.random()*200,Math.random()*200, 0x990000);Aşağıdaki görüntü bir Star örneğini değiştirmenin sonucunu gösterir:
  • 20. 16FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEBelleği saklamaSon güncelleme 30/3/2011Bir örneği değiştirmenin sonucuDahili olarak, piksel değiştirmeleri işlemek için çalışma zamanı otomatik şekilde bellekte bir bitmap atar ve oluşturur.BitmapData sınıfının bir yöntemi çağrıldığında, piksel değiştirilmelerine yol açar, bellekte yeni bir örnek oluşturulurve başka herhangi bir örnek güncellenmez. Aşağıdaki resim bu kavramı gösterir:Bir bitmapi değiştirmenin bellekteki sonucuTek bir yıldız değiştirilirse, bellekte yeni bir kopya oluşturulur. Sonuçta elde edilen animasyon, Flash Player 10.1 veAIR 2.5te bellekten yaklaşık 8 KB kullanır.Bellekteki GörüntülenenLogo ÖrneğiLogo ÖrneğiLogo ÖrneğisetPixel()Bitmap KaynağıBitmap Kaynağı
  • 21. 17FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEBelleği saklamaSon güncelleme 30/3/2011Önceki örnekte, her bitmap ayrı ayrı dönüştürme için kullanılabilir. Yalnızca döşeme efekti oluşturmak içinbeginBitmapFill() yöntemi en uygun yöntemdir:var container:Sprite = new Sprite();var source:BitmapData = new Star(0,0);// Fill the surface with the source BitmapDatacontainer.graphics.beginBitmapFill(source);container.graphics.drawRect(0,0,stage.stageWidth,stage.stageHeight);addChild(container);Bu yaklaşım yalnızca tek bir BitmapData örneğinin oluşturulmasıyla aynı sonucu üretebilir. Yıldızları sürekli olarakdöndürmek için her Yıldız örneğine erişmek yerine her karede döndürülen bir Matrix nesnesi kullanın. Bu Matrixnesnesini beginBitmapFill() yöntemine iletin:var container:Sprite = new Sprite();container.addEventListener(Event.ENTER_FRAME, rotate);var source:BitmapData = new Star(0,0);var matrix:Matrix = new Matrix();addChild(container);var angle:Number = .01;function rotate(e:Event):void{// Rotate the starsmatrix.rotate(angle);// Clear the contentcontainer.graphics.clear();// Fill the surface with the source BitmapDatacontainer.graphics.beginBitmapFill(source,matrix,true,true);container.graphics.drawRect(0,0,stage.stageWidth,stage.stageHeight);}Bu tekniği kullanırken, efekti oluşturmak için herhangi bir ActionScript döngüsüne gerek yoktur. Çalışma zamanı herşeyi dahili olarak gerçekleştirir. Aşağıdaki resim yıldızları dönüştürmenin sonucunu gösterir:
  • 22. 18FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEBelleği saklamaSon güncelleme 30/3/2011Döndürülen yıldızların sonucuBu yaklaşımla, orijinal kaynak BitmapData nesnesinin güncellenmesi otomatik olarak onun sahne alanındakiherhangi başka bir yerdeki kullanımını günceller, bu da etkili bir teknik olabilir. Ancak, bu yaklaşım her yıldızın öncekiörnekteki gibi teker teker ölçeklendirilmesine olanak tanımaz.Not: Aynı görüntünün birden fazla örneğini kullanırken, çizim bir sınıfın bellekteki orijinal bitmap ile ilişkili olupolmadığına bağlıdır. Bitmap ile ilişkili bir sınıf yoksa, görüntüler bitmap dolguları ile Shape nesneleri olarak çizilir.Filtreleri ve dinamik bitmapi kaldırmaPixel Bender üzerinden işlenen filtreler dahil olmak üzere filtre kullanımından kaçının.Piksel Bükme ile mobil aygıtlarda işlenen filtreler de dahil olmak üzere, filtreler gibi etkilerin kullanımını en azaindirmeye çalışın. Bir görüntüleme nesnesine bir filtre uygulandığında, çalışma zamanı bellekte iki bitmap oluşturur.Bu bitmaplerin her biri görüntüleme nesnesinin boyutundadır. Birincisi, görüntüleme nesnesinin rasterleştirilmiş birversiyonu olarak oluşturulur ve sonrasında uygulanan filtre ile ikinci bir bitmap üretmek için kullanılır.
  • 23. 19FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEBelleği saklamaSon güncelleme 30/3/2011Filtre uygulandığında bellekte bulunan iki bitmapBir filtrenin özelliklerinden birini değiştirirken, ortaya çıkacak bitmapin oluşturulması için bitmaplerin ikisi debellekte güncellenir. Bu işlem biraz CPU işleme gerektirir ve iki bitmap önemli bir miktar bellek kullanabilir.Flash Player 10.1 ve AIR 2.5, tüm platformlarda yeni bir filtreleme davranışı sunar. Filtre 30 saniye içindedeğiştirilmezse veya gizli veya ekran dışı ise, filtrelenmemiş bitmap tarafından kullanılan bellek boşaltılır.Bu özellik tüm platformlarda bir filtre tarafından kullanılan belleğin yarısından tasarruf sağlar. Örneğin, birbulanıklaştırma filtresi uygulanan bir metin nesnesi düşünün. Bu durumda metin basit dekorasyon için kullanılır vedeğiştirilmez. 30 saniye sonra, bellekteki filtrelenmemiş bitmap boşaltılır. Metin 30 saniye boyunca gizli veya ekran dışıkalırsa aynı sonuç gerçekleşir. Filtre özelliklerinden biri değiştirilirse, bellekteki filtrelenmemiş bitmap yenidenoluşturulur. Bu özelliğe dinamik bitmap kaldırılması denir. Bu en iyileştirmelerde bile filtrelere dikkat edin; çünküfiltreler değiştirilirken yine de çok büyük miktarda işlemci veya GPU işlemesi gerektirir.Mümkün olduğunda filtreleri taklit etmek için Adobe® Photoshop® gibi bir geliştirme aracı üzerinden oluşturulmuşbitmaplerin kullanılması iyi bir uygulamadır. ActionScript’te çalışma zamanında oluşturulmuş dinamik bitmaplerikullanmaktan kaçının. Harici olarak geliştirilmiş bitmaplerin kullanılması, özellikle filtre özellikleri zaman içindedeğişmediğinde, çalışma zamanının işlemci veya GPU yükünü azaltmasına yardımcı olur. Mümkünse bir bitmapüzerinde ihtiyaç duyduğunuz tüm efektleri geliştirme aracında oluşturun. Bitmap’i çalışma zamanında üzerinde hiçbirişlem yapmadan görüntüleyebilirsiniz, bu işlem çok daha hızlı olabilir.Doğrudan mipmap oluşturmaGerekirse, büyük görüntüleri ölçeklendirirken mipmap oluşturma özelliğini kullanın.Flash Player 10.1 ve AIR 2.5te mevcut olan başka yeni bir özellik mipmap oluşturmayla ilgilidir. Flash Player 9 ve AIR1.0, ölçeği küçültülmüş bitmaplerin kalite ve performansını iyileştiren bir mipmap oluşturma özelliği sunmuştu.Bellekteki GörüntülenenSonuçFiltrelenmemiş bitmap versiyonuFiltrelenmiş bitmap versiyonu
  • 24. 20FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEBelleği saklamaSon güncelleme 30/3/2011Not: Mipmap oluşturma özelliği yalnızca dinamik olarak yüklenmiş görüntüler veya gömülü bitmapler için geçerlidir.Mipmap oluşturma filtrelenen veya önbelleğe alınan görüntüleme nesnelerine uygulanmaz. Mipmap oluşturma yalnızcabitmap çift sayı olan bir genişlik ve yüksekliğe sahipse işlenebilir. Tek sayı olan bir genişlik veya yüksekliklekarşılaşıldığında, mipmap oluşturma durur. Örneğin, 250 x 250 boyutunda bir görüntüye 125 x 125 olacak şekildemipmap oluşturma uygulanabilir ancak daha fazlası uygulanamaz. Bu durumda, boyutların en az bir tanesi tek sayıdır.İkinin üsleri olan boyutlara sahip bitmapler en iyi sonuçları verir, örneğin: 256 x 256, 512 x 512, 1024 x 1024, vb.Örneğin, 1024 x 1024 boyutunda bir görüntünün yüklü olduğunu ve bir geliştiricinin görüntüyü galeride bir minikresim oluşturmak için ölçeklemek istediğini düşünün. Mipmap oluşturma özelliği, bitmapin orta seviye altörneklemeversiyonları kullanılarak ölçeklendirildiğinde görüntüyü düzgün bir şekilde oluşturur. Çalışma zamanının öncekisürümleri bellekte bitmapin orta seviye altörneklenmiş sürümlerini oluşturuyordu. 1024 x 1024 boyutlarında birgörüntü 64 x 64 şeklinde yüklenip görüntülendiğinde, çalışma zamanının eski sürümleri yarı boyutlu bitmaplerin herbirini oluştururdu. Örneğin, bu durumda 512 x 512, 256 x 256, 128 x 128 ve 64 x 64 bitmapler oluşturulurdu.Şimdi, Flash Player 10.1 ve AIR 2.5 istenen hedef boyuta doğrudan orijinal kaynaktan mipmap oluşturmayıdestekliyor. Önceki örnekte, yalnızca 4 MB (1024 x 1024) orijinal bitmap ve 16 KB (64 x 64) mipmapi oluşturulmuşbitmap oluşturuluyordu.Mipmap oluşturma mantığı ayrıca dinamik bitmap kaldırma özelliğiyle de çalışır. Yalnızca 64 x 64 bitmapkullanılıyorsa, 4 MB orijinal bitmap bellekten boşaltılır. Mipmapin yeniden oluşturulması gerekiyorsa, orijinal bitmapyeniden yüklenir. Ayrıca, çeşitli boyutlarda başka mipmapi oluşturulmuş bitmapler gerekiyorsa, bitmapinoluşturulması için bitmaplerin mipmap zinciri kullanılır. Örneğin, bir 1:8 bitmap oluşturulması gerekiyorsa,hangisinin belleğe ilk yüklendiğini belirlemek amacıyla 1:4 ve 1:2 ve 1:1 bitmapler incelenir. Başka versiyonlarbulunmazsa, kaynaktan 1:1 orijinal bitmap yüklenir ve kullanılır.JPEG açıcısı kendi biçiminde mipmap oluşturma işlemini gerçekleştirebilir. Bu doğrudan mipmap oluşturma işlemi,büyük bir bitmap’in sıkıştırılmamış görüntünün tamamı yüklenmeden doğrudan bir mipmap biçimi şeklindeaçılmasına olanak tanır. Mipmapin oluşturulması önemli ölçüde daha hızlıdır; büyük bitmapler tarafından kullanılanbellek ayrılmaz ve sonra boşaltılır. JPEG görüntü kalitesi genel mipmap oluşturma tekniğine yakındır.Not: Mipmap oluşturma işlevini gereğinden fazla kullanmayın. Bu işlev, küçük boyuta ölçeklenmiş bitmaplerinkalitesini arttırsa da bant genişliğini, belleği ve hızı etkiler. Bazı durumlarda bitmap’in harici bir araçta öncedenölçeklendirilmiş biçimini uygulamanıza içe aktarıp kullanmak daha iyi bir seçenektir. Amacınız küçülterekölçeklendirmekse büyük boyutlu bitmaplerle işleme başlamayın.3B efektlerini kullanma3B efektlerini el ile oluşturmayı göz önünde bulundurun.Flash Player 10 ve AIR 1.5, görüntüleme nesnelerine perspektif dönüştürme uygulamanıza olanak veren bir 3B motorusundu. Bu dönüştürmeleri rotationX ve rotationY özelliklerini veya Graphics sınıfının drawTriangles()yöntemini kullanarak uygulayabilirsiniz. Ayrıca z özelliğiyle derinlik uygulayabilirsiniz.. Her perspektifidönüştürülmüş görüntüleme nesnesinin bir bitmap olarak rasterleştirildiğini ve bundan dolayı daha fazla bellekgerektirdiğini aklınızda tutun.Aşağıdaki şekil perspektif dönüştürme kullanılırken rasterleştirme tarafından üretilen kenar yumuşatmayı gösterir:
  • 25. 21FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEBelleği saklamaSon güncelleme 30/3/2011Perspektif dönüştürme sonucu ortaya çıkan kenar yumuşatmaKenar yumuşatma, vektör içeriğinin bitmap olarak dinamik bir şekilde rasterleştirilmesinin sonucudur. Bu kenaryumuşatma, AIR ve Flash Playerın masaüstü sürümünde ve mobil için AIR 2.0.1 ve AIR 2.5te 3B efektlerkullandığınızda gerçekleşir. Ancak mobil aygıtlar için Flash Playera kenar yumuşatma uygulanmaz.3B efektinizi yerel APIye dayanmadan elle oluşturabiliyorsanız, bu da bellek kullanımını azaltabilir. Ancak FlashPlayer 10 ve AIR 1.5te tanıtılan yeni 3B özellikleri doku eşlemeyi drawTriangles() gibi yöntemler sayesinde çokdaha kolay bir hale getirir.Bir geliştirici olarak, oluşturmak istediğiniz 3B efektin yerel API tarafından işlendiğinde mi yoksa elle mi daha iyiperformans sağladığına karar verin. Bellek kullanımının yanı sıra ActionScript çalıştırma ve oluşturma performansınıda dikkate alın.renderMode uygulama özelliğini GPU olarak ayarladığınız AIR 2.0.1 ve AIR 2.5 mobil uygulamalarda GPU, 3Bdönüştürmeleri yapar. Ancak renderModeCPU olursa, 3B dönüştürmeleri GPU değil, CPU gerçekleştirir. Flash Player10.1 uygulamalarında CPU, 3B dönüştürmeleri gerçekleştirir.CPU 3B dönüştürmeler yaptığında, bir görüntüleme nesnesine herhangi bir 3B dönüştürmenin uygulanmasınınbellekte iki bitmap gerektireceğini dikkate alın. Bir bitmap kaynak bitmap için ve ikinci bir bitmap de perspektifidönüştürülmüş sürüm içindir. Bu şekilde 3B dönüştürmeleri filtrelere benzer bir yöntemle çalışır. Sonuç olarak, CPU3B dönüştürmeler yaptığında, 3B özelleri tutumlu şekilde kullanın.Metin nesneleri ve bellekSalt okunur bir metin için Adobe® Flash® Metin Motorunu kullanın; giriş metni için TextField nesneleri kullanın.Flash Player 10 ve AIR 1.5, sistem belleğinden tasarruf sağlayan güçlü bir yeni metin motoru olan Adobe Flash MetinMotorunu (FTE) sunmuştu. Ancak, FTE üzerine flash.text.engine paketinde sağlanan ek bir ActionScript 3.0 katmanıgerektiren düşük düzeyli bir APIdir.
  • 26. 22FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEBelleği saklamaSon güncelleme 30/3/2011Salt okunur metinler için, düşük bellek kullanımı ve daha iyi oluşturma sunan Flash Metin Motoru kullanılması eniyisidir. Giriş metni için, girdi işleme ve kelime sarma gibi genel davranışlar oluşturmak için daha az ActionScriptgerektiğinden, TextField nesnelerini kullanmak daha iyi bir seçimdir.Daha fazla Yardım konusu“Metin nesnelerinin oluşturulması” sayfa 66Olay modeli ile geri aramaların karşılaştırmasıOlay modeli yerine basit geri aramalar kullanmayı düşünün.ActionScript 3.0 olay modeli nesne gönderme kavramına dayanır. Olay modeli nesne yönelimlidir ve kodun yenidenkullanımı için en iyileştirilmiştir. dispatchEvent() yöntemi dinleyici listesi üzerinden döngüde ilerler ve kayıtlı hernesnede olay işleyicisini çağırır. Ancak olay modelinin dezavantajlarından biri uygulamanızı kullandığınız süreboyunca çok sayıda nesne oluşturacak olmanızdır.Zaman çizelgesinden animasyon dizisinin sonunu gösteren bir olay göndermeniz gerektiğini düşünün. Bildirimintamamlanması için, aşağıdaki örnekte gösterildiği gibi zaman çizelgesindeki belirli bir kareden olay gönderebilirsiniz:dispatchEvent( new Event ( Event.COMPLETE ) );Document sınıfı bu olayı aşağıdaki kod satırıyla dinleyebilir:addEventListener( Event.COMPLETE, onAnimationComplete );Bu yaklaşım doğru olsa da, yerel olay modelinin kullanılması daha yavaş olabilir ve klasik bir geri çağırma işlevikullanmak işlemine göre daha fazla bellek kullanabilir. Olay nesneleri bellekte oluşturulmalı ve ayrılmalıdır; bu daperformansta düşüşe neden olur. Örneğin Event.ENTER_FRAME olayını dinlerken olay işleyicisi için her karede yenibir event nesnesi oluşturulur. Özellikle görüntüleme nesneleri için, görüntüleme listesi karmaşıksa zor olabilen olayıdıştan içe ve içten dışa tetikleme aşamaları nedeniyle performans yavaş olabilir.
  • 27. 23Son güncelleme 30/3/2011Bölüm 3: CPU kullanımını en aza indirmeEn iyileştirme için başka önemli bir odak alanı CPU kullanımıdır. İşlemci işlemesinin en iyileştirilmesi, performansıve bunun bir sonucu olarak da mobil aygıtların pil ömrünü arttırır.CPU kullanımı için Flash Player 10.1 geliştirmeleriFlash Player 10.1 CPU işlemeden tasarruf etmeyi sağlayan iki yeni özellik sunar. Özellikler arasında, ekran dışınagittiğinde SWF içeriğinin duraklatılması ve devam ettirilmesi ve bir sayfadaki Flash Player örnekleri sayısınınsınırlandırılması yer alır.Duraklatma ve devam etmeNot: Duraklatma ve devam etme özellikleri Adobe® AIR® uygulamaları için geçerli değildir.İşlemci ve pil kullanımını en iyileştirmek için Flash Player 10.1, mobil platformlarda (ve dizüstü bilgisayarlarda) devredışı örneklerle ilgili yeni bir özellik sunar. Bu özellik ekrandaki içerik açılıp kapatıldığında SWF dosyasını duraklatıpdevam ettirerek işlemci kullanımını kısıtlamanıza izin verir. Bu özellikle, Flash Player içeriğin oynatılması devamettirildiğinde yeniden oluşturulabilecek herhangi bir nesneyi kaldırarak mümkün olduğu kadar belleği serbest bırakır.İçeriğin tümü ekran dışı olduğunda içerik ekran dışı sayılır.İki senaryo SWF içeriğinin ekran dışı olmasına sebep olur.• Kullanıcı sayfayı kaydırır ve SWF içeriğinin ekran dışına taşınmasına sebep olur.Bu durumda, herhangi bir ses veya video yürütülüyorsa, içerik yürütülmeye devam eder ancak görüntü oluşturmadurur. Herhangi bir ses veya video yürütülmüyorsa, oynatmanın veya ActionScript yürütülmesininduraklatılmadığından emin olmak için hasPriority HTML parametresini true olarak ayarlayın. Ancak, içerikekranın dışındayken veya gizliyken hasPriority HTML parametresinin değerine bakılmaksızın SWF içeriğioluşturma işleminin duraklatıldığını unutmayın.• Tarayıcıda bir sekme açılır, bu da SWF içeriğinin arka plana taşınmasına sebep olur.Bu durumda, hasPriority HTML etiketinin değerine bakılmaksızın, SWF içeriği 2 kare/sn hızına düşürülür. Sesve video yürütülmesi durdurulur ve SWF içeriği görünür hale gelmedikçe içerik oluşturma işlemine devamedilmez.Örnek yönetimiNot: Örnek yönetimi özelliği, Adobe® AIR® uygulamaları için geçerli değildir.Ekranın dışındaki SWF dosyalarının yüklenmesini ertelemek için hasPriority HTML parametresini kullanın.Flash Player 10.1 hasPriority adlı yeni bir HTML parametresi sunar:<param name="hasPriority" value="true" />
  • 28. 24FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMECPU kullanımını en aza indirmeSon güncelleme 30/3/2011Bu özellik bir sayfada başlatılmış olan Flash Player örneklerinin sayısını kısıtlar. Örneklerin sayısını kısıtlamak işlemcive pil kaynaklarını korumaya yardım eder. Amaç bir sayfadaki diğer içeriğe içerik önceliği vererek SWF içeriğine belirlibir öncelik atamaktır. Basit bir örnek düşünün: kullanıcı bir web sitesini taramaktadır ve dizin sayfası üç farklı SWFdosyası barındırır. Bunlardan biri görünürdür, başka biri ekran üzerinde kısmen görünürdür ve sonuncusu ekrandışıdır ve kaydırmayı gerektirir. İlk iki animasyon normal şekilde başlatılır ancak sonuncusu görünür olana kadarertelenir. hasPriority parametresi mevcut olmadığında veya false değerine ayarlandığında bu senaryo varsayılandavranıştır. Bir SWF dosyasının ekran dışı olsa da başlatılmasını sağlamak için, hasPriority parametresini truedeğerine ayarlayın. Ancak, hasPriority parametresinin değerinden bağımsız olarak, kullanıcıya görünmeyen birSWF dosyasının oluşturulması her zaman duraklatılır.Not: Kullanılabilir işlemci kaynakları azalırsa, Flash Player örnekleri hasPriority parametresi true değerine ayarlıolsa da artık otomatik başlatılmaz. Sayfa yüklendikten sonra JavaScript üzerinden yeni örnekler oluşturulursa, oörnekler hasPriority bayrağını yoksayar. Webmaster, hasPriority bayrağını dahil etmeyi başaramazsa, herhangibir 1x1 piksel veya 0x0 piksel içerik SWF dosyalarının ertelenmesini önleyerek başlatılır. Ancak SWF dosyaları halentıklatıldığında başlatılabilir. Bu davranışa “oynatmak için tıklat” adı verilir.Aşağıdaki şema hasPriority parametresini değişik değerlere ayarlamanın etkilerini gösterir:hasPriority parametresi için farklı değerlerin etkilerikullanıcının aygıtında görünür olan alanSWFhasPriority false olarakayarlanmış veyamevcut değilSWF filmi başlatıldıSWF filmi başlatılmadıSWFhasPriority false olarakayarlanmış veyamevcut değilSWFhasPriority falseolarak ayarlanmışveya mevcut değil
  • 29. 25FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMECPU kullanımını en aza indirmeSon güncelleme 30/3/2011hasPriority parametresi için farklı değerlerin etkileriUyku moduFlash Player 10.1 ve AIR 2.5, mobil aygıtlarda CPU işleme ve bunun sonucu olarak da pil ömrü tasarrufuna yardımcıolan yeni bir özellik sunar. Bu özellik bir çok mobil aygıtta bulunan arka ışık özelliğini kapsar. Örneğin, mobiluygulama kullanan bir kullanıcı rahatsız edilirse ve aygıtı kullanmayı bırakırsa, çalışma zamanı arka ışığın ne zamanuyku moduna girdiğini algılar. Daha sonra kare hızını saniyede 4 kareye (fps) düşürür ve oluşturmayı duraklatır. AIRuygulamaları için ayrıca uygulama arka plana geçtiğinde uyku modu başlar.ActionScript kodu Stage.frameRate özelliğini 4 fpsye ayarlamaya benzer olarak uyku modunda çalışmaya devameder. Ancak oluşturma adımı atlanır, böylece kullanıcı oynatıcının 4 fpsde çalıştığını göremez. Sıfır yerine 4 fpslik birkare hızı seçildi, çünkü bu tüm bağlantıların açık kalmasına olanak verir (NetStream, Socket ve NetConnection). Sıfırageçmek tüm açık bağlantıları keser. Çoğu aygıt üreticisi yenileme hızı olarak 250 mslik (4 fps) kare hızınıkullandığından bu yenileme hızı seçildi. Bu değerin kullanılması, çalışma zamanının kare hızını aygıtın kendisiyle aynıhızda tutar.Not: Çalışma zamanı uyku modundayken Stage.frameRate özelliği 4 kare/saniye yerine orijinal SWF dosyasının karehızını döndürür.Arka aşık açık moda geri girdiğinde, oluşturmaya devam edilir. Kare hızı orijinal değerine döner. Bir kullanıcınınmüzik oynattığı bir medya oynatıcı uygulaması düşünün. Ekran uyku moduna girerse, çalışma zamanı oynatılmaktaolan içerik türünü temel alarak yanıt verir. Karşılık gelen çalışma zamanı davranışına sahip durumların listesi:• Arka ışık uyku moduna girer ve A/V olmayan içerik oynatılır: Oluşturma duraklatılır ve kare hızı 4 fpsye ayarlanır.• Arka ışık uyku moduna girer ve A/V içeriği oynatılır: çalışma zamanı kullanıcı deneyimini sürdürerek arka ışığı herzaman açık olmaya zorlar.kullanıcının aygıtında görünür olan alanSWFhasPriority false olarakayarlanmış veyamevcut değilSWFhasPriority trueolarak ayarlanmışSWF filmi başlatıldıSWF filmi başlatılmadıSWFhasPriority falseolarak ayarlanmışveya mevcut değil
  • 30. 26FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMECPU kullanımını en aza indirmeSon güncelleme 30/3/2011• Arka ışık uyku modundan açık moda geçer: çalışma zamanı kare hızını orijinal SWF dosyası kare hızı ayarına getirirve oluşturmayı devam ettirir.• A/V içeriği oynatılırken Flash Player duraklatılır: Flash Player A/V artık oynatılmadığından arka ışık durumunuvarsayılan sistem davranışına sıfırlar.• A/V içeriği oynatılırken mobil aygıt bir telefon çağrısı alır: Oluşturma duraklatılır ve kare hızı 4 fpsye ayarlanır.• Mobil bir aygıtta arka ışık uyku modu devre dışı bırakılır: çalışma zamanı normal davranır.Arka ışık uyku moduna girdiğinde, oluşturma duraklar ve kare hızı yavaşlar. Bu özellik CPU işlemeden tasarruf ederancak bir oyun uygulamasındaki gibi gerçek bir duraklatma oluşturması beklenemez.Not: Çalışma zamanı uyku moduna girip çıkarken hiçbir ActionScript olayı gönderilmez.Nesneleri dondurma ve çözmeREMOVED_FROM_STAGE ve ADDED_TO_STAGE olaylarını kullanarak nesneleri uygun biçimde dondurun ve çözün.Kodunuzu en iyileştirmek için, nesnelerinizi her zaman dondurun ve çözün. Dondurma ve çözme bütün nesneler içinönemli olsa da, özellikle görüntüleme nesneleri için önemlidir. Görüntüleme nesneleri artık görüntüleme listesindeolmasa da ve çöp toplamayı bekliyor olsa da, yoğun CPU kullanımı gerektirecek kod kullanıyor olabilirler. Örneğin,hala Event.ENTER_FRAME öğesini kullanıyor olabilirler. Sonuç olarak nesneleri Event.REMOVED_FROM_STAGE veEvent.ADDED_TO_STAGE olaylarıyla doğru uygun biçimde dondurmak ve çözmek çok önemlidir. Aşağıdaki örnekteklavye ile etkileşen sahne alanında oynatılan bir film klibi gösterilmektedir:// Listen to keyboard eventsstage.addEventListener(KeyboardEvent.KEY_DOWN, keyIsDown);stage.addEventListener(KeyboardEvent.KEY_UP, keyIsUp);// Create object to store key statesvar keys:Dictionary = new Dictionary(true);function keyIsDown(e:KeyboardEvent):void{// Remember that the key was pressedkeys[e.keyCode] = true;if (e.keyCode==Keyboard.LEFT || e.keyCode==Keyboard.RIGHT){runningBoy.play();}}function keyIsUp(e:KeyboardEvent):void{// Remember that the key was releasedkeys[e.keyCode] = false;for each (var value:Boolean in keys)if ( value ) return;runningBoy.stop();
  • 31. 27FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMECPU kullanımını en aza indirmeSon güncelleme 30/3/2011}runningBoy.addEventListener(Event.ENTER_FRAME, handleMovement);runningBoy.stop();var currentState:Number = runningBoy.scaleX;var speed:Number = 15;function handleMovement(e:Event):void{if (keys[Keyboard.RIGHT]){e.currentTarget.x += speed;e.currentTarget.scaleX = currentState;} else if (keys[Keyboard.LEFT]){e.currentTarget.x -= speed;e.currentTarget.scaleX = -currentState;}}Klavye ile etkileşen film klibiKaldır düğmesi tıklatıldığında, film klibi görüntüleme listesinden kaldırılır:
  • 32. 28FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMECPU kullanımını en aza indirmeSon güncelleme 30/3/2011// Show or remove running boyshowBtn.addEventListener (MouseEvent.CLICK,showIt);removeBtn.addEventListener (MouseEvent.CLICK,removeIt);function showIt (e:MouseEvent):void{addChild (runningBoy);}function removeIt(e:MouseEvent):void{if (contains(runningBoy)) removeChild(runningBoy);}Görüntüleme listesinden kaldırıldığında bile, film klibi Event.ENTER_FRAME olayını göndermeye devam eder. Filmklibi çalışmaya devam eder ancak oluşturulmaz. Bu durumu doğru şekilde ele almak için yoğun CPU kodununçalıştırılmasını önlemek için doğru olayları ve olay kaldırma dinleyicilerini dinleyin:// Listen to Event.ADDED_TO_STAGE and Event.REMOVED_FROM_STAGErunningBoy.addEventListener(Event.ADDED_TO_STAGE,activate);runningBoy.addEventListener(Event.REMOVED_FROM_STAGE,deactivate);function activate(e:Event):void{// Restart everythinge.currentTarget.addEventListener(Event.ENTER_FRAME,handleMovement);}function deactivate(e:Event):void{// Freeze the running boy - consumes fewer CPU resources when not showne.currentTarget.removeEventListener(Event.ENTER_FRAME,handleMovement);e.currentTarget.stop();}Göster düğmesine basıldığında film klibi tekrar başlatılır, Event.ENTER_FRAME olaylarını yeniden diner ve klavyedoğru biçimde film klibini kontrol eder.Not: Bir görüntüleme nesnesi görüntüleme listesinden kaldırılırsa, başvurusunun null değerine ayarlanması nesnenindondurulmasını sağlamaz. Çöp toplayıcı çalışmıyorsa, nesne artık görüntülenmese de bellek ve işlemci işlemesinikullanmaya devam eder. Nesnenin mümkün olduğunca az işlemci işlemesini kullanmasını sağlamak için, onugörüntüleme listesinden kaldırırken tamamen dondurduğunuzdan emin olun.Flash Player 10 ve AIR 1.5ten başlayarak aşağıdaki davranış da gerçekleşir. Oynatma kafası boş bir kareyle karşılaşırsa,herhangi bir dondurma davranışı uygulamamış olsanız da görüntüleme nesnesi otomatik olarak dondurulur.Dondurma kavramı ayrıca Loader sınıfıyla uzaktan içerik yüklenirken de önemlidir. Loader sınıfı Flash Player 9 veAIR 1.0 ile kullanılırken, içeriğin LoaderInfo nesnesi tarafından gönderilen Event.UNLOAD olayının dinlenmesiyoluyla el ile dondurulması gerekliydi. Her nesnenin el ile dondurulması gerekiyordu, bu da önem taşıyan bir görevdi.Flash Player 10 ve AIR 1.5, Loader sınıfında unloadAndStop() adlı önemli ve yeni bir yöntem sundu. Bu yöntem birSWF dosyasını kaldırmanıza, yüklü olan SWF dosyasındaki her nesneyi otomatik olarak dondurmanıza ve çöptoplayıcıyı çalışmaya zorlamanıza olanak tanır.Aşağıdaki kodda, daha fazla işleme ve el ile dondurma gerektiren unload() yöntemi kullanılarak SWF dosyasıyüklenmekte ve sonra boşaltılmaktadır.
  • 33. 29FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMECPU kullanımını en aza indirmeSon güncelleme 30/3/2011var loader:Loader = new Loader();loader.load ( new URLRequest ( "content.swf" ) );addChild ( loader );stage.addEventListener ( MouseEvent.CLICK, unloadSWF );function unloadSWF ( e:MouseEvent ):void{// Unload the SWF file with no automatic object deactivation// All deactivation must be processed manuallyloader.unload();}Dondurmayı yerel olarak işleyip çöp toplama işlemini çalışmaya zorlayan unloadAndStop() yöntemini kullanmak iyibir uygulamadır.var loader:Loader = new Loader();loader.load ( new URLRequest ( "content.swf" ) );addChild ( loader );stage.addEventListener ( MouseEvent.CLICK, unloadSWF );function unloadSWF ( e:MouseEvent ):void{// Unload the SWF file with automatic object deactivation// All deactivation is handled automaticallyloader.unloadAndStop();}unloadAndStop() yöntemi çağrıldığında aşağıdaki eylemler gerçekleşir:• Sesler durdurulur.• SWF dosyasının ana zaman çizelgesine kayıtlı olan dinleyiciler kaldırılır.• Zamanlayıcı nesneler durdurulur.• Donanım peripheral cihazlar (örneğin kamera ve mikrofon) bırakılır.• Film kliplerinin her biri durdurulur.• Event.ENTER_FRAME, Event.FRAME_CONSTRUCTED, Event.EXIT_FRAME, Event.ACTIVATE veEvent.DEACTIVATE öğelerinin gönderilmesi durdurulur.Olayları etkinleştirme ve devre dışı bırakmaArka plan etkinsizliğini algılamak ve uygulamanızı uygun şekilde en iyileştirmek için Event.ACTIVATE veEvent.DEACTIVATE olaylarını kullanın.
  • 34. 30FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMECPU kullanımını en aza indirmeSon güncelleme 30/3/2011İki olay (Event.ACTIVATE ve Event.DEACTIVATE), mümkün olan en az işlemci döngüsünü kullanması içinuygulamanıza hassas ayar yapmanıza yardımcı olabilir. Bu olaylar, çalışma zamanının ne zaman odak kazandığını veyakaybettiğini algılamanıza olanak sağlar. Sonuç olarak, bağlam değişikliklerine yanıt vermek için kod en iyileştirilebilir.Aşağıdaki kod her iki olayı dinler ve uygulama odağını kaybettiğinde kare hızını dinamik olarak sıfıra değiştirir.Örneğin, kullanıcı başka bir sekmeye geçtiğinde veya uygulamayı arka plana koyduğunda odak kaybedebilir:var originalFrameRate:uint = stage.frameRate;var standbyFrameRate:uint = 0;stage.addEventListener ( Event.ACTIVATE, onActivate );stage.addEventListener ( Event.ACTIVATE, onDeactivate );function onActivate ( e:Event ):void{// restore original frame ratestage.frameRate = originalFrameRate;}function onDeactivate ( e:Event ):void{// set frame rate to 0stage.frameRate = standbyFrameRate;}Uygulama yeniden odak kazandığında, kare hızı orijinal değerine sıfırlanır. Kare hızını dinamik olarak değiştirmekyerine, nesneleri dondurma ve çözme gibi diğer en iyileştirmeleri yapmayı da düşünebilirsiniz.Etkinleştirme ve devre dışı bırakma olayları, bazen mobil aygıtlarda ve Netbooklarda bulunan "Duraklat ve DevamEttir" özelliğine benzer bir mekanizma uygulamanıza olanak sağlar.Daha fazla Yardım konusu“Uygulama kare hızı” sayfa 51“Nesneleri dondurma ve çözme” sayfa 26Fare etkileşimleriFare etkileşimlerini mümkün olduğunca devre dışı bırakmayı göz önünde bulundurun.MovieClip veya Sprite nesnesi gibi etkileşimli bir nesne kullanırken, fare etkileşimlerini algılamak ve işlemek içinçalışma zamanı, yerel kod çalıştırır. Fare etkileşiminin algılanması, özellikle çok sayıda üst üste gelen etkileşimli nesneekranda gösterildiğinde yoğun işlemci kullanımı gerektirebilir. Bu işlemeden kaçınmak için kolay bir yöntem de, fareetkileşimi gerektirmeyen nesnelerdeki fare etkileşimlerini devre dışı bırakmaktır. Aşağıdaki kod mouseEnabled vemouseChildren özelliklerinin kullanımını gösterir:
  • 35. 31FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMECPU kullanımını en aza indirmeSon güncelleme 30/3/2011// Disable any mouse interaction with this InteractiveObjectmyInteractiveObject.mouseEnabled = false;const MAX_NUM:int = 10;// Create a container for the InteractiveObjectsvar container:Sprite = new Sprite();for ( var i:int = 0; i< MAX_NUM; i++ ){// Add InteractiveObject to the containercontainer.addChild( new Sprite() );}// Disable any mouse interaction on all the childrencontainer.mouseChildren = false;Mümkün olduğunca fare etkileşimini devre dışı bırakmayı göz önünde bulundurun. Bu, uygulamanızın daha azişlemci işlemesi kullanmasını sağlar ve bunun bir sonucu olarak da mobil aygıtlarda pil kullanımının azaltılmasınayardımcı olur.Zamanlayıcılarla ENTER_FRAME olaylarınınkarşılaştırılmasıİçeriğin hareketli olup olmamasına bağlı olarak zamanlayıcıları veya ENTER_FRAME olaylarını seçin.Hareketli olmayan ve uzun süre boyunca çalıştırılan içerik için Event.ENTER_FRAME olayları yerine zamanlayıcılartercih edilir.ActionScript 3.0’da belirli aralıklarla işlev çağırmanın iki yolu bulunur. İlk yaklaşım, etkileşimli nesneler(InteractiveObject) tarafından gönderilen Event.ENTER_FRAME olayını kullanma doğrultusundadır. İkinci yaklaşımise bir zamanlayıcı kullanmaktır. ActionScript geliştiricileri sık sık ENTER_FRAME olayı yaklaşımını kullanır.ENTER_FRAME olayı her karede gönderilir. Bunun bir sonucu olarak işlevin çağrıldığı aralık geçerli kare hızı ile ilgilidir.Kare hızına Stage.frameRate özelliği üzerinden erişilebilir. Ancak bazı durumlarda zamanlayıcının kullanılmasıENTER_FRAME olayın kullanılmasından daha iyi olabilir. Örneğin, animasyon kullanmıyorsanız ancak belirli aralıklarlakodunuzun çağrılmasını istiyorsanız zamanlayıcı kullanmak daha iyi bir seçenektir.Bir zamanlayıcı ENTER_FRAME olayıyla aynı davranışı gösterir, ancak bir olay kare hızından bağımsız olarakgönderilebilir. Bu davranış etkili bir en iyileştirme sunabilir. Örnek olarak bir video oynatıcısı uygulamasını düşünün.Bu durumda, yalnızca uygulama kontrolleri hareket ettiğinden yüksek kare hızına ihtiyacınız olmaz.Not: Video zaman çizelgesine gömülü olmadığından kare hızı videoyu etkilemez. Bunun yerine video aşamalı indirmeveya akış üzerinden dinamik olarak yüklenir.Bu örnekte kare hızı 10 kare/saniyelik düşük bir değere ayarlıdır. Zamanlayıcı, kontrolleri saniyede bir güncellemehızında günceller. Yüksek güncelleme hızı TimerEvent nesnesindeki updateAfterEvent() yöntemi ile sağlanır. Buyöntem ekranı gerektiğinde zamanlayıcı her olay gönderdiğinde güncellenmeye zorlar. Aşağıdaki kod bu fikrigöstermektedir:
  • 36. 32FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMECPU kullanımını en aza indirmeSon güncelleme 30/3/2011// Use a low frame rate for the applicationstage.frameRate = 10;// Choose one update per secondvar updateInterval:int = 1000;var myTimer:Timer = new Timer(updateInterval,0);myTimer.start();myTimer.addEventListener( TimerEvent.TIMER, updateControls );function updateControls( e:TimerEvent ):void{// Update controls here// Force the controls to be updated on screene.updateAfterEvent();}updateAfterEvent() yönteminin çağrılması kare hızını değiştirmez. Yalnızca çalışma zamanını, ekrandaki değişeniçeriği güncellemeye zorlar. Zaman çizelgesi halen 10 kare/saniyede çalışmaktadır. Düşük performanslı aygıtlarda veyaolay işleyici işlemlerinin ağır işleme gerektiren kodlar barındırması durumunda zamanlayıcıların ve ENTER_FRAMEolaylarının tam olarak doğru olmadığını unutmayın. SWF dosyasının kare hızında olduğu gibi, zamanlayıcınıngüncelleme kare hızı da bazı durumlarda değişiklik gösterebilir.Uygulamanızdaki Timer nesnelerinin ve kayıtlı enterFrame işleyicilerinin sayısını en aza indirin.Çalışma zamanı, görüntüleme listesindeki her görüntüleme nesnesine her karede bir enterFrame olayı gönderir.Birden fazla görüntüleme nesnesi olan enterFrame olayına ilişkin dinleyicileri kaydedebilseniz de, bu işlemingerçekleştirilmesi her kare için daha fazla kodun çalıştırması anlamına gelir. Bunun yerine, karelerin her biriniçalıştırmak için kullanılan kodun tamamını çalıştıran tek bir merkezi enterFrame işleyicisi kullanmayı göz önündebulundurun. Bu kodun merkezileştirilmesiyle, sıkça çalıştırılan kodun tamamının yönetilmesi daha kolaydır.Buna benzer olarak, Timer nesneleri kullanmanız durumunda, birden çok Timer nesnesinden olay oluşturma vegönderme konusunda ek bir yük ortaya çıkar. Farklı aralıklarda farklı işlemler tetiklemeniz gerekiyorsa, aşağıdaönerilen alternatifleri bulabilirsiniz:• Ne kadar sıklıkta gerçekleştiklerine dayanarak en az sayıda Timer nesnesi ve grup işlemi kullanın..Örneğin, sıkça gerçekleştirilen işlemler için, 100 milisaniyede bir tetiklenecek şekilde ayarlı tek bir Timer öğesikullanın. Daha az sıklıkta gerçekleşen veya arka plan işlemleri için her 2000 milisaniyede bir tetiklenen başka birTimer öğesi kullanın.• Tek bir Timer nesnesi kullanın ve işlemlerin Timer nesnesinin birden fazla delay özelliği aralığında tetiklenmesinisağlayın.Örneğin, 100 milisaniyede bir gerçekleşmesi gereken işlemleriniz ve 200 milisaniyede gerçekleşmesini istediğinizbaşka işlemler olduğunu varsayın. Bu durumda, 100 milisaniyelik bir delay değeri olan tek bir Timer nesnesikullanın. timer olay işleyicisine, diğer zamanlarda yalnızca 200 milisaniyede bir meydana gelecek işlemleriçalıştıran bir koşul ifadesi ekleyin. Aşağıdaki örnek bu tekniği göstermektedir:
  • 37. 33FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMECPU kullanımını en aza indirmeSon güncelleme 30/3/2011var timer:Timer = new Timer(100);timer.addEventListener(TimerEvent.Timer, timerHandler);timer.start();var offCycle:Boolean = true;function timerHandler(event:TimerEvent):void{// Do things that happen every 100 msif (!offCycle){// Do things that happen every 200 ms}offCycle = !offCycle;}Timer nesnelerini kullanımda değilken durdurma.Bir Timer nesnesinin timer olay işleyicisi işlemleri yalnızca belirli koşullarda gerçekleştiriyorsa, koşulların hiçbiri trueolmadığında Timer öğesinin stop() yöntemini çağırın.enterFrame olayında veya Timer işleyicilerinde, ekranda yeniden çizim yapılmasına neden olan görüntülemenesnelerinin görünümünde yapılan değişiklik sayısını en aza indirin.Oluşturma aşaması, o kare süresince değişen sahne alanı bölümünü Her karede yeniden çizer. Yeniden çizme bölgesibüyükse veya küçük olmasına rağmen yüksek miktarda veya karmaşık görüntüleme nesneleri içeriyorsa, çalışmazamanının oluşturma için daha fazla süreye ihtiyacı vardır. İstenen yeniden çizme miktarını test etmek için, FlashPlayer’ın hata ayıklayıcı sürümü veya AIR’deki “yeniden çizilen bölgeleri göster” özelliğini kullanın.Tekrarlanan eylemler için performansı iyileştirme hakkında daha fazla bilgi için, aşağıdaki makaleyi inceleyin:• Writing well-behaved, efficient, AIR applications (Başarılı davranış gösteren, etkili AIR uygulamaları yazma)(Arno Gourdol tarafından yazılan makale ve örnek uygulama)Daha fazla Yardım konusu“Davranışları yalıtma” sayfa 63Hareket arası oluşturma sendromuİşlemci gücünden tasarruf etmek için, hareket arası oluşturma işlemini kısıtlayın. Bu durum, işlemci işlemesinden,bellekten ve pil ömründen de tasarruf sağlar.Masaüstünde Flash içeriği üreten tasarımcılar ve geliştiriciler, uygulamalarında çok sayıda hareket arası kullanmaeğilimindedir. Düşük performanslı mobil aygıtlar için içerik üretirken hareket aralarının kullanımını en aza indirmeyeçalışın. Bunların kullanımının kısıtlanması içeriğin düşük katlı aygıtlarda daha hızlı çalışmasına yardımcı olur.
  • 38. 34Son güncelleme 30/3/2011Bölüm 4: ActionScript 3.0 performansıVector sınıfının Array sınıfıyla karşılaştırılmasıMümkünse Array sınıfı yerine Vector sınıfını kullanın.Vector sınıfı, Array sınıfından daha hızlı okuma ve yazma erişimine olanak verir.Basit bir kıyaslama Vector sınıfının Array sınıfına kıyasla sağladığı faydaları gösterir. Aşağıdaki kod Array sınıfı içinbir kıyaslamayı gösterir:var coordinates:Array = new Array();var started:Number = getTimer();for (var i:int = 0; i< 300000; i++){coordinates[i] = Math.random()*1024;}trace(getTimer() - started);// output: 107Aşağıdaki kod Vector sınıfı için bir kıyaslamayı gösterir:var coordinates:Vector.<Number> = new Vector.<Number>();var started:Number = getTimer();for (var i:int = 0; i< 300000; i++){coordinates[i] = Math.random()*1024;}trace(getTimer() - started);// output: 72Örnek, vektöre belirli bir uzunluk atayarak ve uzunluğunu sabit olarak ayarlayarak daha etkin hale getirilebilir:// Specify a fixed length and initialize its lengthvar coordinates:Vector.<Number> = new Vector.<Number>(300000, true);var started:Number = getTimer();for (var i:int = 0; i< 300000; i++){coordinates[i] = Math.random()*1024;}trace(getTimer() - started);// output: 48
  • 39. 35FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEActionScript 3.0 performansıSon güncelleme 30/3/2011Vektörün boyutu önceden belirlenmezse, vektör alanı azaldıkça boyut artar. Vektör boyutu her arttığında yeni birbellek bloğu ayrılır. Geçerli vektör içeriği yeni bellek bloğuna kopyalanır. Bu fazladan bellek ayırma ve veri kopyalamaişlemi performansa zarar verir. Yukarıdaki kod vektörün ilk boyutunu belirleyerek performans için en iyi halegetirilmiştir. Ancak kod korunabilirlik açısından en iyi hale getirilmemiştir. Korunabilirliği arttırmak için yenidenkullanılmış değeri bir sabitte depolayın:// Store the reused value to maintain code easilyconst MAX_NUM:int = 300000;var coordinates:Vector.<Number> = new Vector.<Number>(MAX_NUM, true);var started:Number = getTimer();for (var i:int = 0; i< MAX_NUM; i++){coordinates[i] = Math.random()*1024;}trace(getTimer() - started);// output: 47Mümkün oldukça, daha hızlı çalıştıkları için Vector nesnesi APIlerini kullanmaya çalışın.Çizim APIsiDaha hızlı kod çalıştırma için çizim APIsini kullanın.Flash Player 10 ve AIR 1.5, daha iyi kod çalıştırma performansı edinmenize olanak vermek için yeni bir çizim APIsisağladı. Bu yeni API oluşturma performansında bir iyileşme sağlamaz ancak yazmak zorunda olduğunuz kod satırısayısını önemli ölçüde düşürebilir. Daha düşük sayıda kod satırı daha iyi ActionScript çalıştırma performansısağlayabilir.Yeni çizim APIsi aşağıdaki yöntemleri içerir:• drawPath()• drawGraphicsData()• drawTriangles()Not: Bu açıklama 3B ile ilgili olan drawTriangles() yöntemine odaklanmaz. Ancak, bu yöntem yerel doku eşlemeyiişlediği için ActionScript performansını iyileştirebilir.Aşağıdaki kod çizilmekte olan her çizgi için uygun olan yöntemi açıkça çağırır:var container:Shape = new Shape();container.graphics.beginFill(0x442299);var coords:Vector.<Number> = Vector.<Number>([132, 20, 46, 254, 244, 100, 20, 98, 218, 254]);container.graphics.moveTo ( coords[0], coords[1] );container.graphics.lineTo ( coords[2], coords[3] );container.graphics.lineTo ( coords[4], coords[5] );container.graphics.lineTo ( coords[6], coords[7] );container.graphics.lineTo ( coords[8], coords[9] );addChild( container );
  • 40. 36FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEActionScript 3.0 performansıSon güncelleme 30/3/2011Aşağıdaki kod daha az kod satırı çalıştırdığından dolayı önceki örnekten daha hızlı çalışır. Daha karmaşık bir yol,drawPath() yönteminin kullanımından sağlanacak daha iyi performans demektir:var container:Shape = new Shape();container.graphics.beginFill(0x442299);var commands:Vector.<int> = Vector.<int>([1,2,2,2,2]);var coords:Vector.<Number> = Vector.<Number>([132, 20, 46, 254, 244, 100, 20, 98, 218, 254]);container.graphics.drawPath(commands, coords);addChild( container );drawGraphicsData() yöntemi benzer performans iyileşmeleri sağlar.Olayı dıştan içe ve içten dışa tetiklemeOlay işleyicilerini en küçük hale getirmek için olayı dıştan içe ve içten dışa tetikleme işlevini kullanın.ActionScript 3.0’daki olay modeli, olayı dıştan içe ve içten dışa tetikleme kavramlarına giriş niteliğindedir. Bir olayıniçten dışa tetiklenmesinden faydalanmak ActionScript kod çalışma zamanını en iyileştirme konusunda size yardımcıolabilir. Performansı arttırmak için birden çok nesne yerine tek bir nesneye olay işleyicisi kaydedebilirsiniz.Örnek olarak, kullanıcının elmaları yok etmek için üzerlerini en hızlı şekilde tıklatmak zorunda olduğu bir oyunyarattığınızı düşünün. Oyun tıklatılan her elmayı ekrandan çıkarır ve kullanıcının puanını yükseltir. Her bir elmatarafından gönderilen MouseEvent.CLICK olayını dinlemek için aşağıdaki kodu yazmak isteyebilirsiniz:const MAX_NUM:int = 10;var sceneWidth:int = stage.stageWidth;var sceneHeight:int = stage.stageHeight;var currentApple:InteractiveObject;var currentAppleClicked:InteractiveObject;for ( var i:int = 0; i< MAX_NUM; i++ ){currentApple = new Apple();currentApple.x = Math.random()*sceneWidth;currentApple.y = Math.random()*sceneHeight;addChild ( currentApple );// Listen to the MouseEvent.CLICK eventcurrentApple.addEventListener ( MouseEvent.CLICK, onAppleClick );}function onAppleClick ( e:MouseEvent ):void{currentAppleClicked = e.currentTarget as InteractiveObject;currentAppleClicked.removeEventListener(MouseEvent.CLICK, onAppleClick );removeChild ( currentAppleClicked );}
  • 41. 37FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEActionScript 3.0 performansıSon güncelleme 30/3/2011Kod, her bir Apple örneğinde addEventListener() yöntemini çağırır. Ayrıca bir elma tıklatıldığındaremoveEventListener yöntemini kullanarak her bir dinleyiciyi çıkarır. Ancak ActionScript 3.0’daki olay modeli bazıolaylar için üst InteractiveObject öğesinden dinlenebilecek bir olayı dıştan içe ve içten dışa tetikleme aşaması sağlar.Sonuç olarak yukarıdaki kodu en iyileştirmek ve addEventListener() ve removeEventListener() yöntemlerineyapılan çağrı sayısını azaltmak mümkündür. Aşağıdaki kod üst nesneden olayları dinlemek için olayı dıştan içetetikleme aşamasını kullanır:const MAX_NUM:int = 10;var sceneWidth:int = stage.stageWidth;var sceneHeight:int = stage.stageHeight;var currentApple:InteractiveObject;var currentAppleClicked:InteractiveObject;var container:Sprite = new Sprite();addChild ( container );// Listen to the MouseEvent.CLICK on the apples parent// Passing true as third parameter catches the event during its capture phasecontainer.addEventListener ( MouseEvent.CLICK, onAppleClick, true );for ( var i:int = 0; i< MAX_NUM; i++ ){currentApple = new Apple();currentApple.x = Math.random()*sceneWidth;currentApple.y = Math.random()*sceneHeight;container.addChild ( currentApple );}function onAppleClick ( e:MouseEvent ):void{currentAppleClicked = e.target as InteractiveObject;container.removeChild ( currentAppleClicked );}Yalnızca üst kapta addEventListener() yöntemine yapılan bir çağrı ile kod basitleştirilmiş ve en iyileştirilmiştir.Dinleyiciler artık Apple örneklerine kayıtlı olmaz ve böylelikle bir elma tıklatıldığında onları çıkarmaya gerek kalmaz.onAppleClick() işleyicisi, olayın yayılımını durdurarak ve daha ileri gitmesini engelleyerek daha da eniyileştirilebilir.function onAppleClick ( e:MouseEvent ):void{e.stopPropagation();currentAppleClicked = e.target as InteractiveObject;container.removeChild ( currentAppleClicked );}İçten dışa tetikleme aşaması, addEventListener() yönteminin üçüncü parametresi olarak false değerini ileterekolayı dıştan içe tetiklemede kullanılabilir:// Listen to the MouseEvent.CLICK on apples parent// Passing false as third parameter catches the event during its bubbling phasecontainer.addEventListener ( MouseEvent.CLICK, onAppleClick, false );Olayı dıştan içe tetikleme aşaması parametresinin varsayılan değeri false olur böylelikle bu parametreyiçıkarabilirsiniz:container.addEventListener ( MouseEvent.CLICK, onAppleClick );
  • 42. 38FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEActionScript 3.0 performansıSon güncelleme 30/3/2011Piksellerle çalışmasetVector() yöntemini kullanarak pikselleri boyayın.Pikselleri boyarken, bazı basit en iyileştirmeler BitmapData sınıfının uygun yöntemleri kullanılarak kolaylıklagerçekleştirilebilir. Pikselleri boyamanın hızlı bir yolu, setVector() yöntemini kullanmaktır:// Image dimensionsvar wdth:int = 200;var hght:int = 200;var total:int = wdth*hght;// Pixel colors Vectorvar pixels:Vector.<uint> = new Vector.<uint>(total, true);for ( var i:int = 0; i< total; i++ ){// Store the color of each pixelpixels[i] = Math.random()*0xFFFFFF;}// Create a non-transparent BitmapData objectvar myImage:BitmapData = new BitmapData ( wdth, hght, false );var imageContainer:Bitmap = new Bitmap ( myImage );// Paint the pixelsmyImage.setVector ( myImage.rect, pixels );addChild ( imageContainer );setPixel() veya setPixel32() gibi yavaş yöntemler kullanırken, öğelerin daha hızlı çalışması için lock() veunlock() yöntemlerini kullanın. Aşağıdaki kodda, performansın iyileştirilmesi için lock() ve unlock() yöntemlerikullanılıyor:
  • 43. 39FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEActionScript 3.0 performansıSon güncelleme 30/3/2011var buffer:BitmapData = new BitmapData(200,200,true,0xFFFFFFFF);var bitmapContainer:Bitmap = new Bitmap(buffer);var positionX:int;var positionY:int;// Lock updatebuffer.lock();var starting:Number=getTimer();for (var i:int = 0; i<2000000; i++){// Random positionspositionX = Math.random()*200;positionY = Math.random()*200;// 40% transparent pixelsbuffer.setPixel32( positionX, positionY, 0x66990000 );}// Unlock updatebuffer.unlock();addChild( bitmapContainer );trace( getTimer () - starting );// output : 670BitmapData sınıfının lock() yöntemi BitmapData nesnesi değiştiğinde bir görüntüyü kitler ve ona başvurannesnelerin güncellenmesini önler. Örneğin, bir Bitmap nesnesi bir BitmapData nesnesine başvurursa, BitmapDatanesnesini kilitleyebilirsiniz, değiştirebilirsiniz ve sonrasında kilidini açabilirsiniz. BitmapData nesnesinin kilidi açılanakadar Bitmap nesnesi değişmez. Performansı artırmak için, setPixel() veya setPixel32() yöntemine birçok çağrıyapmadan önce veya yaptıktan sonra unlock() yöntemiyle birlikte bu yöntemi kullanın. lock() ve unlock()yöntemlerinin çağrılması ekranın gereksiz yere güncellenmesini önler.Not: Görüntüleme listesinde olamayan bir bitmap’in piksellerini işlerken (çift arabellek) bu teknik bazen performansıarttırmaz. Bir bitmap nesnesi bitmap arabelleğine başvurmuyorsa lock() ve unlock() yönteminin kullanılmasıperformansı arttırmaz. Flash Player arabelleğe başvurulmadığını ve bitmap’in ekran üzerinde oluşturulmadığını algılar.getPixel(), getPixel32(), setPixel() ve setPixel32() gibi pikselleri yineleyen yöntemler özellikle mobilaygıtlarda yavaş çalışabilir. Mümkünse tek çağrıda bütün pikselleri geri alan yöntemleri kullanın. Pikselleri okumakiçin, getPixels() yönteminden daha hızlı olan getVector() yöntemini kullanın. Ayrıca mümkünse, daha hızlıçalıştıkları için Vector nesnelerine dayanan API’leri kullanmayı unutmayın.Normal ifadelerTemel dize bulma ve ayıklama için normal bir ifade yerine indexOf(), substr() veya substring() gibi Stringsınıfı yöntemlerini kullanın.Düzenli bir ifade kullanarak yapılabilen bazı işlemler String sınıfının yöntemlerinin kullanımıyla dagerçekleştirilebilir. Örneğin, bir dizenin başka bir dize içerip içermediğini belirlemek için, String.indexOf()yöntemini veya düzenli bir ifade kullanabilirsiniz. Ancak, bir String sınıfı yöntemi mevcut olduğunda, ona denk olandüzenli ifadeden daha hızlı çalışır ve başka bir nesnenin oluşturulmasını gerektirmez.Öğeleri gruplandırmanız gerekiyorsa ancak sonuç olarak grup içeriklerini yalıtmanız gerekmiyorsa, normal ifadeniniçindeki bir grup (“(xxxx)”) yerine yakalama yapmayan bir grup (“(?:xxxx)”) kullanın.
  • 44. 40FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEActionScript 3.0 performansıSon güncelleme 30/3/2011Orta karmaşıklıktaki normal ifadelerde, genellikle ifadenin parçalarını grup olacak şekilde bir araya getirirsiniz.Örneğin, aşağıdaki düzenli ifade deseninde, parantezler “ab” metninin etrafında bir grup oluşturur. Bununsonucunda, “+” nicelik belirteci tek bir karakter yerine gruba uygulanır:/(ab)+/Varsayılan olarak, grupların her birinin içeriği “yakalanır”. Deseninizdeki grupların her birinin içeriğini düzenliifadeyi çalıştırmanın sonucunun bir parçası olarak alabilirsiniz. Bu grup sonuçlarının yakalanması, grup sonuçlarınıiçerecek nesneler oluşturulduğu için daha uzun sürer ve daha fazla bellek gerektirir. Buna alternatif olarak, açmaparantezinden sonra bir soru işareti ve iki nokta ekleyerek yakalama yapmayan grup sözdizimini kullanabilirsiniz. Busözdizimi karakterlerin bir grup gibi davrandığını ancak sonuç için yakalanmadığını belirtir./(?:ab)+/Yakalama yapmayan grup sözdizimi daha hızlı sonuç verir ve standart grup sözdizimine göre daha az bellek kullanır.Düzenli bir ifade yetersiz performans gösterirse alternatif bir düzenli ifade yapısı kullanmayı deneyin..Bazen, aynı metin yapısının test edilmesi veya tanımlanması için birden fazla düzenli ifade yapısı kullanılabilir. Çeşitlinedenlerden dolayı, belirli yapılar alternatiflerinden daha hızlı çalışır. Normal bir ifadenin kodunuzu gerektiğindendaha yavaş çalıştırdığını belirlerseniz, aynı sonucu veren alternatif normal desenleri kullanmayı düşünün. Hangisinindaha hızlı olduğuna karar vermek için bu alternatif desenleri test edin.Çeşitli en iyileştirmelerBir TextField nesnesi için += operatörü yerine appendText() yöntemini kullanın.TextField sınıfının text özelliğini kullanırken, += operatörü yerine appendText() yöntemini kullanın.appendText() yöntemini kullanmak performansta iyileşme sağlar.Örneğin, aşağıdaki kod += operatörünü kullanır ve döngü 1120 msde tamamlanır:addChild ( myTextField );myTextField.autoSize = TextFieldAutoSize.LEFT;var started:Number = getTimer();for (var i:int = 0; i< 1500; i++ ){myTextField.text += "ActionScript 3";}trace( getTimer() - started );// output : 1120Aşağıdaki örnekte, += operatörü appendText() yöntemiyle değiştirilir:
  • 45. 41FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEActionScript 3.0 performansıSon güncelleme 30/3/2011var myTextField:TextField = new TextField();addChild ( myTextField );myTextField.autoSize = TextFieldAutoSize.LEFT;var started:Number = getTimer();for (var i:int = 0; i< 1500; i++ ){myTextField.appendText ( "ActionScript 3" );}trace( getTimer() - started );// output : 847Kod artık 847 msde tamamlanır.Mümkünse, metin alanlarını döngülerin dışında güncelleyin.Bu kod basit bir tekniğin kullanımıyla daha da iyileştirilebilir. Her döngüdeki metin alanını güncellemek çok fazladahili işlenme gerektirir. Basitçe bir dize bitiştirip, ona döngünün dışındaki bir metin alanının değerini atadığınızdakodu çalıştırma süresi önemli ölçüde düşer. Artık kodun tamamlanması için 2 ms gerekir:var myTextField:TextField = new TextField();addChild ( myTextField );myTextField.autoSize = TextFieldAutoSize.LEFT;var started:Number = getTimer();var content:String = myTextField.text;for (var i:int = 0; i< 1500; i++ ){content += "ActionScript 3";}myTextField.text = content;trace( getTimer() - started );// output : 2Bir HTML metni ile çalışırken, eski yaklaşım öyle yavaştır ki bazı durumlarda Flash Player’da bir Timeout istisnasıatabilir. Örneğin, temeldeki donanım çok yavaşsa bir istisna atılabilir.Not: Adobe® AIR® bu istisnayı atmaz.var myTextField:TextField = new TextField();addChild ( myTextField );myTextField.autoSize = TextFieldAutoSize.LEFT;var started:Number = getTimer();for (var i:int = 0; i< 1500; i++ ){myTextField.htmlText += "ActionScript <b>2</b>";}trace( getTimer() - started );Değer döngünün dışındaki bir dizeye atandığında kodun tamamlanması yalnızca 29 ms sürer:
  • 46. 42FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEActionScript 3.0 performansıSon güncelleme 30/3/2011var myTextField:TextField = new TextField();addChild ( myTextField );myTextField.autoSize = TextFieldAutoSize.LEFT;var started:Number = getTimer();var content:String = myTextField.htmlText;for (var i:int = 0; i< 1500; i++ ){content += "<b>ActionScript<b> 3";}myTextField.htmlText = content;trace ( getTimer() - started );// output : 29Not: Flash Player 10.1 ve AIR 2.5te, dizelerin daha az bellek kullanması için String sınıfı iyileştirilmiştir.Mümkünse köşeli parantez operatörünü kullanmaktan kaçının.Köşeli parantez operatörünün kullanılması performansı yavaşlatabilir: Başvurunuzu yerel bir değişkende saklayarakonu kullanmaktan kaçınabilirsiniz. Aşağıdaki kod örneği köşeli parantez operatörünün etkisiz kullanımını gösterir:var lng:int = 5000;var arraySprite:Vector.<Sprite> = new Vector.<Sprite>(lng, true);var i:int;for ( i = 0; i< lng; i++ ){arraySprite[i] = new Sprite();}var started:Number = getTimer();for ( i = 0; i< lng; i++ ){arraySprite[i].x = Math.random()*stage.stageWidth;arraySprite[i].y = Math.random()*stage.stageHeight;arraySprite[i].alpha = Math.random();arraySprite[i].rotation = Math.random()*360;}trace( getTimer() - started );// output : 16Aşağıdaki en iyileştirilmiş sürüm köşeli parantez operatörünün kullanım oranını azaltır:
  • 47. 43FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEActionScript 3.0 performansıSon güncelleme 30/3/2011var lng:int = 5000;var arraySprite:Vector.<Sprite> = new Vector.<Sprite>(lng, true);var i:int;for ( i = 0; i< lng; i++ ){arraySprite[i] = new Sprite();}var started:Number = getTimer();var currentSprite:Sprite;for ( i = 0; i< lng; i++ ){currentSprite = arraySprite[i];currentSprite.x = Math.random()*stage.stageWidth;currentSprite.y = Math.random()*stage.stageHeight;currentSprite.alpha = Math.random();currentSprite.rotation = Math.random()*360;}trace( getTimer() - started );// output : 9Satır içi kodu, mümkün olduğunda, kodunuzdaki işlev çağrılarının sayısını düşürür.İşlev çağırmak pahalı olabilir. Kod satır içini taşıyarak işlev çağrılarının sayısını azaltmayı deneyin. Kod satır içinitaşımak sadece performansı artırmak üzere en iyileştirmenin iyi bir yoludur. Ancak, satır içi kod, kodunuzun yenidenkullanımını zorlaştırabilir ve SWF dosyanızın boyutunu büyütebilir. Bazı işlev çağrılarının, örneğin Math sınıfıyöntemlerinin, satır içine taşınması kolaydır. Aşağıdaki kod, mutlak değerleri hesaplamak için Math.abs()yöntemini kullanır:const MAX_NUM:int = 500000;var arrayValues:Vector.<Number>=new Vector.<Number>(MAX_NUM,true);var i:int;for (i = 0; i< MAX_NUM; i++){arrayValues[i] = Math.random()-Math.random();}var started:Number = getTimer();var currentValue:Number;for (i = 0; i< MAX_NUM; i++){currentValue = arrayValues[i];arrayValues[i] = Math.abs ( currentValue );}trace( getTimer() - started );// output : 70Math.abs() tarafından yapılan hesaplama elle yapılabilir ve satır içine taşınabilir:
  • 48. 44FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEActionScript 3.0 performansıSon güncelleme 30/3/2011const MAX_NUM:int = 500000;var arrayValues:Vector.<Number>=new Vector.<Number>(MAX_NUM,true);var i:int;for (i = 0; i< MAX_NUM; i++){arrayValues[i] = Math.random()-Math.random();}var started:Number = getTimer();var currentValue:Number;for (i = 0; i< MAX_NUM; i++){currentValue = arrayValues[i];arrayValues[i] = currentValue > 0 ? currentValue : -currentValue;}trace( getTimer() - started );// output : 15İşlev çağrısı satır içi sonuçlarını taşımak, kodun dört kat daha hızlı olmasını sağlar. Bu yaklaşım pek çok durumdakullanışlıdır ancak bunun yeniden kullanılabilirlik ve korunabilirlik açısından sebep olabileceği durumlara dikkat edin.Not: Kod boyutu oynatıcının genel çalışmasının üzerinde büyük bir etkiye sahiptir. Uygulama yüksek düzeydeActionScript kodu içeriyorsa, sanal makine kodu doğrulamak ve JIT derlemek için çok zaman harcar. Özellik aramaları,daha geniş miras hiyerarşileri nedeniyle ve dahili önbelleklerin daha fazla çalışmasından dolayı daha yavaş olabilir. Kodboyutunu azaltmak için Adobe® Flex® çerçevesini, TLF çerçevesi kütüphanesini veya herhangi bir geniş üçüncü tarafActionScript kütüphanesini kullanmaktan kaçının.Döngü şeklinde olan ifadeleri değerlendirmekten kaçının.Başka bir en iyileştirme, döngü şeklinde olan bir ifadeyi değerlendirmeyerek sağlanabilir. Aşağıdaki kod bir diziüzerinde yinelenir ancak her yineleme için dizi uzunluğu değerlendirildiğinden dolayı en iyileştirilmez.for (var i:int = 0; i< myArray.length; i++){}Değerin depolanması ve tekrar kullanılması daha iyi bir çözümdür.var lng:int = myArray.length;for (var i:int = 0; i< lng; i++){}while döngüleri için ters sıra kullanın.Ters sırada ilerleyen bir while döngüsü forward döngüsünden daha hızlıdır.
  • 49. 45FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEActionScript 3.0 performansıSon güncelleme 30/3/2011var i:int = myArray.length;while (--i > -1){}Bu ipuçları, tek satır kodun performansı ve belleği nasıl etkileyebileceğini göstererek birkaç ActionScript’i eniyileştirme yolu sağlar. Çok sayıda başka ActionScript en iyileştirmesi mümkündür. Daha fazla bilgi için şu bağlantıyabakın: http://www.rozengain.com/blog/2007/05/01/some-actionscript-30-optimizations/.
  • 50. 46Son güncelleme 30/3/2011Bölüm 5: Performans oluşturmaYeniden çizilen bölgelerProjenizi oluştururken her zaman yeniden çizilen bölgeler seçeneğini kullanın.Görüntü oluşturmayı geliştirmek için, projenizi oluştururken bölgeleri yeniden çizilen bölgeleri kullanmanızönemlidir. Bu seçeneği kullanmak Flash Playerın oluşturduğu ve işlediği bölgeleri görmenize izin verir. Flash Playerınhata ayıklama sürümünün bağlam menüsünde Yeniden Çizilen Bölgeleri Göster seçeneğini belirleyerek bu seçeneğietkinleştirebilirsiniz.Not: Yeniden Çizilen Bölgeleri Göster seçeneği, Adobe AIRde veya Flash Playerın yayınlama sürümünde mevcutdeğildir. (Adobe AIRde bağlam menüsü yalnızca masaüstü uygulamalarda kullanılabilir, ancak Yeniden ÇizilenBölgeleri Göster gibi yerleşik veya standart öğeler içermez.)Aşağıdaki görüntü bu seçeneğin zaman çizelgesinde basit bir animasyonlu MovieClipde etkinleştirilmesini örnekler.Yeniden çizilmiş bölgeler seçeneği etkinAyrıca bu seçeneği, flash.profiler.showRedrawRegions() yöntemini kullanarak programlama yoluylaetkinleştirebilirsiniz:// Enable Show Redraw Regions// Blue color is used to show redrawn regionsflash.profiler.showRedrawRegions ( true, 0x0000FF );Adobe AIR uygulamalarında bu yöntem, yeniden çizilen bölgeler seçeneğini etkinleştirmenin tek yoludur.En iyileştirme fırsatlarını tanımlamak için yeniden çizilen bölgeleri kullanın. Bazı görüntüleme nesneleriningösterilmemesine rağmen, hala oluşturulmakta olduklarından İşlemci döngüsü tükettiklerini unutmayın. Aşağıdakigörüntü bu fikri örnekler. Siyah bir vektör şekli çalışan hareketli karakteri kaplar. Görüntü, görüntüleme nesnesiningörüntüleme listesinden silinmediğini ve hala oluşturulduğunu gösterir. Bu İşlemci döngülerini tüketir:
  • 51. 47FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011Yeniden çizilmiş bölgelerPerformansı artırmak için, gizli çalışan karakterin visible özelliğini false olarak ayarlayın veya görüntülemelistesinden tamamen kaldırın. Zaman çizelgesini de durdurmanız gerekir. Bu adımlar görüntüleme nesnesinindonmasını ve en az miktarda İşlemci gücü kullanmasını garantiler.Tüm geliştirme döngüsü boyunca yeniden çizilen bölgeler seçeneğini kullanmayı unutmayın. Bu seçenek, projeninsonuna geldiğinizde gereksiz yeniden çizilmiş bölgeler ve kaçırılmış olabilecek en iyileştirme alanları nedeniyleşaşırmanızı engeller.Daha fazla Yardım konusu“Nesneleri dondurma ve çözme” sayfa 26Sahne alanı dışı içerikİçerikleri sahne alanı dışına yerleştirmekten kaçının. Bunun yerine, gerektiğinde nesneleri görüntüleme listesineyerleştirin.Mümkünse, grafiksel içeriği sahne alanı dışına yerleştirmemeye çalışın. Tasarımcılar ve geliştiriciler, uygulama ömrüboyunca varlıkları yeniden kullanmak için genellikle öğeleri sahne alanı dışına yerleştirir. Aşağıdaki şekilde bu yaygınteknik gösterilmektedir:
  • 52. 48FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011Sahne alanı dışı içerikSahne alanı dışı öğeler ekranda gösterilmeyip oluşturulmasa da, yine de görüntüleme listesinde var olurlar. Çalışmazamanı, bu öğelerin halen sahne alanı dışında olduğundan ve kullanıcının bunlarla etkileşim kurmadığından eminolmak için bu öğelerde dahili testler çalıştırmaya devam eder. Sonuç olarak, mümkün olduğunca nesneleri sahne alanıdışına yerleştirmekten kaçının ve bunları görüntüleme listesinden kaldırın.Film kalitesiOluşturmayı iyileştirmek için uygun Sahne Alanı kalite ayarını kullanın.
  • 53. 49FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011Telefonlar gibi küçük ekranlı mobil cihazlar için içerik geliştirirken, görüntü kalitesi masaüstü uygulamalarıgeliştirmeye kıyasla daha az önem taşır. Sahne alanı kalitesine uygun ayarı yapmak oluşturma performansınıiyileştirebilir.Sahne Alanı kalitesi için aşağıdaki ayarlar kullanılabilir:• StageQuality.LOW: Oynatma hızını görünümden ayrıcalıklı kılar ve kenar yumuşatma kullanmaz. Bu ayar,masaüstü veya TV için Adobe AIRde desteklenmez.• StageQuality.MEDIUM: Biraz kenar yumuşatma uygular ancak ölçeklenmiş bitmap’leri düzgünleştirmez. Bu ayarmobil cihazlardaki AIR için varsayılan değerdir, ancak masaüstündeki ve TVlerdeki AIRlerde desteklenmez.• StageQuality.HIGH: (Masaüstünde varsayılan) Görünümü oynatma hızından ayrıcalıklı kılar ve her zaman kenaryumuşatma kullanır. SWF dosyası animasyon içermiyorsa, bitmapler düzgünleştirilir; SWF dosyası animasyoniçeriyorsa, bitmapler düzgünleştirilmez.• StageQuality.BEST: En iyi görüntü kalitesini sunar ve oynatma hızını dikkate almaz. Tüm çıktının kenarlarıyumuşatılır ve ölçeklenmiş bitmapler her zaman düzgünleştirilir.StageQuality.MEDIUM öğesinin kullanımı genelde mobil aygıtlardaki uygulamalar için yeterli kaliteyi sağlar ve bazıdurumlarda StageQuality.LOW öğesinin kullanımı yeterli kaliteyi sağlayabilir. Flash Player 8’den itibaren, kenaryumuşatmalı metin Sahne Alanı kalitesi LOW ayarına getirildiğinde bile doğru bir şekilde oluşturulabilir.Not: Bazı mobil aygıtlarda, kalite HIGH olarak ayarlandığında bile, Flash Player uygulamalarında daha iyi performansiçin MEDIUM kullanılır. Ancak, genelde mobil cihazların ekranları daha yüksek dpiye sahip olduğu için, kaliteyi HIGHolarak ayarlamak algılanabilir bir fark yaratmaz. (Dpi cihaza bağlı olarak değişebilir.)Aşağıdaki örnekte, film kalitesi MEDIUM değerine ve metin oluşturma Animasyon için Kenar Yumuşatma’ya ayarlıdır:Orta Sahne alanı kalitesi ve Animasyon için Kenar Yumuşatma’ya ayarlı metin oluşturmaSahne Alanı kalitesi ayarı, uygun metin oluşturma ayarı kullanılmadığı için metin kalitesini etkiler.Çalışma zamanı, metin oluşturmayı Okunabilirlik için Kenar Yumuşatmaya ayarlamanıza olanak sağlar. Bu ayarhangi Sahne Alanı kalite ayarını kullandığınız fark etmeksizin metniniz (kenar yumuşatmalı) için mükemmel kaliteyikorur.
  • 54. 50FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011Düşük Sahne alanı kalitesi ve Okunabilirlik için Kenar Yumuşatma’ya ayarlı metin oluşturmaMetin oluşturma Bitmap Metnine (Kenar yumuşatma olmadan) ayarlanarak aynı oluşturma kalitesi sağlanabilir:Düşük Sahne Alanı kalitesi ve Bitmap Metnine ayarlı metin oluşturma (Kenar yumuşatma olmadan)Son iki örnek hangi Sahne Alanı kalitesini kullandığınız fark etmeksizin yüksek kaliteli metin elde edebileceğinizigösterir: Bu özellik Flash Player 8’den bu yana bulunmaktadır ve mobil aygıtlarda da kullanılabilir. Bazı aygıtlardaperformansı yükseltmek için Flash Player 10.1’in otomatik olarak StageQuality.MEDIUM değerine dönebileceğiniunutmayın.Alfa karıştırmaAlpha özelliğini kullanmaktan mümkün olduğunca kaçının.Alpha özelliğini kullanırken yavaşça görünme efekti gibi alfa karıştırma gerektiren efektleri kullanmaktan kaçının. Birgörüntüleme nesnesi alfa karıştırma özelliğini kullandığında, çalışma zamanı son rengi belirlemek için her istiflenmişgörüntüleme nesnesinin renk değerlerini ve arka plan rengini birleştirmelidir. Böylece alfa karıştırma, opak bir renkçizmekten daha fazla işlemci işlemi gerektirebilir. Bu fazladan hesaplama, yavaş aygıtlarda performansı düşürebilir.alpha özelliğini kullanmaktan mümkün olduğunca kaçının.
  • 55. 51FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011Daha fazla Yardım konusu“Bitmapleri önbelleğe alma” sayfa 52“Metin nesnelerinin oluşturulması” sayfa 66Uygulama kare hızıGenelde, daha iyi performans için, mümkün olan en düşük kare hızını kullanın.Uygulamanın kare hızı, “Çalışma zamanı kodunu çalıştırmanın temelleri” sayfa 1 bölümünde belirtildiği şekilde, her“uygulama kodu ve oluşturma” döngüsü için ne kadar süre gerektiğini belirler. Daha yüksek kare hızı daha sorunsuzbir animasyon oluşturur. Ancak, animasyon veya diğer görsel değişiklikler gerçekleşmediğinde, genellikle yüksek karehızı kullanmak için bir neden yoktur. Daha yüksek bir kare hızı, düşük hızla karşılaştırıldığında daha fazla işlemcidöngüsü ve pil enerjisi harcar.Aşağıda, uygulamanız için uygun bir varsayılan kare hızının ayarlanmasına ilişkin bazı genel kılavuzlar mevcuttur:• Flex çerçevesi kullanıyorsanız, başlangıç kare hızını varsayılan değerde bırakın..• Uygulamanız animasyon içeriyorsa, uygun kare hızı en az saniyede 20 karedir. 30 kareden fazla olan herhangi birhız genellikle gereksizdir.• Uygulamanız animasyon içermiyorsa, saniyede 12 karelik bir hız büyük olasılıkla yeterlidir.“Olabilecek en düşük kare hızı” uygulamanın o andaki etkinliğine bağlı olarak değişebilir. Daha fazla bilgi için, birsonraki ipucu olan “Uygulamanızın kare hızını dinamik olarak değiştirme” bölümünü inceleyin.Uygulamanızdaki tek dinamik içerik video olduğunda düşük bir kare hızı kullanın.Çalışma zamanı, uygulamanın kare hızı ne olursa olsun, yüklenen video içeriğini yerel kare hızında oynatır.Uygulamanız bir animasyon veya hızla değişen görsel içerik içermiyorsa, düşük bir kare hızının kullanılması kullanıcıarabiriminin deneyimini bozmaz.Uygulamanızın kare hızını dinamik olarak değiştirme.Uygulamanın ilk kare hızını proje veya derleyici ayarlarında tanımlarsınız ancak kare hızı o değerde sabitlenmez. Karehızını Stage.frameRate özelliğini (veya Flex’teki WindowedApplication.frameRate özelliği) ayarlayarakdeğiştirebilirsiniz.Kare hızını uygulamanızın geçerli gereksinimlerine göre değiştirin. Örneğin, uygulamanız herhangi bir animasyonçalıştırmadığında, kare hızını düşürün. Hareketli bir geçiş başlamak üzere olduğunda, kare hızını yükseltin. Benzerşekilde, uygulamanız arka planda çalışıyorsa (odağını kaybettikten sonra), kare hızını daha da düşürebilirsiniz.Kullanıcının başka bir uygulama veya göreve odaklanmış olması mümkündür.Aşağıdakiler, farklı etkinlik türleri için uygun olan kare hızının belirlenmesine yönelik bir başlangıç noktası olarakkullanılacak genel kılavuzlardır:• Flex çerçevesi kullanıyorsanız, başlangıç kare hızını varsayılan değerde bırakın..• Animasyon oynatılırken, kare hızını en az saniyede 20 kare olarak ayarlayın. 30 kareden fazla olan herhangi bir hızgenellikle gereksizdir.• Bir animasyon oynatılmıyorken, saniyede 12 karelik bir hız büyük olasılıkla yeterlidir.
  • 56. 52FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011• Yüklenen video, uygulama kare hızına bağlı olmaksızın yerel kare hızında oynatılır. Uygulamanızdaki tek hareketliiçerik video ise, saniyede 12 karelik bir hız büyük olasılıkla yeterlidir.• Uygulamanın bir girdi odağı olmadığında, saniyede 5 karelik bir hız büyük olasılıkla yeterlidir.• AIR uygulaması görünür olmadığında, saniyede 2 kare veya daha az bir kare hızı büyük ihtimalle uygundur.Örneğin bu yönerge, bir uygulama simge durumuna küçültüldüğünde geçerli olur. Ayrıca yerel pencereninvisible özelliği false olursa, masaüstü aygıtlarda da geçerli olur.Flex’e dahil uygulamalar için, spark.components geçerlidir. WindowedApplication sınıfında uygulamanın kare hızınıdinamik olarak değiştirmek için dahili destek mevcuttur. backgroundFrameRate özelliği, uygulama etkinolmadığında uygulamanın kare hızını belirler. Varsayılan değer, Spark çerçevesiyle oluşturulmuş bir uygulamanınkare hızını 1 kare/sn olarak değiştiren 1 değeridir. backgroundFrameRate özelliğini ayarlayarak arka plan kare hızınıdeğiştirebilirsiniz. Özelliği başka bir değere ayarlayabilirsiniz veya otomatik kare hızı azaltmayı kapatmak için -1olarak ayarlayabilirsiniz.Bir uygulamanın kare hızını dinamik olarak değiştirmeyle ilgili daha fazla bilgi için, aşağıdaki makaleleri inceleyin:• Reducing CPU usage in Adobe AIR (Adobe AIR’de CPU kullanımını azaltma) (Jonnie Hallman tarafından yazılanAdobe Geliştirici Merkezi makalesi ve örnek kod)• Writing well-behaved, efficient, AIR applications (Başarılı davranış gösteren, etkili AIR uygulamaları yazma)(Arno Gourdol tarafından yazılan makale ve örnek uygulama)Grant Skinner bir kare hızı azaltma sınıfı oluşturdu. Bu sınıfı uygulamalarınızda, uygulamanız arka plandayken karehızını otomatik olarak düşürmek için kullanabilirsiniz. FramerateThrottler sınıfı hakkında daha fazla bilgi edinmek vebu sınıfın kaynak kodunu indirmek için, http://gskinner.com/blog/archives/2009/05/idle_cpu_usage.html adresindeGrantın Idle CPU Usage in Adobe AIR and Flash Player (Adobe AIR ve Flash Playerda Boşta İşlemci Kullanımı)başlıklı makalesine bakın.Bağdaşık kare hızıBir SWF dosyasını derlerken, film için belirli bir kare hızı ayarlayabilirsiniz. Düşük CPU hızlı kısıtlı bir ortamda, bazenkare hızı oynatma sırasında düşebilir. Kullanıcıdan kabul edilebilir bir kare hızını korumak için, çalışma zamanı bazıkarelerin oluşturulmasını atlar. Bazı karelerin oluşturulmasını atlamak kare hızının kabul edilebilir bir değerden aşağıinmesini önler.Not: Bu durumda, çalışma zamanı kare atlamaz, yalnızca karelerdeki içeriğin oluşturulmasını atlar. Kod çalıştırılmayadevam eder ve görüntüleme listesi güncellenir ancak güncellemeler ekran üzerinde görünmez. Çalışma zamanı karehızını sabit tutamıyorsa, kaç karenin atlanacağını belirleyen eşik kare/saniye değeri belirlemek mümkün değildir.Bitmapleri önbelleğe almaKarmaşık vektör içeriği için, uygun olduğu zaman bitmapleri önbelleğe alma özelliğini kullanın.İyi bir en iyileştirme, bitmap önbelleğe alma özelliği kullanılarak gerçekleştirilebilir. Bu özellik bir vektör nesnesiniönbelleğe alır, onu dahili şekilde bir bitmap olarak oluşturur ve o bitmap’i oluşturma için kullanır. Sonuç, oluşturmaiçin aşırı yüksek bir performans artışıdır ancak önemli miktarda bellek gerektirebilir. Karmaşık degradeler veya metingibi karmaşık vektör içeriği için bitmapleri önbelleğe alma özelliğini kullanın.
  • 57. 53FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011Karmaşık vektör grafikleri kullanan (metin veya degradeler gibi) bir hareketli nesne için bitmapleri önbelleğe almayıaçmak performansı iyileştirir. Ancak, zaman çizelgesi yürütülen bir film klibi gibi görüntüleme nesnesinde bitmapönbelleğe alımı etkinse tam tersi sonucu alırsınız. Her karede, çalışma zamanı önbelleğe alınmış bitmapi güncellemelive ekranda yeniden çizmelidir ve bu çok fazla işlemci döngüsü gerektirir. Bitmapleri önbelleğe alma özelliği, yalnızcaönbelleğe alınmış bitmap bir kere oluşturulup güncellenme gereksinimi duyulmadan kullanılıyorsa yarar sağlar.Bir Sprite nesnesi için bitmap önbelleğe alma özelliğini açarsanız; nesne çalışma zamanının önbelleğe alınan bitmap’iyeniden oluşturmasına neden olmadan taşınabilir. Nesneninx ve y özelliklerinin değiştirilmesi yeniden oluşturmayaneden olmaz. Ancak döndürme, ölçeklendirme veya alfa değerini değiştirme, çalışma zamanının önbelleğe alınmışbitmap’i yeniden oluşturmasına neden olur ve bunun sonucunda performans zarar görür.Not: AIR ve Packager for iPhone uygulamalarında bulunan DisplayObject.cacheAsBitmapMatrix özelliğinde bukısıtlama yoktur. cacheAsBitmapMatrix özelliğini kullanarak, bitmap yeniden oluşturmayı tetiklemeden görüntülemenesnesinin alfa değerini döndürebilir, ölçeklendirebilir, eğriltebilir ve değiştirebilirsiniz.Önbelleğe alınan bir bitmap sıradan bir film klibi örneğine göre daha fazla bellek kullanabilir. Örneğin, SahneAlanındaki bir film klibi 250 x 250 piksel boyutlarına sahipse, arabelleğe alınmadığında kullanacağı 1 KB yerine,arabelleğe alındığında yaklaşık 250 KB kullanır.Aşağıdaki örnekte elma görüntüsü içeren bir Sprite nesnesi vardır. Aşağıdaki sınıf elma sembolüne bağlıdır:package org.bytearray.bitmap{import flash.display.Sprite;import flash.events.Event;public class Apple extends Sprite{private var destinationX:Number;private var destinationY:Number;public function Apple (){addEventListener(Event.ADDED_TO_STAGE,activation);addEventListener(Event.REMOVED_FROM_STAGE,deactivation);}private function activation(e:Event):void{initPos();addEventListener (Event.ENTER_FRAME,handleMovement);}private function deactivation(e:Event):void
  • 58. 54FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011{removeEventListener(Event.ENTER_FRAME,handleMovement);}private function initPos():void{destinationX = Math.random()*(stage.stageWidth - (width>>1));destinationY = Math.random()*(stage.stageHeight - (height>>1));}private function handleMovement(e:Event):void{x -= (x - destinationX)*.5;y -= (y - destinationY)*.5;if (Math.abs(x - destinationX) < 1 && Math.abs(y - destinationY) < 1)initPos();}}}Kod, her elma için bir zaman çizelgesi gerekmediğinden MovieClip sınıfı yerine Sprite sınıfını kullanır. En iyiperformans için, mümkün olan en hafif nesneyi kullanın. Sonra, sınıf aşağıdaki kod ile başlatılır:
  • 59. 55FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011import org.bytearray.bitmap.Apple;stage.addEventListener(MouseEvent.CLICK,createApples);stage.addEventListener(KeyboardEvent.KEY_DOWN,cacheApples);const MAX_NUM:int = 100;var apple:Apple;var holder:Sprite = new Sprite();addChild(holder);function createApples(e:MouseEvent):void{for (var i:int = 0; i< MAX_NUM; i++){apple = new Apple();holder.addChild(apple);}}function cacheApples(e:KeyboardEvent):void{if (e.keyCode == 67){var lng:int = holder.numChildren;for (var i:int = 0; i < lng; i++){apple = holder.getChildAt (i) as Apple;apple.cacheAsBitmap = Boolean(!apple.cacheAsBitmap);}}}Kullanıcı fareyi tıklattığında, elmalar arabelleğe alınmadan oluşturulur. Kullanıcı C (tuş kodu 67) tuşuna bastığında,elma vektörleri bitmapler olarak arabelleğe alınır ve ekran üzerinde görüntülenir. Bu teknik CPU yavaş olduğundahem masaüstü hem de mobil cihazlar için oluşturma performansını büyük ölçüde iyileştirir.Ancak, bitmapleri arabelleğe alma özelliği oluşturma performansını iyileştirse de, hızla büyük miktarda bellektüketebilir. Bir nesne önbelleğe alındığı anda, yüzeyi aşağıdaki şemada gösterildiği gibi saydam bitmap olarakyakalanır ve bellekte saklanır.
  • 60. 56FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011Bellekte saklanan nesne ve bu nesnenin yüzey bitmap’iFlash Player 10.1 ve AIR 2.5, “Filtreleri ve dinamik bitmapi kaldırma” sayfa 18 bölümünde anlatılan yaklaşımıuygulayarak bellek kullanımını en iyi hale getirir. Önbelleğe alınmış görüntüleme nesnesi ekranda değilse ya dagizliyse, bir süre kullanılmadığında bellekteki bitmap serbest bırakılır.Not: Görüntüleme nesnesinin opaqueBackground özelliği belirli bir renge ayarlanırsa, çalışma zamanı görüntülemenesnesini opak olarak varsayar. cacheAsBitmap özelliği ile birlikte kullanıldığında, çalışma zamanı bellekte saydamolmayan bir 32 bit bitmap oluşturur. Alfa kanalı 0xFF olarak ayarlanır, bu da ekran üzerindeki bitmap’in çizilmesi içinsaydamlık gerekmediğinden performansı iyileştirir. Alfa karıştırmayı önlemek oluşturma işlemini daha da hızlandırır.Geçerli ekran derinliği 16 bit ile sınırlıysa, bellekteki bitmap 16 bit’lik bir görüntü olarak saklanır. opaqueBackgroundözelliğinin kullanılması bitmapleri artalanda önbelleğe alma işlemini başlatmaz.Bellekten tasarruf etmek için, cacheAsBitmap özelliğini kullanın ve onu kap yerine her görüntüleme nesnesindeetkinleştirin. Kaptaki bitmapleri önbelleğe almayı etkinleştirme işlemi, 211 x 279 piksel boyutlarında saydam bitmapoluşturarak son bitmap’in bellekte çok daha fazla yer kaplamasına yol açar. Görüntü yaklaşık 229 KBlık bellek kullanır:Kapta bitmapleri arabelleğe almayı etkinleştirmeAyrıca, kabı önbelleğe alarak, herhangi bir elmanın bir karede hareket etmeye başlaması durumunda bellektebitmap’in tamamının güncellenmesi riskini de alırsınız. Bağımsız örneklerde bitmapleri arabelleğe almayıetkinleştirmek bellekte yalnızca 42 KB kullanmak demek olan 7 KBlık yüzeyleri arabelleğe almayla sonuçlanır.BellektekiBitmap versiyonu cacheAsBitmap = trueGörüntülenen211 piksel279 piksel
  • 61. 57FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011Örneklerde bitmapleri arabelleğe almayı etkinleştirmeHer elma örneğine görüntüleme listesi üzerinden erişilmesi ve getChildAt() yönteminin kullanılması başvurularıdaha kolay erişim için bir Vector nesnesinde saklar:
  • 62. 58FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011import org.bytearray.bitmap.Apple;stage.addEventListener(KeyboardEvent.KEY_DOWN, cacheApples);const MAX_NUM:int = 200;var apple:Apple;var holder:Sprite = new Sprite();addChild(holder);var holderVector:Vector.<Apple> = new Vector.<Apple>(MAX_NUM, true);for (var i:int = 0; i< MAX_NUM; i++){apple = new Apple();holder.addChild(apple);holderVector[i] = apple;}function cacheApples(e:KeyboardEvent):void{if (e.keyCode == 67){var lng:int = holderVector.lengthfor (var i:int = 0; i < lng; i++){apple = holderVector[i];apple.cacheAsBitmap = Boolean(!apple.cacheAsBitmap);}}}Her karede önbelleğe alınmış içerik döndürülmüyor, ölçeklendirilmiyor veya değiştirilmiyorsa bitmapleri önbelleğealmanın oluşturma işlemini iyileştireceğini unutmayın. Ancak, oluşturma x ve y eksenlerinde çevrilme haricindekiherhangi bir dönüştürme için iyileştirilmez. Bu durumlarda, Flash Player görüntüleme nesnesinde oluşan herdönüştürme için önbelleğe alınan bitmap kopyasını günceller. Önbelleğe alınan kopyanın güncellenmesi işlemcininfazla kullanımı, yavaş performans ve yüksek pil kullanımına neden olabilir. AIR veya Packager for iPhoneuygulamalarında bulunan cacheAsBitmapMatrix özelliğinde bu kısıtlama yoktur.Aşağıdaki kod hareket yöntemindeki alfa değerini değiştirir, bu da her karede elmanın opaklığını değiştirir.private function handleMovement(e:Event):void{alpha = Math.random();x -= (x - destinationX)*.5;y -= (y - destinationY)*.5;if (Math.abs(x - destinationX) < 1 && Math.abs(y - destinationY) < 1)initPos();}Bitmapleri arabelleğe alma performansta bir yavaşlamaya sebep olur. Alfa değerinin değiştirilmesi, çalışma zamanınıher alfa değeri değişiminde bellekte arabelleğe alınan bitmapi güncellemeye zorlar.
  • 63. 59FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011Filtreler önbelleğe alınan bir film klibi oynatma kafasının her hareket edişinde güncellenen bitmaplere bağlıdır. Bunedenle, bir filtre kullanılması, otomatik olarak cacheAsBitmap özelliğini true değerine ayarlar. Aşağıdaki şekildehareketli bir film klibi gösterilmektedir:Hareketli film klibiPerformansta sorunlara yol açacağından, hareketli içerikte filtre kullanımından kaçının. Aşağıdaki şekilde, tasarımcıbir alt gölge filtresi ekler:Alt gölge filtresiyle hareketli film klibiSonuç olarak, film klibinin içindeki zaman çizelgesi oynatılıyorsa, bitmap yeniden oluşturulmalıdır. Basit bir x veya ydönüşümü haricinde içerik değiştirilmişse de bitmap yeniden oluşturulmalıdır. Her kare, çalışma zamanını bitmap’iyeniden çizmeye zorlar, bu da daha fazla işlemci kaynağı kullanımı gerektirir, düşük performansa neden olur ve dahafazla pil ömrü tüketir.AIRde önbelleğe alınan bitmap dönüştürme matrisleriMobil AIR uygulamalarında önbelleğe alınan bitmapleri kullanırken cacheAsBitmapMatrix özelliğini ayarlayın.AIR mobil profilinde, bir görüntüleme nesnesinin cacheAsBitmapMatrix özelliğine Matris nesnesi atayabilirsiniz. Buözelliği ayarladığınızda, önbelleğe alınan bitmapi yeniden oluşturmadan nesneye iki boyutlu dönüştürmeuygulayabilirsiniz. Ayrıca önbelleğe alınan bitmapi yeniden oluşturmadan da alfa özelliğini değiştirebilirsiniz.cacheAsBitmap özelliği de true değerine ayarlanmalı ve nesnede ayarlanmış bir 3B özellik olmamalıdır.cacheAsBitmapMatrix özelliğinin ayarlanması, görüntüleme nesnesi ekran dışında da olsa, görünümden gizlenmişde olsa veya visible özelliği false olarak ayarlanmış da olsa, önbelleğe alınmış bitmap oluşturur. Farklı birdönüştürme içeren bir matris nesnesi kullanılarak cacheAsBitmapMatrix özelliğinin sıfırlanması da önbelleğealınmış bitmapi yeniden oluşturur.
  • 64. 60FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011cacheAsBitmapMatrix özelliğine uyguladığınız matris dönüştürmesi, bitmap önbelleğinde oluşturuldukçagörüntüleme nesnesine uygulanır. Böylece, dönüştürme 2x ölçek içeriyorsa, bitmap oluşturma, vektör oluşturmaboyutunun iki katıdır. Oluşturucu, önbelleğe alınan bitmape ters dönüştürme uygular; böylece son görüntü aynışekilde görünür. Bellek kullanımını azaltmak için, muhtemelen aslına uygun oluşturma konusunda taviz vererekönbelleğe alınan bitmapi daha küçük bir boyuta ölçekleyebilirsiniz. Ayrıca bazı durumlarda oluşturma kalitesiniartırmak için, yüksek bellek kullanımı pahasına, bitmapi daha büyük bir boyuta ölçeklendirebilirsiniz. Genellikle,aşağıdaki örnekte gösterildiği gibi, görünümdeki değişiklikleri önlemek için herhangi bir dönüştürme uygulamayanbir matris niteliğindeki kimlik matrisi kullanın.displayObject.cacheAsBitMap = true;displayObject.cacheAsBitmapMatrix = new Matrix();cacheAsBitmapMatrix özelliği ayarlandıktan sonra, bitmap yeniden oluşturmayı tetiklemeden nesneyiölçeklendirebilir, eğriltebilir, döndürebilir ve çevirebilirsiniz.Ayrıca 0 -1 aralığında alfa değerini de değiştirebilirsiniz. Renk dönüştürmesi ile birlikte transform.colorTransformözelliği yoluyla alfa değerini değiştirirseniz, dönüştürme nesnesinde kullanılan alfa 0 ile 255 aralığında olmalıdır. Renkdönüştürmesinin başka bir şekilde değiştirilmesi, önbelleğe alınan bitmapi yeniden oluşturur.Mobil aygıtlar için oluşturulan içerikte cacheAsBitmap öğesini true olarak ayarladığınızda her zamancacheAsBitmapMatrix özelliğini ayarlayın. Ancak, aşağıdaki olası dezavantajı unutmayın. Bir nesnedöndürüldükten, ölçeklendirildikten veya eğriltildikten sonra, son oluşturma, normal bir vektör oluşturma ilekarşılaştırıldığında bitmap ölçeklendirme veya kenar yumuşatma yapıları sergileyebilir.Bitmapleri elle önbelleğe almaÖzel bir bitmapleri arabelleğe alma davranışı oluşturmak için BitmapData sınıfını kullanın.Aşağıdaki örnek bir görüntüleme nesnesinin tek bir rasterleştirilmiş bitmap versiyonunu yeniden kullanır ve aynıBitmapData nesnesine başvurur. Görüntüleme nesnelerinin her biri ölçeklendirilirken, bellekteki orijinal BitmapDatanesnesi güncellenmez ve yeniden çizilmez. Bu yaklaşım CPU kaynaklarından tasarruf sağlar ve uygulamaların dahahızlı çalışmasına olanak verir. Görüntüleme nesnesi ölçeklendirilirken, içerikteki bitmap uzatılır.Güncellenen BitmapApple sınıfı:
  • 65. 61FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011package org.bytearray.bitmap{import flash.display.Bitmap;import flash.display.BitmapData;import flash.events.Event;public class BitmapApple extends Bitmap{private var destinationX:Number;private var destinationY:Number;public function BitmapApple(buffer:BitmapData){super(buffer);addEventListener(Event.ADDED_TO_STAGE,activation);addEventListener(Event.REMOVED_FROM_STAGE,deactivation);}private function activation(e:Event):void{initPos();addEventListener(Event.ENTER_FRAME,handleMovement);}private function deactivation(e:Event):void{removeEventListener(Event.ENTER_FRAME,handleMovement);}private function initPos():void{destinationX = Math.random()*(stage.stageWidth - (width>>1));destinationY = Math.random()*(stage.stageHeight - (height>>1));}private function handleMovement(e:Event):void{alpha = Math.random();x -= (x - destinationX)*.5;y -= (y - destinationY)*.5;if ( Math.abs(x - destinationX) < 1 && Math.abs(y - destinationY) < 1)initPos();}}}Alfa değeri her karede hala değiştirilir. Aşağıdaki kod orijinal kaynak arabelleğini her bir BitmapApple örneğine iletir.
  • 66. 62FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011import org.bytearray.bitmap.BitmapApple;const MAX_NUM:int = 100;var holder:Sprite = new Sprite();addChild(holder);var holderVector:Vector.<BitmapApple> = new Vector.<BitmapApple>(MAX_NUM, true);var source:AppleSource = new AppleSource();var bounds:Object = source.getBounds(source);var mat:Matrix = new Matrix();mat.translate(-bounds.x,-bounds.y);var buffer:BitmapData = new BitmapData(source.width+1, source.height+1, true, 0);buffer.draw(source,mat);var bitmapApple:BitmapApple;for (var i:int = 0; i< MAX_NUM; i++){bitmapApple = new BitmapApple(buffer);holderVector[i] = bitmapApple;holder.addChild(bitmapApple);}Yalnızca önbelleğe alınmış tek bir bitmap bellekte kullanıldığından ve bütün BitmapApple örnekleri tarafındanpaylaşıldığından bu teknik az miktarda bellek kullanır. Ek olarak, BitmapApple örneklerine yapılan alfa, döndürmeve ölçeklendirme gibi herhangi bir değişime rağmen, orijinal kaynak bitmap’i asla güncellenmez. Bu tekniğinkullanımı performansta yavaşlamayı önler.Düzgün bir bitmap sonucu için, smoothing özelliğini true değerine ayarlayın:public function BitmapApple(buffer:BitmapData){super (buffer);smoothing = true;addEventListener(Event.ADDED_TO_STAGE, activation);addEventListener(Event.REMOVED_FROM_STAGE, deactivation);}Sahne Alanı kalitesini ayarlamak da performansı iyileştirebilir. Sahne Alanı kalitesini, rasterleştirmeden önce HIGHdeğerine ayarlayın ve sonrasında LOW değerine geçin.
  • 67. 63FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011import org.bytearray.bitmap.BitmapApple;const MAX_NUM:int = 100;var holder:Sprite = new Sprite();addChild ( holder );var holderVector:Vector.<BitmapApple> = new Vector.<BitmapApple>(MAX_NUM, true);var source:AppleSource = new AppleSource();var bounds:Object = source.getBounds ( source );var mat:Matrix = new Matrix();mat.translate ( -bounds.x, -bounds.y );var buffer:BitmapData = new BitmapData ( source.width+1, source.height+1, true, 0 );stage.quality = StageQuality.HIGH;buffer.draw ( source, mat );stage.quality = StageQuality.LOW;var bitmapApple:BitmapApple;for (var i:int = 0; i< MAX_NUM; i++ ){bitmapApple = new BitmapApple( buffer );holderVector[i] = bitmapApple;holder.addChild ( bitmapApple );}Sahne Alanı kalitesinin bitmap’e vektörü çizdikten önce ve sonra değiştirilmesi, ekranda kenarları yumuşatılmış içerikelde etmek için kullanışlı bir teknik olabilir. Bu teknik son sahne alanı kalitesinden bağımsız olarak etkili olabilir.Örneğin Sahne Alanı kalitesi LOW olarak ayarlıyken bile kenarları yumuşatılmış metin ile beraber kenarlarıyumuşatılmış bitmap alabilirsiniz. Bu teknik cacheAsBitmap özelliği ile kullanılmaz. Bu durumda, Sahne Alanıkalitesinin LOW olarak ayarlanması, bellekteki yüzeyleri ve son kaliteyi güncelleyen vektör kalitesini günceller.Davranışları yalıtmaEvent.ENTER_FRAME olayı gibi olayları mümkün olduğunca tek bir işleyicide ayırın.Kod, Apple sınıfındaki Event.ENTER_FRAME olayının tek bir işleyicide yalıtılmasıyla daha da en iyileştirilebilir. Buteknik işlemci kaynaklarını korur. Aşağıdaki örnekte BitmapApple sınıfının hareket davranışını işlemediği farklıyaklaşım gösterilmektedir:
  • 68. 64FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011package org.bytearray.bitmap{import flash.display.Bitmap;import flash.display.BitmapData;public class BitmapApple extends Bitmap{private var destinationX:Number;private var destinationY:Number;public function BitmapApple(buffer:BitmapData){super (buffer);smoothing = true;}}Aşağıdaki kod elmaları örnekler ve hareketlerini tek bir işleyicide işler:import org.bytearray.bitmap.BitmapApple;const MAX_NUM:int = 100;var holder:Sprite = new Sprite();addChild(holder);var holderVector:Vector.<BitmapApple> = new Vector.<BitmapApple>(MAX_NUM, true);var source:AppleSource = new AppleSource();var bounds:Object = source.getBounds(source);var mat:Matrix = new Matrix();mat.translate(-bounds.x,-bounds.y);stage.quality = StageQuality.BEST;var buffer:BitmapData = new BitmapData(source.width+1,source.height+1, true,0);buffer.draw(source,mat);stage.quality = StageQuality.LOW;var bitmapApple:BitmapApple;for (var i:int = 0; i< MAX_NUM; i++){bitmapApple = new BitmapApple(buffer);bitmapApple.destinationX = Math.random()*stage.stageWidth;bitmapApple.destinationY = Math.random()*stage.stageHeight;holderVector[i] = bitmapApple;holder.addChild(bitmapApple);}stage.addEventListener(Event.ENTER_FRAME,onFrame);
  • 69. 65FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011var lng:int = holderVector.lengthfunction onFrame(e:Event):void{for (var i:int = 0; i < lng; i++){bitmapApple = holderVector[i];bitmapApple.alpha = Math.random();bitmapApple.x -= (bitmapApple.x - bitmapApple.destinationX) *.5;bitmapApple.y -= (bitmapApple.y - bitmapApple.destinationY) *.5;if (Math.abs(bitmapApple.x - bitmapApple.destinationX ) < 1 &&Math.abs(bitmapApple.y - bitmapApple.destinationY ) < 1){bitmapApple.destinationX = Math.random()*stage.stageWidth;bitmapApple.destinationY = Math.random()*stage.stageHeight;}}}Sonuç, her elmayı hareket ettiren 200 işleyici yerine hareketi işleyen tek bir Event.ENTER_FRAME olayıdır.Animasyonun tamamı kolayca durdurulabilir; bu durum da bir oyunda kullanışlı bir özelliktir.Örneğin, basit bir oyun aşağıdaki işleyiciyi kullanabilir:stage.addEventListener(Event.ENTER_FRAME, updateGame);function updateGame (e:Event):void{gameEngine.update();}Bir sonraki adım, elmaların fare veya klavye ile etkileşime girmesini sağlamaktır, bu da BitmapApple sınıfındadeğişiklikler yapılmasını gerektirir.package org.bytearray.bitmap{import flash.display.Bitmap;import flash.display.BitmapData;import flash.display.Sprite;public class BitmapApple extends Sprite{public var destinationX:Number;public var destinationY:Number;private var container:Sprite;private var containerBitmap:Bitmap;public function BitmapApple(buffer:BitmapData){container = new Sprite();containerBitmap = new Bitmap(buffer);containerBitmap.smoothing = true;container.addChild(containerBitmap);addChild(container);}}
  • 70. 66FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011Sonuçta geleneksel Sprite nesnelerine benzer etkileşimli BitmapApple örnekleri elde edilir. Ancak, örneklergörüntüleme nesnelerinin yüzeyleri dönüştürüldüğünde yeniden örneklenmeyen tek bir bitmap’e bağlıdır.Metin nesnelerinin oluşturulmasıMetin oluşturma performansını iyileştirmek için bitmapleri arabelleğe alma özelliğini ve opaqueBackgroundözelliğini kullanın.Flash Metin Motoru bazı mükemmel en iyileştirmeler sağlar. Ancak, bazı sınıfların tek bir metin satırı göstermesibeklenir. Bu sebepten dolayı, TextLine sınıfı ile düzenlenebilir bir metin alanı oluşturmak oldukça büyük miktardabellek ve ActionScript kod satırı gerektirir. TextLine sınıfının en iyi kullanımı, daha hızlı oluşturmanın sağlanabilmesive daha az bellek gerektirmesinden dolayı statik ve düzenlenebilir olmayan metin için olandır.Bitmapleri arabelleğe alma özelliği, oluşturma performansını iyileştirmek için vektör içeriğini bitmapler gibiarabelleğe almanıza olanak verir. Bu özellik karmaşık vektör içeriği için ve oluşturulması için işleme gerektiren metiniçeriğiyle kullanıldığında kullanışlıdır.Aşağıdaki örnek bitmaplerin arabelleğe alınması özelliğinin ve opaqueBackground özelliğinin oluşturmaperformansının iyileştirilmesi için nasıl kullanılabileceğini gösterir. Aşağıdaki resim kullanıcı bir şeyin yüklenmesinibeklerken görüntülenebilecek sıkça rastlanan bir Hoş Geldiniz ekranını gösterir.Hoş Geldiniz ekranıAşağıdaki resim TextField nesnesine programlanabilir bir şekilde uygulanan hareket hızını gösterir. Metin sahneninüst kısmından ortasına kadar yavaşça hareket eder.
  • 71. 67FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011Metnin hareket hızıAşağıdaki kod hareket hızını oluşturur. preloader değişkeni geçerli hedef nesneyi performansı düşüren özellikaramalarını azaltmak için depolar.wait_mc.addEventListener( Event.ENTER_FRAME, movePosition );var destX:Number=stage.stageWidth/2;var destY:Number=stage.stageHeight/2;var preloader:DisplayObject;function movePosition( e:Event ):void{preloader = e.currentTarget as DisplayObject;preloader.x -= ( preloader.x - destX ) * .1;preloader.y -= ( preloader.y - destY ) * .1;if (Math.abs(preloader.y-destY)<1)preloader.removeEventListener( Event.ENTER_FRAME, movePosition );}
  • 72. 68FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011Math.abs() işlevi daha fazla performans iyileştirilmesi almak ve işlev çağrılarının sayısını azaltmak için satır içinetaşınabilir. Sabit noktalı değerlere sahip olmak açısından destX ve destY özellikleri için int türünü kullanmak iyi biruygulamadır. Int türünün kullanılması değerleri Math.ceil() veya Math.round() gibi yavaş yöntemler üzerinden elile yuvarlamak zorunda kalmadan mükemmel piksel yapışma elde etmenize olanak tanır. Değerlerin sürekli olarakyuvarlanması nesnenin düzgün hareket etmesini engellediği için bu kod, koordinatları tamsayıya yuvarlamaz. Nesne,koordinatlar her karedeki en yakın yuvarlanmış tamsayıya yapıştığından aksak hareket edebilir. Ancak bu teknik, birgörüntü nesnesinin son konumunu ayarlarken kullanışlı olabilir. Aşağıdaki kodu kullanmayın:// Do not use this codevar destX:Number = Math.round ( stage.stageWidth / 2 );var destY:Number = Math.round ( stage.stageHeight / 2);Aşağıdaki kod çok daha hızlıdır:var destX:int = stage.stageWidth / 2;var destY:int = stage.stageHeight / 2;Önceki kod, değerlerin bölünmesi için bitsel geçiş sağlayan operatörlerin kullanımıyla daha da en iyileştirilebilir.var destX:int = stage.stageWidth >> 1;var destY:int = stage.stageHeight >> 1;Bitmapleri arabelleğe alma özelliği, çalışma zamanının nesneleri dinamik bitmapler kullanarak oluşturmasınıkolaylaştırır. Bu örnekte, TextField nesnesini içeren film klibi arabelleğe alınır:wait_mc.cacheAsBitmap = true;Performansı iyileştirmenin ek bir yolu alfa şeffaflığını kaldırmaktır. Alfa şeffaflığı, önceki koddaki gibi saydam bitmapgörüntüleri çizerken çalışma zamanının üzerine ek bir yük koyar. Onu devre dışı bırakmak için arka plan olarak birrenk belirleyerek opaqueBackground özelliğini kullanabilirsiniz.Bellekte oluşturulan bitmap yüzeyi opaqueBackground özelliğini kullanırken de 32 bit kullanır. Ancak, alfa uzaklıkdeğeri 255 olarak ayarlanır ve saydamlık kullanılmaz. Sonuç olarak, opaqueBackground özelliği bellek kullanımınıazaltmaz ancak bitmapleri arabelleğe alma özelliğini kullanırken oluşturma performansını iyileştirir. Aşağıdaki koden iyileştirmelerinin tümünü kapsar:wait_mc.addEventListener( Event.ENTER_FRAME, movePosition );wait_mc.cacheAsBitmap = true;// Set the background to the color of the scene backgroundwait_mc.opaqueBackground = 0x8AD6FD;var destX:int = stage.stageWidth >> 1;var destY:int = stage.stageHeight >> 1;var preloader:DisplayObject;function movePosition ( e:Event ):void{preloader = e.currentTarget as DisplayObject;preloader.x -= ( preloader.x - destX ) * .1;preloader.y -= ( preloader.y - destY ) * .1;if ( Math.abs ( preloader.y - destY ) < 1 )e.currentTarget.removeEventListener ( Event.ENTER_FRAME, movePosition );}Animasyon artık en iyileştirilmiştir ve saydamlığın kaldırılmasıyla bitmaplerin önbelleğe alınması da eniyileştirilmiştir. Mobil aygıtlarda, bitmap önbelleğe alma özelliğini kullanırken farklı animasyon durumlarında SahneAlanı kalitesini LOW ve HIGH olarak değiştirmeyi düşünün:
  • 73. 69FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011wait_mc.addEventListener( Event.ENTER_FRAME, movePosition );wait_mc.cacheAsBitmap = true;wait_mc.opaqueBackground = 0x8AD6FD;// Switch to low qualitystage.quality = StageQuality.LOW;var destX:int = stage.stageWidth>>1;var destY:int = stage.stageHeight>>1;var preloader:DisplayObject;function movePosition( e:Event ):void{preloader = e.currentTarget as DisplayObject;preloader.x -= ( preloader.x - destX ) * .1;preloader.y -= ( preloader.y - destY ) * .1;if (Math.abs(e.currentTarget.y-destY)<1){// Switch back to high qualitystage.quality = StageQuality.HIGH;preloader.removeEventListener( Event.ENTER_FRAME, movePosition );}}Ancak, bu durumda, Sahne Alanı kalitesinin değiştirilmesi çalışma zamanının geçerli Sahne Alanı kalitesiyle eşleşmesiiçin TextField nesnesinin bitmap yüzeyini yeniden oluşturmaya zorlar. Bu sebepten dolayı, bitmapleri arabelleğe almaözelliğini kullanırken Sahne Alanı kalitesini değiştirmemek en iyisidir.Burada bitmaplerin arabelleğe alınmasının elle yapılması gibi bir yaklaşım denenebilir. opaqueBackground özelliğinitaklit etmek için, film klibi saydam olmayan bir BitmapData nesnesine çizilebilir; bu çalışma zamanını bitmap yüzeyiniyeniden oluşturmaya zorlamaz.Bu teknik zamanla değişmeyen içerik için kullanışlıdır. Ancak, metin alanının içeriği değişebiliyorsa, farklı bir stratejikullanmayı deneyin. Örneğin, uygulamanın ne kadarının yüklendiğini temsil eden bir yüzde ile devamlı güncellenenbir metin alanı düşünün. Metin alanı veya onu içeren görüntüleme nesnesi bir bitmap olarak arabelleğe alınmışsa,yüzeyi içerik her değiştiğinde yeniden oluşturulmalıdır. Görüntüleme nesnesi içeriği devamlı değiştiği için buradabitmapleri el ile önbelleğe alamazsınız. Bu sürekli değişim, sizi BitmapData.draw() yöntemini önbelleğe alınmışbitmap’i güncellemek için el ile çağırmaya zorlayabilir.Flash Player 8’den (ve AIR 1.0) itibaren, Sahne Alanı kalitesinin değeri fark etmeksizin, oluşturması Okunabilirlik içinKenar Yumuşatma’ya ayarlı olan bir metin alanı eksiksiz bir şekilde kenar yumuşatmalı olarak kalır. Bu yaklaşım dahaaz bellek tüketir ancak daha fazla CPU işleme gerektirir ve bitmapleri arabelleğe alma özelliğine kıyasla daha yavaş biroluşturma sağlar.Aşağıdaki kod bu yaklaşımı kullanır:
  • 74. 70FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011wait_mc.addEventListener( Event.ENTER_FRAME, movePosition );// Switch to low qualitystage.quality = StageQuality.LOW;var destX:int = stage.stageWidth >> 1;var destY:int = stage.stageHeight >> 1;var preloader:DisplayObject;function movePosition ( e:Event ):void{preloader = e.currentTarget as DisplayObject;preloader.x -= ( preloader.x - destX ) * .1;preloader.y -= ( preloader.y - destY ) * .1;if ( Math.abs ( preloader.y - destY ) < 1 ){// Switch back to high qualitystage.quality = StageQuality.HIGH;preloader.removeEventListener ( Event.ENTER_FRAME, movePosition );}}Hareket halinde olan bir metin için bu seçeneği (Okunabilirlik için Kenar Yumuşatma) kullanmanız tavsiye edilmez.Metin ölçeklendirilirken, bu seçenek metnin hizalı kalmaya çalışmasına sebep olur, bu da bir kayma efekti yaratır.Ancak, görüntüleme nesnesinin içeriği devamlı değişiyorsa ve ölçeklendirilmiş bir metne ihtiyacınız varsa, kaliteyi LOWolarak ayarlayarak mobil uygulamalarda performansı artırabilirsiniz. Hareket bittiğinde kaliteyi yeniden HIGH olarakdeğiştirin.GPUFlash Player uygulamalarında GPU oluşturmaFlash Player 10.1’in önemli yeni bir özelliği de GPU’yu mobil aygıtlarda grafik içeriği oluşturmak içinkullanabilmesidir. Geçmişte grafikler yalnızca işlemci üzerinden oluşturulurdu. GPUnun kullanılması filtrelerin,bitmaplerin, videonun ve metnin oluşturulmasını en iyileştirir. GPU ile oluşturmanın yazılım ile oluşturmak kadardoğru sonuç vermeyebileceğini unutmayın. Donanım oluşturucusunu kullanırken içerik kesik kesik görünebilir. Bunaek olarak Flash Player 10.1’de, ekrandaki Pixel Bender efektlerinin oluşturulmasını önleyebilecek bir kısıtlama vardır.Bu efektler donanım hızlandırma kullanılırken siyah bir kare şeklinde oluşturulabilir.Flash Player 10 bir GPU hızlandırma özelliğine sahip olsa da, GPU, grafik hesaplamak için kullanılmıyordu. Yalnızcabütün grafikleri ekrana göndermek için kullanılıyordu. Flash Player 10.1’de GPU, grafikleri hesaplamak için dekullanılır ve bu da oluşturma hızında çok büyük bir iyileştirme sağlar. Ayrıca işlemci iş yükünü azaltır ve bu durum damobil aygıtlar gibi kısıtlı kaynak sahibi aygıtlar için fayda sağlar.En iyi performans için, mobil aygıtlarda içerik çalıştırılırken GPU modu otomatik olarak ayarlanır. wmode öğesininartık gpu değerine ayarlanması gerekmiyorsa, GPU oluşturmasını almak için wmode öğesinin opaque veyatransparent olarak ayarlanması GPU hızlandırmasını devre dışı bırakır.Not: Masaüstünde Flash Player, yazılım oluşturmayı gerçekleştirmek için işlemciyi kullanır. Sürücüler, masaüstüne görebüyük çapta farklılık gösterdiği için yazılım oluşturucusu kullanılır ve oluşturma farklarını arttırabilirler. Masaüstü vebazı mobil aygıtlar arasında da oluşturma farkları olabilir.
  • 75. 71FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011Mobil AIR uygulamalarında GPU oluşturmaUygulama tanımlayıcısına <renderMode>gpu</renderMode> ekleyerek AIR uygulamasında donanım grafiğihızlandırmayı etkinleştirin. Çalışma zamanında oluşturma modlarını değiştiremezsiniz. Masaüstü bilgisayarlarda,renderMode ayarı yoksayılır; GPU grafik hızlandırma şu anda desteklenmez.GPU oluşturma modu sınırlamalarıAIR 2.5te GPU oluşturma modu kullanılırken aşağıdaki sınırlamalar vardır:• GPU bir nesne oluşturamazsa, görüntülenmez. İşlemci oluşturmaya yönelik bir dezavantaj yoktur.• Şu karışım modları desteklenmez: katman, alfa, silme, kaplama, sert ışık, açıklaştırma ve koyulaştırma.• Filtreler desteklenmez.• PixelBender desteklenmez.• Birçok GPU birimi, maksimum 1024x1024 doku boyutuna sahiptir. ActionScriptte bu, tüm dönüştürmelerdensonra bir görüntüleme nesnesinin maksimum son oluşturulmuş boyutuna çevrilir.• Adobe, video oynatan AIR uygulamalarında GPU oluşturma modunun kullanılmasını önermez.• GPU oluşturma modunda, sanal klavye açıldığında metin alanları her zaman görünür bir konuma taşınmaz.Kullanıcı metin girerken metin alanınızın görünür olmasını sağlamak için aşağıdakilerden birini yapın. Ekranın üstyarısına metin alanını yerleştirin veya odak geldiğinde ekranın üst yarısından metin alanını taşıyın.• GPU oluşturma modu, modun güvenilir şekilde çalışmadığı bazı aygıtlar için devre dışıdır. En son bilgiler için AIRgeliştiricisinin yayın notlarına bakın.GPU oluşturma modu en iyi uygulamalarıAşağıdaki yönergeler, GPU oluşturmayı hızlandırabilir:• Sahne alanında görünen öğelerin sayısını sınırlandırın. Her öğenin görüntülenmesi ve etrafındaki diğer öğelerlebirleştirilmesi biraz zaman alır. Bir görüntüleme nesnesini artık görüntülemek istemediğinizde, visible özelliğinifalse olarak ayarlayın. Sahne dışına sürüklemeyin, başka bir nesnenin arkasına gizlemeyin veya alpha özelliğini0a ayarlamayın. Görüntüleme nesnesi artık gerekmiyorsa, görüntüleme nesnesini removeChild() öğesiyle sahnealanından kaldırın.• Nesneleri oluşturmak ve imha etmek yerine yeniden kullanın.• Bitmapleri 2n x 2m bite yakın fakat bundan az olmayacak boyutlarda yapın. Boyutlar 2nin tam kuvvetleri olmakzorunda değilse de, daha büyük olmamak koşuluyla 2nin kuvvetlerine yakın olmalıdır. Örneğin, 31x15 piksellik birgörüntü 33x17 piksellik bir görüntüden daha hızlı oluşturulur. (31 ve 15, 2nin kuvvetleri 32 ve 16dan dahaküçüktür.)• Mümkünse, Graphic.beginBitmapFill() yöntemini kullanırken repeat parametresini false olarak ayarlayın.• Fazladan çizim yapmayın. Arka plan olarak arka plan rengini kullanın. Büyük şekilleri birbirinin üstünekatmanlandırmayın. Çizilen her piksel yük oluşturur.• Uzun ve ince çivileri, birbirini kesen kenarları veya kenarlarında çok sayıda ince detayı bulunan şekillerden kaçının.Bu şekillerin görüntülenmesi düz kenarlı ekran nesnelerinden daha uzun sürer.• Görüntüleme nesnelerinin boyutunu sınırlandırın.• Grafikleri sık sık güncellenmeyen görüntüleme nesneleri için cacheAsBitMap ve cacheAsBitmapMatrix öğelerinietkinleştirin.• Grafik oluşturmak için ActionScript çizim APIsini (Grafik sınıfı) kullanmamaya çalışın. Mümkünse, bu nesnelerigeliştirme zamanında statik olarak oluşturun.
  • 76. 72FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011• Bitmap varlıklarını içe aktarmadan önce son boyutuna ölçeklendirin.Mobil AIR 2.0.3te GPU oluşturma moduGPU oluşturma, Packager for iPhone ile oluşturulan mobil AIR uygulamalarında daha kısıtlayıcıdır. GPU yalnızcacacheAsBitmap özelliği düzgün şekilde ayarlanmış olan bitmapler, katı şekiller ve görüntüleme nesneleri içinetkilidir. AyrıcacacheAsBitmap ve cacheAsBitmapMatrix öğeleri ayarlanmış olan nesneler için GPU, döndürülenveya ölçeklendirilen nesneler oluşturabilir. GPU diğer görüntüleme nesneleri için kademeli kullanılır ve bu genellikledüşük oluşturma performansıyla sonuçlanır.GPU ile oluşturma performansını en iyi duruma getirmek için ipuçlarıGPU ile oluşturma, SWF içeriğinin performansını büyük ölçüde geliştirse de, içeriğin tasarımı önemli bir role sahiptir.Geçmişte yazılım ile oluşturmada düzgün bir biçimde çalışan ayarların bazen GPU ile oluşturmada düzgünçalışmadığını unutmayın. Aşağıdaki ipuçları, yazılım ile oluşturmada performans başarısızlığına maruz kalmadanGPU ile oluşturmada iyi bir performansa ulaşmanıza yardımcı olabilir.Not: Donanımla oluşturmayı destekleyen mobil aygıtlar genellikle SWF içeriğine webden erişir. Bu nedenle, tümekranlarda en iyi deneyimin sağlandığından emin olmak için SWF içeriği oluştururken bu ipuçlarını göz önündebulundurmak iyi bir uygulamadır.• HTML gömme parametrelerinde wmode=transparent veya wmode=opaque kullanmaktan kaçının. Bu modlarperformansın düşmesine neden olabilir. Bunlar ayrıca yazılımla ve donanımla oluşturmada ses-videosenkronizasyonunda küçük bir kayba neden olabilirler. Ayrıca, bu modlar etkin olduğunda birçok platform GPUile oluşturmayı desteklemez ve bu performansı önemli derecede düşürür.• Yalnızca normal ve alfa harmanlama modlarını kullanın. Diğer harmanlama modlarını, özellikle katmanharmanlama modunu kullanmaktan kaçının. Tüm harmanlama modları GPU ile oluşturulduğunda tam olarakyeniden oluşturulamaz.• GPU vektör grafikleri oluşturduğunda, bunları çizmeden önce küçük üçgenlerden oluşan ağlara böler. Bu işlememozaik oluşturma denir. Mozaik oluşturma işlemi performansın biraz düşmesine neden olur ve bu düşüş şeklinkarmaşıklığı arttıkça fazlalaşır. Performansa olan etkisini azaltmak için GPU ile oluşturmanın her karede mozaikoluşturduğu biçim şekillerinden kaçının.• Kendi kendine kesişen eğrilerden, çok ince kavisli alanlardan (ince bir yeni ay gibi) ve bir şeklin kenarlarındakarışık ayrıntılardan kaçının. Bu şekiller, GPUnun bunları üçgen ağlara mozaik olarak dönüştürmesi için çokkarmaşıktır. Nedenini anlamak için iki vektör düşünün: 500 X 500 kare ve 100 X 10 yeni ay. Bir GPU büyük kareyikolaylıkla oluşturabilir çünkü yalnızca iki üçgenden oluşur. Ancak, bir yeni ayın kavisini açıklamak için birçoküçgen gerekir. Bu nedenle, daha az piksel içerse de bu şekli oluşturmak daha karışık bir işlemdir.• Ölçekte büyük değişikliklerden kaçının. Bu tür değişiklikler GPUnun grafikleri tekrar mozaiğe çevirmesine nedenolabilir.• Mümkün olduğunda fazla çizimden kaçının. Fazla çizim, birbirlerini gizlemelerini sağlamak için birden fazla grafiköğesini katman olarak kullanmaktır. Yazılımla oluşturma kullanıldığında her piksel yalnızca bir kez çizilir. Bunedenle, yazılımla oluşturma için piksel konumunda ne kadar grafik öğenin birbirini kapattığına bakılmaksızınuygulama, performans düşüklüğüne maruz kalmaz. Aksine, donanım oluşturucu, diğer öğeler o bölgeyi kapatsa dakapatmasa da her öğe için tüm pikselleri çizer. İki dikdörtgen çakışıyorsa, yazılım oluşturucu bölgeyi yalnızca birkere çizerken donanım oluşturucu ise çakışan bölgeyi iki kere çizer.Bu nedenle, yazılım oluşturucuyu kullanan masaüstünde normal olarak fazla çizimin performans üzerindeyapacağı etkiyi hissetmezsiniz. Ancak, birçok çakışan şekil, GPU ile oluşturmayı kullanan aygıtlarda performansıters bir şekilde etkileyebilir. Nesneleri gizlemek yerine görüntüleme listesinden kaldırmak iyi bir uygulamadır.
  • 77. 73FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011• Arka plan olarak büyük bir doldurulmuş dikdörtgen kullanmaktan kaçının. Bunun yerine Sahne Alanının arkaplan rengini ayarlayın.• Mümkün olduğunda bitmap yinelemenin varsayılan dolgu modundan kaçının. Daha iyi performans elde etmekiçin bunun yerine bitmap kenetleme modunu kullanın.Eş zamanlı olmayan işlemlerKullanılabildiğinde, işlemlerin eş zamanlı olanları yerine eş zamanlı olmayan versiyonlarını kullanmayı tercih edin.Senkronize işlemler, kodunuz tarafından belirtilir belirtilmez çalışır ve kod, devam etmeden önce bu işlemlerintamamlanmasını bekler. Sonuç olarak, işlemler kare döngüsünün uygulama kodu aşamasında çalışır. Senkronizeolmayan bir işlem fazla uzun sürerse, kare döngüsünün boyutunu uzatır, böylece potansiyel olarak görüntününkilitlenmiş veya kesilmiş gibi görünmesine yol açar.Kodunuz senkronize olmayan bir işlem çalıştırırken, hemen çalışmayabilir. Geçerli çalıştırma iş parçacığındakikodunuz ve diğer uygulama kodları çalıştırılmaya devam eder. Ardından çalışma zamanı, bir yandan oluşturmasorunlarını önlemeye çalışırken, işlemi mümkün olduğunca çabuk gerçekleştirir. Bazı durumlarda, çalıştırma arkaplanda gerçekleşir ve hiç bir şekilde çalışma zamanı kare döngüsünün bir parçası olarak çalışmaz. Son olarak, işlembittiğinde çalışma zamanı bir olay gönderir ve kodunuz o olayı daha fazla iş yapmak için dinleyebilir.Oluşturma sorunlarının önlenmesi için, senkronize olmayan işlemler programlanır ve bölünür. Bundan dolayı,işlemlerin senkronize olmayan versiyonlarını kullanan ve buna göre yanıt veren bir uygulamaya sahip olmak çok dahakolaydır. Daha fazla bilgi için bkz. “Algılanan performans ile gerçek performansın karşılaştırılması” sayfa 2.Ancak, eş zamanlı olarak çalışmayan işlemlerde ek yük vardır. Gerçek yürütme zamanı, eş zamanlı olmayanişlemlerde, özellikle tamamlanması kısa süren işlemlerde daha uzun olabilir.Çalışma zamanında, bir çok işlem yapısı gereği senkronizedir veya değildir ve onların çalıştırılma şeklinibelirleyemezsiniz. Ancak, Adobe AIR’de, senkronize olan veya olmayan bir şekilde yapmayı seçebileceğiniz üç işlemtürü vardır.• File ve FileStream sınıfı işlemleriFile sınıfının bir çok işlemi senkronize olan veya olmayan bir şekilde yapılabilir. Örneğin, bir dosya veya dizininkopyalanması veya silinmesi ve bir dizinin içeriğinin listelenmesi gibi işlemlerin senkronize olmayan versiyonlarıda vardır. Bu yöntemlerin eş zamanlı olmayan sürümlerinin adında “Async” soneki vardır. Örneğin, bir dosyayısenkronize olmayan bir şekilde silmek için, File.deleteFile() yöntemi yerine File.deleteFileAsync()yöntemini çağırın.Bir dosyadan okumak veya dosyaya yazmak için FileStream nesnesini kullandığınızda, FileStream nesnesini açışşekliniz işlemlerin senkronize olmayan bir şekilde çalışıp çalışmadığını belirler. Senkronize olmayan işlemler içinFileStream.openAsync() yöntemini kullanın. Veri yazma işlemi senkronize olmayan bir şekilde yapılır. Veriokuma parçalar halinde yapılır, bu yüzden veri bir seferde bir bölüm olarak mevcut olur. Bunun tersine, senkronizemodda FileStream nesnesi kodun çalışması devam etmeden önce dosyanın tamamını okur.• Yerel SQL veritabanı işlemleri
  • 78. 74FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011Yerel bir SQL veritabanıyla çalışırken, bir SQLConnection nesnesi üzerinden çalıştırılan tüm işlemler senkronizeolan veya olmayan modda çalışır. İşlemlerin senkronize olmayan şekilde çalışmasını belirlemek için,SQLConnection.open() yöntemi yerine SQLConnection.openAsync() yöntemini çağırarak veritabanına olanbağlantıyı açın. Veritabanı işlemleri senkronize olmayan bir şekilde çalıştığında, arka planda çalışır. Veritabanımotoru asla çalışma zamanı kare döngüsünde çalışmaz, bu nedenle veritabanı işlemlerinin oluşturma sorunlarınaneden olması çok daha düşük bir olasılıktır.Yerel SQL veritabanıyla performansı iyileştirmeye yönelik ek stratejiler için bkz. “SQL veritabanı performansı”sayfa 87.• Ayrı Pixel Bender gölgelendiricileriShaderJob sınıfı Pixel Bender gölgelendiricisi üzerinden bir görüntüyü veya veri kümesini çalıştırmanıza ve ortayaçıkan ham verilere erişmenize olanak tanır. Varsayılan olarak, ShaderJob.start() yöntemini çağırdığınızda,gölgelendirici senkronize olmayan bir şekilde çalışır. Çalıştırma işlemi arka planda, çalışma zamanı karedöngüsünü kullanmadan gerçekleşir. ShaderJob nesnesini senkronize bir şekilde çalışmaya zorlamak için(önerilmez), true değerini start() yönteminin ilk parametresine iletin.Kodun senkronize olmayan şekilde çalıştırılmasına yönelik bu dahili mekanizmalara ek olarak, kendi kodunuzusenkronize yerine senkronize olmayan bir biçimde çalışacak şekilde yapılandırabilirsiniz. Uzun çalışabilecek bir göreviyerine getirecek bir kod yazıyorsanız, kodunuzu parçalar halinde çalışacak şekilde yapılandırabilirsiniz. Kodunuzuparçalara bölmeniz, çalışma zamanının oluşturma işlemlerini kod çalıştırma bloklarınızın aralarında yapmasını,böylece oluşturma sorunlarının meydana gelme olasılığının düşmesini sağlayabilir.Kodunuzu bölmeye yönelik bazı teknikler daha sonraki bölümlerde listelenmiştir. Bu tekniklerin ardında yatan anafikir, kodunuzun herhangi bir zamanda işinin yalnızca bir kısmını yapacak şekilde yazılmasıdır. Kodun ne yaptığınıve nerede çalışmayı kestiğini takip edersiniz. Yapılacak iş kalıp kalmadığını devamlı kontrol etmek için Timer nesnesigibi bir mekanizma kullanın ve ek işi, iş tamamlanana kadar parçalar halinde yapın.Kodu işi bu şekilde bölmek amacıyla yapılandırmak için kurulmuş birkaç yapı vardır. Aşağıdaki makaleler ve kodkütüphaneleri bu yapıları açıklar ve uygulamalarınıza eklemenize yardımcı olmak için gerekli kodu sağlar.• Asynchronous ActionScript Execution (ActionScript’in Senkronize Olmayan Şekilde Çalıştırılması) (TrevorMcCauley tarafından bazı uygulama örneklerinin yanı sıra daha fazla arka plan ayrıntısı ile hazırlanmış bir makale)• Parsing & Rendering Lots of Data in Flash Player (Flash Player’da Bir Çok Verinin Ayrıştırılması & Oluşturulması)(Jesse Warden tarafından arka plan ayrıntıları ve “oluşturucu deseni” ve “yeşil parçacıklar” adlı iki yaklaşımınörnekleri ile yazılmış bir makale)• Green Threads (Yeşil Parçacıklar) (Drew Cummins tarafından yazılmış, örnek kaynak kod ile “yeşil parçacıklar”tekniğini açıklayan bir makale)• greenthreads (ActionScript’te “yeşil parçacıklar”ın uygulanması için Charlie Hubbard tarafından hazırlanmış açıkkaynaklı bir kod kütüphanesi. Daha fazla bilgi için bkz. greenthreads Quick Start (yeşil parçacıklar HızlıBaşlangıç).)• ActionScript 3teki İş Parçacıkları: http://www.adobe.com/go/learn_fp_as3_threads_tr (“sahte iş parçacığıoluşturma” tekniğinin örnek uygulamasını da içeren bir Alex Harui makalesi)Saydam pencerelerAIR masaüstü uygulamalarında, saydam bir pencere yerine opak ve dikdörtgen bir uygulama penceresi kullanmayıgöz önünde bulundurun.
  • 79. 75FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011AIR masaüstü uygulamasının ilk penceresi için opak bir pencere kullanmak üzere, uygulama açıklayıcı XMLdosyasında aşağıdaki değeri ayarlayın:<initialWindow><transparent>false</transparent></initialWindow>Uygulama kodu tarafından oluşturulan pencereler için, transparent özelliği false (varsayılan) olarak ayarlı birNativeWindowInitOptions nesnesi oluşturun. Bu öğeyi, NativeWindow nesnesini oluştururken NativeWindowyapıcısına iletin:// NativeWindow: flash.display.NativeWindow classvar initOptions:NativeWindowInitOptions = new NativeWindowInitOptions();initOptions.transparent = false;var win:NativeWindow = new NativeWindow(initOptions);Bir Flex Window bileşeni için, open() yöntemini çağırmadan önce, bileşenin saydamlık özelliğinin false değerine(varsayılan) ayarlı olduğundan emin olun.// Flex window component: spark.components.Window classvar win:Window = new Window();win.transparent = false;win.open();Saydam bir pencere kullanıcının masaüstünün bir kısmını veya uygulama penceresinin arkasındaki diğer uygulamapencerelerini gösterebilecek özelliğe sahiptir. Bu nedenle, çalışma zamanı saydam bir pencereyi oluşturmak için dahafazla kaynak kullanır. Dikdörtgen olup saydam olmayan bir pencere, işletim sistemi kromu veya özel krom kullanmasıfark etmeksizin, aynı oluşturma yüküne sahip olmaz.Yalnızca dikdörtgen olmayan bir görüntüye sahip olmanızın veya arka plan içeriğinin uygulama pencerenizin içindengörünür olmasının önemli olması durumunda saydam bir pencere kullanın.Vektör şekli düzleştirmeGörüntü oluşturma performansını artırmak için şekilleri düzleştirir.Bitmaplerin aksine, görüntü oluşturma vektörü içeriği özellikle birçok kontrol noktası içeren degradeler ve karmaşıkyollar için olmak üzere birçok hesaplama gerektirir. Bir tasarımcı veya geliştirici olarak şekillerin yeteri kadar en iyihale getirildiğinden emin olun. Aşağıdaki şekilde, birçok kontrol noktasına sahip basitleştirilmemiş yollargösterilmektedir:
  • 80. 76FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEPerformans oluşturmaSon güncelleme 30/3/2011En iyileştirilmemiş yollarFlash Professionaldaki Düzgünleştirme aracını kullanarak fazladan kontrol noktalarını kaldırabilirsiniz. Buna eşdeğerbir araç Adobe® Illustrator® uygulamasında da mevcuttur ve toplam nokta ve yol sayısı Belge Bilgisi panelindegörülebilir.Düzgünleştirme, fazladan kontrol noktalarını kaldırır, SWF dosyasının son boyutunu azaltır ve görüntü oluşturmaperformansını artırır. Sonraki şekil, düzgünleştirme işleminden sonraki aynı yolları göstermektedir:En iyileştirilmiş yollarYolları gereğinden fazla basitleştirmediğiniz sürece, bu en iyileştirme işlemi görsel olarak herhangi bir şeyideğiştirmez. Ancak, karmaşık yolları basitleştirerek son uygulamanızın ortalama kare hızını büyük ölçüdeartırabilirsiniz.
  • 81. 77Son güncelleme 30/3/2011Bölüm 6: Ağ etkileşimini en iyileştirmeAğ etkileşimi için geliştirmelerFlash Player 10.1 ve AIR 2.5 tüm platformlarda ağ en iyileştirme için dairesel arabelleğe alma ve akıllı aramanın dadahil olduğu yeni bir özellikler kümesi sunar.Dairesel arabelleğe almaMobil aygıtlarda medya içeriği yüklerken, bir masaüstü bilgisayardan asla beklemeyeceğiniz sorunlarlakarşılaşabilirsiniz. Örneğin, disk alanı veya belleğiniz dolabilir. Video yüklerken, Flash Player 10.1 ve AIR 2.5inmasaüstü sürümü FLV dosyasının (veya MP4 dosyasının) tamamını indirir ve önbelleğe alır. Sonra çalışma zamanı,videoyu o önbellek dosyasından oynatır. Disk alanının dolması olağan değildir. Böyle bir durum gerçekleşirse,masaüstü çalışma zamanı, videonun oynatılmasını durdurur.Bir mobil aygıtın disk alanının dolması daha kolaydır. Aygıtın disk alanı dolarsa, çalışma zamanı, masaüstü çalışmazamanındaki olduğu gibi oynatmayı durdurmaz. Onun yerine çalışma zamanı, önbellek dosyasına dosyanın başındanitibaren yeniden yazarak onu yeniden kullanmaya başlar. Kullanıcı videoyu izlemeye devam edebilir. Kullanıcıvideonun üzerine yazılan kısmında dosyanın başı hariç arama yapamaz. Dairesel arabelleğe alma varsayılan olarakbaşlatılmaz. Bu oynatma sırasında ve ayrıca film disk alanından veya RAMden daha büyükse oynatmanın başındanbaşlatılabilir. Çalışma zamanının dairesel arabelleğe almayı kullanabilmesi için en az 4 MB RAM veya 20 MB diskalanına ihtiyacı vardır.Not: Aygıt yeterli disk alanına sahipse, çalışma zamanının mobil sürümü masaüstü sürümüyle aynı davranışı sergiler.Şunu aklınızda tutun ki, cihaz bir diske sahip değilse veya disk doluysa RAMdeki arabellek bir geri dönüş olarakkullanılır. Derleme zamanında arabellek dosyasının ve RAM arabelleğinin boyutu için bir kısıtlama ayarlanabilir. BazıMP4 dosyaları oynatmanın başlatılmasından önce dosyanın tümünün indirilmesini gerektiren bir yapıya sahiptir.Çalışma zamanı bu dosyaları algılar, yeterli disk alanı yoksa indirmeyi önler ve MP4 dosyası oynatılamaz. O dosyalarınindirilmesini istememek en iyisi olabilir.Bir geliştirici olarak, aramanın yalnızca önbelleğe alınmış akışın sınırları dahilinde çalıştığını aklınızda tutun. Bazenuzaklık aralığın dışında olduğunda NetStream.seek() başarısız olur ve bu durumdaNetStream.Seek.InvalidTime olayı gönderilir.Akıllı aramaNot: Akıllı arama özelliği Adobe® Flash® Media Server 3.5.3 gerektirir.Flash Player 10.1 ve AIR 2.5, kullanıcının duraksız video oynatılırken yaşadığı deneyimi iyileştirilen akıllı arama adlıyeni bir davranış sunar. Kullanıcı arabellek sınırları dahilinde bir hedefi ararsa, çalışma zamanı anında aramayısağlamak için arabelleği yeniden kullanır. Çalışma zamanının önceki sürümlerinde, arabellek yenidenkullanılmıyordu. Örneğin, kullanıcı bir akış sunucusu üzerinden video oynatıyorsa, arabellek süresi 20 saniyeyeayarlıysa (NetStream.bufferTime ve kullanıcı 10 saniye ileriyi aratmayı denediyse, çalışma zamanı zaten yüklü olan10 saniyeyi yeniden kullanmak yerine arabellek verisinin tamamını atmıyordu. Bu davranış çalışma zamanınısunucudan çok daha sıkça yeni veri istemeye zorluyordu ve yavaş bağlantılarda zayıf oynatma performansına sebepoluyordu.Aşağıdaki şekilde, çalışma zamanının eski sürümünde ara belleğin nasıl davrandığı gösterilmektedir. bufferTimeözelliği önceden yüklenecek saniye sayısını belirler, böylece bağlantı kesilirse arabellek, video durdurulmadankullanılabilir.
  • 82. 78FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEAğ etkileşimini en iyileştirmeSon güncelleme 30/3/2011Akıllı arama özelliğinden önce arabellek davranışıAkıllı arama özelliğiyle çalışma zamanı şimdi kullanıcı videoyu temizlerken anında geri veya ileri arama sağlamak içinarabelleği kullanır. Aşağıdaki şekilde yeni davranış gösterilmektedir:Akıllı arama özelliği ile ileri aramaAkıllı arama özelliği ile geri aramaAkıllı arama, kullanıcı ileri veya geri arama yaptığında arabelleği yeniden kullanır, böylece oynatma deneyimi dahahızlı ve düzgün olur. Bu yeni davranışın faydalarından biri video yayıncıları için bant genişliği tasarrufudur. Ancakarama arabellek sınırlarının dışındaysa, standart davranış gerçekleşir ve çalışma zamanı sunucudan yeni veri ister.Not: Bu davranış aşamalı video indirmeye uygulanmaz.Akıllı aramayı kullanmak için, NetStream.inBufferSeek öğesini true değerine ayarlayın.Harici içerikUygulamanızı birden fazla SWF dosyasına bölün.Mobil cihazların ağa sınırlı erişimi olabilir. İçeriğinizi hızlı yüklemek için, uygulamanızı birden fazla SWF dosyasınabölün. Uygulamanın tamamında kod mantığını ve varlıkları yeniden kullanmaya çalışın. Örneğin, aşağıdaki şemadagösterildiği gibi, birden fazla SWF dosyasına bölünmüş bir uygulama düşünün.ArabellekOynatma kafasıArabellekOynatma kafasıArabellekOynatma kafası
  • 83. 79FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEAğ etkileşimini en iyileştirmeSon güncelleme 30/3/2011Birden çok SWF dosyasına bölünen uygulamaBu örnekte, her SWF dosyası aynı bitmap için kendi kopyasını içerir. Aşağıdaki şemanın gösterdiği gibi, bu çoğaltılmabir çalışma zamanı paylaşımlı kütüphane kullanılarak önlenebilir.Çalışma zamanı paylaşılan kütüphane kullanmaBu teknik kullanılarak, bitmap’in diğer SWF dosyaları tarafından kullanılabilir hale getirilmesi için bir çalışma zamanıpaylaşımlı kütüphane yüklenir. ApplicationDomain sınıfı yüklenen tüm sınıf tanımlarını saklar ve onlarıgetDefinition() yöntemi üzerinden çalışma zamanında kullanılabilir hale getirir.Ayrıca, bir çalışma zamanı paylaşımlı kütüphane kod mantığının tamamını içerebilir. Uygulamanın tamamı yenidenderlenmeden çalışma zamanında güncellenebilir. Aşağıdaki kod bir çalışma zamanı paylaşımlı kütüphane yükler veçalışma zamanında SWF dosyasına dahil edilen tanımı çıkarır. Bu teknik fontlar, bitmapler, sesler veya herhangi birActionScript sınıfıyla kullanılabilir.portfolio.swf10 KB 10 KBinfos.swf10 KBmain.swfToplam boyut 40 KBpreload.swf10 KBcontact.swfportfolio.swf infos.swfmain.swfToplam boyut 10KBpreload.swf10KBlibrary.swfcontact.swf
  • 84. 80FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEAğ etkileşimini en iyileştirmeSon güncelleme 30/3/2011// Create a Loader objectvar loader:Loader = new Loader();// Listen to the Event.COMPLETE eventloader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadingComplete );// Load the SWF fileloader.load(new URLRequest("library.swf") );var classDefinition:String = "Logo";function loadingComplete(e:Event ):void{var objectLoaderInfo:LoaderInfo = LoaderInfo ( e.target );// Get a reference to the loaded SWF file application domainvar appDomain:ApplicationDomain = objectLoaderInfo.applicationDomain;// Check whether the definition is availableif ( appDomain.hasDefinition(classDefinition) ){// Extract definitionvar importLogo:Class = Class ( appDomain.getDefinition(classDefinition) );// Instantiate logovar instanceLogo:BitmapData = new importLogo(0,0);// Add it to the display listaddChild ( new Bitmap ( instanceLogo ) );} else trace ("The class definition " + classDefinition + " is not available.");}Tanımın alınması yüklenen SWF dosyasının uygulama etki alanına sınıf tanımlarının yüklenmesiyle daha kolay halegetirilebilir.
  • 85. 81FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEAğ etkileşimini en iyileştirmeSon güncelleme 30/3/2011// Create a Loader objectvar loader:Loader = new Loader();// Listen to the Event.COMPLETE eventloader.contentLoaderInfo.addEventListener ( Event.COMPLETE, loadingComplete );// Load the SWF fileloader.load ( new URLRequest ("rsl.swf"), new LoaderContext ( false,ApplicationDomain.currentDomain) );var classDefinition:String = "Logo";function loadingComplete ( e:Event ):void{var objectLoaderInfo:LoaderInfo = LoaderInfo ( e.target );// Get a reference to the current SWF file application domainvar appDomain:ApplicationDomain = ApplicationDomain.currentDomain;// Check whether the definition is availableif (appDomain.hasDefinition( classDefinition ) ){// Extract definitionvar importLogo:Class = Class ( appDomain.getDefinition(classDefinition) );// Instantiate itvar instanceLogo:BitmapData = new importLogo(0,0);// Add it to the display listaddChild ( new Bitmap ( instanceLogo ) );} else trace ("The class definition " + classDefinition + " is not available.");}Yüklü SWF dosyasında mevcut olan sınıflar artık geçerli uygulama etki alanındaki getDefinition() yöntemiçağrılarak kullanılabilir. Ayrıca, sınıflara getDefinitionByName() yöntemini çağırarak da erişebilirsiniz. Bu teknikfontları ve büyük varlıkları yalnızca bir kere yükleyerek bant genişliğinden tasarruf sağlar. Varlıklar hiçbir zaman diğerSWF dosyalarına dışa aktarılmaz. Tek kısıtlama uygulamanın test edilmesinin ve loader.swf dosyası üzerindençalıştırılmasının gerekliliğidir. Bu dosya önce varlıkları yükler, sonra da uygulamayı oluşturan farklı SWF dosyalarınıyükler.Girdi çıktı hatalarıG/Ç hataları için olay işleyicileri ve hata mesajları sağlayın.Bir mobil cihazda, ağ yüksek hızlı İnternete bağlı bir masaüstü bilgisayarına kıyasla daha az güvenilir olabilir. Mobilcihazlarda harici içeriğe erişmenin iki sınırlaması vardır: kullanılabilirlik ve hız. Bundan dolayı, varlıkların hafifolmasını sağlayın ve kullanıcıya geri bildirim sağlamak için her IO_ERROR olayı için işleyiciler ekleyin.Örneğin, bir kullanıcının mobil aygıtında web sitenizi taradığını ve iki metro istasyonu arasında aniden ağbağlantısının kesildiğini hayal edin. Bağlantı koptuğunda dinamik bir varlık yükleniyordu. Masaüstünde, bir çalışmazamanı hatasının ortaya çıkmasını önlemek için böyle bir şey neredeyse hiçbir zaman gerçekleşmeyeceğinden boş birolay dinleyicisi kullanabilirsiniz. Ancak, mobil cihazda durumu basit bir boş dinleyiciden daha fazlası ile işlemenizgerekir.
  • 86. 82FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEAğ etkileşimini en iyileştirmeSon güncelleme 30/3/2011Aşağıdaki kod bir IO hatasına yanıt vermez. Onu burada gösterildiği gibi kullanmayın:var loader:Loader = new Loader();loader.contentLoaderInfo.addEventListener( Event.COMPLETE, onComplete );addChild( loader );loader.load( new URLRequest ("asset.swf" ) );function onComplete( e:Event ):void{var loader:Loader = e.currentTarget.loader;loader.x = ( stage.stageWidth - e.currentTarget.width ) >> 1;loader.y = ( stage.stageHeight - e.currentTarget.height ) >> 1;}Böyle bir hatayı işlemek ve kullanıcı için hata mesajı sağlamak daha iyi bir alışkanlıktır. Aşağıdaki örnek bunu düzgünbir şekilde işler:var loader:Loader = new Loader();loader.contentLoaderInfo.addEventListener ( Event.COMPLETE, onComplete );loader.contentLoaderInfo.addEventListener ( IOErrorEvent.IO_ERROR, onIOError );addChild ( loader );loader.load ( new URLRequest ("asset.swf" ) );function onComplete ( e:Event ):void{var loader:Loader = e.currentTarget.loader;loader.x = ( stage.stageWidth - e.currentTarget.width ) >> 1;loader.y = ( stage.stageHeight - e.currentTarget.height ) >> 1;}function onIOError ( e:IOErrorEvent ):void{// Show a message explaining the situation and try to reload the asset.// If it fails again, ask the user to retry when the connection will be restored}Kullanıcını içeriği yeniden yüklemesi için bir yol sunmak iyi bir uygulamadır. Bu davranış onIOError() işleyicisindeuygulanabilir.Flash RemotingEn iyileştirilmiş istemci sunucu arası veri iletişiminde Flash Remoting ve AMF kullanın.SWF dosyalarına uzaktan içerik yüklemek için XML kullanabilirsiniz. Ancak XML, çalışma zamanının yüklediği veayrıştırdığı düz metindir. XML en çok sınırlı bir içerik miktarı yükleyen uygulamalarda işe yarar. Yüksek miktardaiçerik yükleyen bir uygulama geliştiriyorsanız, Flash Remoting teknolojisi ve Action Message Format (AMF)kullanmayı deneyin.
  • 87. 83FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEAğ etkileşimini en iyileştirmeSon güncelleme 30/3/2011AMF, sunucu ve çalışma zamanı arasında verileri paylaşmaya yarayan ikili bir formattır. AMF kullanımı verininboyutunu düşürürken iletim hızını iyileştirir. AMF, çalışma zamanının yerel biçimi olduğundan çalışma zamanınaAMF verilerinin gönderilmesi, istemci tarafında yoğun bellek gerektiren serileştirme ve serileştirmeyi geri almaişlemlerinden kaçınmanızı sağlar. Uzaktan çağırma ağ geçidi bu görevleri işler. Bir ActionScript veri türünü sunucuyagönderirken, uzaktan çağırma ağ geçidi, serileştirmeyi sunucu tarafında sizin yerinize işler. Ağ geçidi ayrıca karşılıkgelen veri türünü de size gönderir. Bu veri türü çalışma zamanından çağrılabilecek bir yöntemler kümesini açıkbırakan sunucuda oluşturulan bir sınıftır. Flash Remoting ağ geçitleri; ZendAMF, FluorineFX, WebORB ve Adobe’ninresmi bir açık kaynak Java Flash Remoting ağ geçidi olan BlazeDS’i içerir.Aşağıdaki resimde Flash Remoting kavramı gösterilmektedir:Flash RemotingAşağıdaki örnekte bir Flash Remoting ağ geçidine bağlanmak için NetConnection sınıfı kullanılmaktadır:// Create the NetConnection objectvar connection:NetConnection = new NetConnection ();// Connect to a Flash Remoting gatewayconnection.connect ("http://www.yourserver.com/remotingservice/gateway.php");// Asynchronous handlers for incoming data and errorsfunction success ( incomingData:* ):void{trace( incomingData );}function error ( error:* ):void{trace( "Error occured" );}// Create an object that handles the mapping to success and error handlersvar serverResult:Responder = new Responder (success, error);// Call the remote methodconnection.call ("org.yourserver.HelloWorld.sayHello", serverResult, "Hello there ?");Bir uzaktan çağırma ağ geçidine bağlanmak kolaydır. Ancak, Flash Remotingi kullanmak Adobe® Flex® SDKye dahiledilen RemoteObject sınıfının kullanımıyla daha da basit bir hale getirilebilir.Not: Flex çerçevesindekiler gibi harici SWC dosyaları bir Adobe® Flash® Professional projesinin içinde kullanılabilir.SWC dosyalarının kullanımı Flex SDKnin geri kalanını kullanmadan RemoteObject sınıfını ve ona bağlı olan öğelerikullanmanıza olanak verir. Gelişmiş geliştiriciler gerektiğinde doğrudan ham Socket sınıfı üzerinden de bir uzaktançağırma ağ geçidi ile iletişim kurabilir.HTTPZendAMFWeb ORBRubyAMFFluorineFXBlazeDSHizmet(PHP Sınıfı,Java, C# ...)AMF
  • 88. 84FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEAğ etkileşimini en iyileştirmeSon güncelleme 30/3/2011Gereksiz ağ işlemleriVarlıkları yükledikten sonra, onları her ihtiyaç duyduğunuzda ağdan yüklemek yerine yerel olarak önbelleğe alın.Uygulamanız medya veya veri gibi varlıklar yüklerse, varlıkları yerel aygıta kaydederek önbelleğe alın. Seyrek değişenvarlıklar için, önbelleği belirli aralıklarla güncellemeyi göz önünde bulundurun. Örneğin, uygulamanız bir görüntüdosyasının yeni bir versiyonu olup olmadığını günde bir defa kontrol edebilir veya iki saatte bir yeni veri olupolmadığını kontrol edebilir.Varlıkları tür ve yapılarına bağlı olarak çeşitli yollardan önbelleğe alabilirsiniz.• Görüntüler ve video gibi medya varlıkları: Dosyaları File ve FileStream sınıflarını kullanarak dosya sisteminekaydedin• Bağımsız veri değerleri veya küçük veri kümeleri: değerleri SharedObject sınıfını kullanarak yerel paylaşılannesneler olarak kaydedin• Daha büyük veri kümeleri: verileri yerel bir veritabanına kaydedin veya serileştirip bir dosyaya kaydedinVeri değerlerinin önbelleğe alınması için, açık kaynaklı AS3CoreLib projesi adresinde yükleme ve önbelleğe almayısizin için yapan bir ResourceCache sınıfı mevcuttur.
  • 89. 85Son güncelleme 30/3/2011Bölüm 7: Medya ile çalışmaVideoMobil cihazlarda video performansını en iyileştirme hakkında bilgi için Adobe Developer Connection (AdobeGeliştirici Bağlantısı) web sitesinde Mobil aygıta teslim için web içeriğini en iyileştirme bölümüne bakın.Özellikle şu bölümlere bakın:• Mobil aygıtlarda video oynatma• Kod örnekleriBu bölümler mobil aygıtlara yönelik video oynatıcıları geliştirmek için aşağıdakiler gibi bilgileri içerir:• Video kodlama yönergeleri• En iyi uygulamalar• Video oynatıcının performans profili nasıl çıkarılır?• Referans video oynatıcısı uygulamasıStageVideoVideo oluşturmak üzere donanım hızlandırma avantajından yararlanmak için StageVideo sınıfını kullanın.StageVideo nesnesinin kullanımıyla ilgili bilgi için ActionScript 3.0 Geliştirici Kılavuzu içinde Donanım hızlandırmalıoluşturma için StageVideo sınıfını kullanma bölümüne bakın.SesFlash Player 9.0.115.0 ve AIR 1.0dan itibaren çalışma zamanı, AAC dosyalarını (AAC Ana, AAC LC ve SBR)oynatabilir. Mp3 dosyaları yerine AAC dosyaları kullanılarak basit bir en iyileştirme yapılabilir. AAC formatı, eşit bithızında mp3 formatından daha yüksek kalite ve daha küçük dosya boyutu sunar. Dosya boyutunu küçültmek bantgenişliğini korur; bu da yüksek hızlı İnternet bağlantısı sağlayamayan mobil aygıtlarda önemli bir etmendir.Donanım Ses Kod ÇözmeVideo kodu çözülmesine benzer olarak ses kodu çözülmesi de yüksek işlemci döngüleri gerektirir ve aygıttaki uygundonanıma güç aktararak en iyileştirilebilir. Flash Player 10.1 ve AIR 2.5, AAC dosyalarının (LC, HE/SBR profilleri)veya mp3 dosyalarının (PCM desteklenmez) kodları çözülürken performansı artırmak için donanım ses sürücülerinialgılayıp kullanabilir. İşlemci kullanımı büyük ölçüde azaltılır ve bu da daha az pil kullanımı ve işlemcinin diğerişlemler için kullanılabilmesini sağlar.Not: ACC biçimini kullanırken, ACC Ana profili çoğu aygıtta donanım desteğinin olmaması nedeniyle desteklenmez.
  • 90. 86FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEMedya ile çalışmaSon güncelleme 30/3/2011Donanımda ses kodu çözme işlevi kullanıcı ve geliştirici açısından saydamdır. Çalışma zamanı ses akışı oynatmayabaşladığında, videoda yaptığı gibi, ilk olarak donanımı denetler. Bir donanım sürücüsü mevcutsa ve ses formatıdestekleniyorsa, donanım ses kodu çözme işlevi çalışır. Ancak gelen ACC veya mp3 akışının kod çözümü donanımüzerinden işlenebilse bile bazen donanım tüm efektleri işleyemez. Örneğin donanımın kısıtlamalarına bağlı olarakbazen donanım ses karışımını ve yeniden örneklemeyi işlemez.
  • 91. 87Son güncelleme 30/3/2011Bölüm 8: SQL veritabanı performansıVeritabanı performansı için uygulama tasarımıBir SQLStatement nesnesini çalıştırdıktan sonra onun text özelliğini değiştirmeyin. Bunun yerine, her SQL ifadesiiçin bir SQLStatement örneği ve farklı değerler sağlamak için ifade parametreleri kullanın.Bir SQL ifadesi yürütülmeden önce, çalışma zamanı ifadenin yürütülmesi için dahili olarak gerçekleştirilecek adımlarıbelirlemek üzere ifadeyi hazırlar (derler). Daha önce yürütülmemiş olan bir SQLStatement örneğindeSQLStatement.execute() yöntemini çağırdığınızda, ifade yürütülmeden önce otomatik olarak hazırlanır. Dahasonraki execute() yöntemi çağrılarında, SQLStatement.text özelliği değişmediği sürece, ifade hala hazırdurumdadır. Sonuç olarak, ifade daha hızlı yürütülür.İfadelerin yürütülmesi arasındaki değerler değişiyorsa, ifadeleri yeniden kullanmaktan en iyi şekilde fayda sağlamaküzere ifadenizi özelleştirmek için ifade parametrelerini kullanın. (İfade parametreleri, SQLStatement.parametersilişkilendirici dizi özelliği kullanılarak belirtilir.) SQLStatement örneğinin text özelliğinin aksine, ifadeparametrelerinin değerlerini değiştirdiğinizde, çalışma zamanının ifadeyi yeniden hazırlaması gerekmez.Bir SQLStatement örneğini bir kez hazırlandıktan sonra yeniden kullandığınızda, uygulamanız bu SQLStatementörneğine giden bir başvuruyu saklamalıdır. Örneğe giden bir başvuruyu tutmak için, değişkeni işlem kapsamlı değil,sınıf kapsamlı bir değişken olarak belirtin. SQLStatement öğesini sınıf kapsamlı bir değişken haline getirmenin iyi biryolu, uygulamanızı SQL ifadesinin tek bir sınıfta sarılacağı biçimde yapılandırmaktır. Bileşim halinde yürütülen birifade grubu da tek bir sınıfta sarılabilir. (Bu teknik Komut tasarım yapısını kullanma olarak da bilinir.) Örnekler busınıfın üye değişkenleri olarak tanımlandığında, sarma sınıfı örneği uygulamada bulunduğu sürece, bu örnekler dekalıcı olur. Minimum düzeyde, örneğin bellekte kalması için işlevin dışında yer alan bir SQLStatement örneği içerenbir değişken tanımlayabilirsiniz. Örneğin, SQLStatement örneğini ActionScript sınıfında yer alan bir üye değişkeniveya bir JavaScript dosyasında yer alan, işlev olmayan bir değişken olarak belirleyin. Daha sonra, sorguyu gerçektenyürütmek istediğinizde ifadenin parametre değerlerini ayarlayabilir ve execute() yöntemini çağırabilirsiniz.Veri karşılaştırma ve sıralama için çalıştırma hızını artırmak amacıyla veritabanı dizinlerini kullanın.Bir sütun için dizin oluşturduğunuzda, veritabanı o sütunun verilerinin bir kopyasını saklar. Kopya sayısal veyaalfabetik sırada saklanır. Bu sıralama, veri tabanının değerleri hızla eşleştirmesine (örneğin eşitlik operatörünükullanırken) ve ortaya çıkan verileri ORDER BY deyimini kullanarak sıralamasına olanak tanır.Veritabanı dizinleri sürekli olarak güncel tutulur ve bu o tablodaki veri değiştirme işlemlerinin (EKLE veyaGÜNCELLE) biraz daha yavaş olmasına neden olur. Ancak, veri alma hızında önemli ölçüde artış olabilir. Buperformans dengelemesinden dolayı, her tablonun her sütununu dizinlemeyin. Bunun yerine, dizinlerinizitanımlamak için bir strateji kullanın. Dizinleme stratejinizi planlamak için aşağıdaki kılavuzları kullanın:• WHERE veya ORDER BY deyimlerinde tabloları birleştirmek için kullanılan dizin sütunları• Sütunlar sıkça birlikte kullanılıyorsa, onları tek bir dizinde olacak şekilde birlikte dizinleyin• Alfabetik olarak sıralanmış biçimde aldığınız ve metin verileri içeren bir sütunda, dizin için COLLATE NOCASEkarşılaştırmasını belirtinUygulamanın boşta kaldığı zamanlarda SQL ifadelerini önceden derlemeyi göz önünde bulundurun.
  • 92. 88FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMESQL veritabanı performansıSon güncelleme 30/3/2011Bir SQL ifadesi ilk defa çalıştığında, SQL metni, veritabanı motoru tarafından hazırlandığı (derlendiği) için daha yavaşolur. Bir ifadenin hazırlanması ve yürütülmesi çaba gerektiren bir işlem olduğundan, bu işleme yönelik bir stratejibaşlangıç verilerini önceden yüklemek ve daha sonra diğer ifadeleri arka planda yürütmektir:1 Önce uygulamanın gerektirdiği verileri yükleyin..2 Uygulamanızın ilk başlangıç işlemleri tamamlandığında veya uygulamadaki başka bir “boş” zamanda diğerifadeleri yürütün.Örneğin, uygulamanızın birinci ekranını görüntülemek için veritabanına hiç erişmediğini varsayın. Bu durumda,veritabanı bağlantısının açılmasından önce ekranın görüntülenmesini bekleyin. Son olarak, SQLStatement örneklerinioluşturun ve çalıştırabildiklerinizi çalıştırın.Alternatif olarak, uygulamanızın başlar başlamaz belirli bir sorgunun sonucu gibi bazı verileri görüntülediğinivarsayın. Bu durumda, devam edin ve bu sorguya ilişkin SQLStatement örneğini yürütün. Başlangıç verileriyüklendikten ve görüntülendikten sonra, diğer veritabanı işlemleri için SQLStatement örneklerini oluşturun vemümkünse diğer gerekli ifadeleri daha sonra yürütün.Pratikte, SQLStatement örneklerini yeniden kullanıyorsanız, ifadenin hazırlanması için gereken ek süre yalnızca tekseferlik bir süreçtir. Büyük olasılıkla, bunun genel performans üzerinde büyük bir etkisi olmaz.Çoklu SQL veri değişimi işlemlerini bir işlemin içinde gruplayın.Veri ekleme ve değiştirmeyi içeren çok sayıda SQL ifadesi yürüttüğünüzü varsayın (INSERT veya UPDATE ifadeleri).Tüm ifadeleri açık bir işlem içinde yürüterek performansta önemli bir artış sağlayabilirsiniz. Açık olarak bir işlembaşlatmazsanız, ifadelerden her biri kendisine ait otomatik olarak oluşturulmuş işlemlerde çalışır. Her işlemin (herifadenin) yürütülmesi tamamlandığında, çalışma zamanı elde edilen verileri diskteki veritabanı dosyasına yazar.Diğer taraftan, açık olarak bir işlem oluşturur ve ifadeleri bu işlem bağlamında yürütürseniz ne olacağını düşünün.Çalışma zamanı bellekteki tüm değişiklikleri yapar, daha sonra işlem gerçekleştiğinde tüm değişiklikleri bir defadaveritabanı dosyasına yazar. Verilerin diske yazılması genellikle işlemin en zaman yoğunluklu bölümüdür. Sonuçolarak, her SQL ifadesi için bir kez diske yazmak yerine bir defada yazmak, performansı önemli ölçüde artırabilir.Büyük SELECT sorgu sonuçlarını SQLStatement sınıfının execute() (prefetch parametresi ile) ve next()yöntemlerini kullanarak parçalar halinde işleyin..Büyük bir sonuç kümesi alan bir SWL ifadesi çalıştırdığınızı varsayın. Ardından, uygulama her veri satırını bir döngühalinde işler. Örneğin, verileri biçimlendirir veya ondan nesneler oluşturur. Verilerin işlenmesi uzun zaman alabilirve bu kilitlenen veya yanıt vermeyen bir ekran gibi oluşturma sorunlarına neden olabilir. “Eş zamanlı olmayanişlemler” sayfa 73 bölümünde açıklandığı gibi, işi parçalara bölmek de bir çözümdür. SQL veritabanı API’si, veri işlemesürecini bölmeyi kolaylaştırır.SQLStatement sınıfının execute() yönteminde isteğe bağlı bir prefetch parametresi vardır (ilk parametre). Birdeğer sağlarsanız, bu değer veritabanının çalıştırma tamamlandığı zaman döndürdüğü sonuç satırlarının maksimumsayısını belirtir.dbStatement.addEventListener(SQLEvent.RESULT, resultHandler);dbStatement.execute(100); // 100 rows maximum returned in the first setSonuç verinin birinci kümesi döndürüldüğünde, ifadeyi çalıştırmaya devam etmek ve başka bir sonuç satırlar kümesialmak için next() yöntemini çağırabilirsiniz. execute() yöntemi gibi, next() yöntemi de döndürülecek maksimumsatır sayısı belirten prefetch parametresini kabul eder:
  • 93. 89FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMESQL veritabanı performansıSon güncelleme 30/3/2011// This method is called when the execute() or next() method completesfunction resultHandler(event:SQLEvent):void{var result:SQLResult = dbStatement.getResult();if (result != null){var numRows:int = result.data.length;for (var i:int = 0; i < numRows; i++){// Process the result data}if (!result.complete){dbStatement.next(100);}}}Verilerin tamamı yüklenene kadar next() yöntemini çağırmaya devam edebilirsiniz. Önceki listede gösterildiği gibi,verilerin tamamının ne zaman yüklendiğini anlayabilirsiniz. execute() veya next() yöntemlerinin her bitişindeoluşturulan SQLResult nesnesinin complete özelliğini kontrol edin.Not: Sonuç verilerini işleme sürecini bölmek için prefetch parametresini ve next() yöntemini kullanın. Bir sorgununsonuçlarını, sonuç kümesinin bir bölümüne sınırlandırmak için bu parametreyi kullanmayın. Bir ifadenin sonuçkümesinden yalnızca sütunların bir alt kümesini almak istiyorsanız SELECT deyiminin LIMIT ifadesini kullanın. Sonuçbüyükse, yine de sonuçların işlenme sürecini bölmek için prefetch parametresini ve next() yönteminikullanabilirsiniz.Çoklu ifadeleri eşzamanlı olarak çalıştırmak için senkronize olmayan çoklu SQLConnection nesnelerini tek bir veritabanıyla kullanmayı deneyin.Bir SQLConnection nesnesi openAsync() yöntemini kullanarak bir veritabanına bağlandığında, ana çalışma zamanıçalıştırma parçacığı yerine arka planda çalışır. Ek olarak, her SQLConnection kendi arka plan iş parçacığında çalışır.Çoklu SQLConnection nesnelerini kullanarak çoklu SQL ifadelerini eşzamanlı olarak etkili bir biçimdeçalıştırabilirsiniz.Bu yaklaşımın aynı zamanda olası dezavantajları da vardır. En önemlisi, her ek SQLStatement nesnesi ek bellekgerektirir. Ek olarak, eşzamanlı çalıştırmalar da özellikle tek bir CPU veya CPU çekirdeği olan makinelerde işlemcinindaha çok çalışmasına neden olur. Bu sıkıntılardan dolayı, bu yaklaşım mobil aygıtlarda kullanım için tavsiye edilmez.Başka bir sıkıntı ise, SQLStatement nesnelerinin yeniden kullanımından sağlanabilecek faydanın bir SQLStatementnesnesinin tek bir SQLConnection nesnesine bağlı olmasından dolayı kaybolabilmesidir. Bu yüzden, SQLStatementnesnesi, ilişkili SQLConnection nesnesinin zaten kullanımda olması durumunda yeniden kullanılamaz.Tek bir veritabanına bağlı çoklu SQLConnection nesneleri kullanmak istiyorsanız, her birinin ifadelerini kendiişleminde çalıştırdığını aklınızda tutun. Bu ayrı işlemleri, ekleme, değiştirme veya veri silme gibi verileri değiştirenherhangi bir kodda hesaba kattığınızdan emin olun.Paul Robertson çoklu SQLConnection nesneleri kullanmanın olası dezavantajlarını minimuma indirirken faydalarınıbirleştirmenize yardımcı olacak açık kaynaklı bir kod kütüphanesi oluşturdu. Kütüphane SQLConnectionnesnelerinden oluşan bir havuz kullanır ve ilişkili SQLStatement nesnelerini yönetir. Böylece, SQLStatementnesnelerinin yeniden kullanılmasını ve çoklu ifadeleri eşzamanlı olarak çalıştırmak için çoklu SQLConnectionnesnelerinin mevcut olmasını sağlar. Daha fazla bilgi ve kütüphaneyi indirmek için bkz.http://probertson.com/projects/air-sqlite/.
  • 94. 90FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMESQL veritabanı performansıSon güncelleme 30/3/2011Veritabanı dosyası en iyileştirmesiVeritabanında şema değişikliklerinden kaçının.Veritabanı tablolarına veri ekledikten sonra mümkünse veritabanı şemasını (tablo yapısını) değiştirmekten kaçının.Bir veritabanı dosyası, normalde dosya başlangıcında bulunan tablo tanımlarıyla yapılandırılır. Bir veritabanınabağlantı açtığınızda, çalışma zamanı bu tanımları yükler. Veritabanı tablolarına veri eklediğinizde, bu veriler dosyayatablo tanım verilerinin ardından eklenir. Ancak, şema değişiklikleri yaparsanız, yeni tablo tanımı verisi, veritabanıdosyasındaki tablo verisiyle birleştirilir. Örneğin, bir tabloya sütun eklemek veya yeni bir tablo eklemek veri türlerininkarışmasına neden olabilir. Tablo tanımı verileri veritabanı dosyasının başında konumlandırılmazsa, veritabanına birbağlantı açmak daha uzun sürer. Çalışma zamanının dosyanın farklı bölümlerinden tablo tanımı verilerini okumasıdaha uzun sürdüğünden, bağlantının açılması da yavaştır.Bir veri tabanını şema değiştikten sonra en iyileştirmek için SQLConnection.compact() yöntemini kullanın.Şema değişiklikleri yapmanız gerekiyorsa, değişiklikleri tamamladıktan sonra SQLConnection.compact() yönteminiçağırabilirsiniz. Bu işlem veritabanı dosyasını tablo tanım bilgilerinin bütün olarak dosyanın başlangıcında yer alacağıbiçimde yeniden yapılandırır. Ancak, compact() işlemi, veritabanı büyüdükçe daha çok zaman alabilir.Gereksiz veritabanı çalışma zamanı işlemeSQL ifadenizde tamamen uygun bir tablo adı (veritabanı adını da dahil ederek) kullanın.Her zaman her tablo adının yanı sıra bir ifadedeki veritabanı adını da açıkça belirtin. (Ana veritabanıysa “ana”sözcüğünü kullanın.) Örneğin, aşağıdaki kod main olarak belirtilmiş açık bir veritabanı adı içerir:SELECT employeeIdFROM main.employeesVeritabanı adının açıkça belirtilmesi, çalışma zamanının eşleşen tabloyu bulmak için bağlı olan her veritabanınıkontrol etmesini önler. Ayrıca çalışma zamanının yanlış veritabanını seçme olasılığını da engeller. Bir SQLConnectionyalnızca tek bir veritabanına bağlandığında bile bu kuralı izleyin. SQLConnection arka planda, SQL ifadeleriaracılığıyla erişilebilen geçici bir veritabanına daha bağlıdır.SQL INSERT ve SELECT ifadelerinde açık sütun adları kullanın.Aşağıdaki örnekler açık sütun adlarının kullanımını gösterir:INSERT INTO main.employees (firstName, lastName, salary)VALUES ("Bob", "Jones", 2000)SELECT employeeId, lastName, firstName, salaryFROM main.employeesÖnceki örnekleri aşağıdakilerle karşılaştırın. Bu kod stilinden kaçının:
  • 95. 91FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMESQL veritabanı performansıSon güncelleme 30/3/2011-- bad because column names arent specifiedINSERT INTO main.employeesVALUES ("Bob", "Jones", 2000)-- bad because it uses a wildcardSELECT *FROM main.employeesSütun adlarının açıkça belirtilmemesi durumunda, çalışma zamanının sütun adlarını çözmek için ek iş yapmasıgerekir. Bir SELECT ifadesi açık sütunlar yerine joker kullanıyorsa, çalışma zamanının ekstra veri almasına neden olur.Bu ek veriler ek işleme gerektirir ve gerekmeyen ek nesne örnekleri oluşturur.Bir ifadede tabloyu kendisiyle karşılaştırmadığınız sürece aynı tabloyu birden fazla defa birleştirmekten kaçının.SQL ifadeleri büyüdükçe, farkında olmadan bir veritabanı tablosunu sorguya birden çok defa katabilirsiniz. Genellikle,aynı sonuç tabloyu yalnızca bir kere kullanarak da elde edilebilir. Bir sorguda bir veya daha fazla görünümkullanıyorsanız, aynı tabloya bir kereden fazla katmanız mümkündür. Örneğin, sorguya bir tablo ve aynı zamanda otablodan veri içeren bir görünüm katıyor olabilirsiniz. İki işlem bir katılma işleminden fazlasına neden olabilir.Etkili SQL sözdizimiWHERE deyimindeki bir alt sorgu yerine bir sorguya tablo eklemek için JOIN (FROM deyimindeki) öğesini kullanın. Buipucu, yalnızca filtreleme için bir sonuç kümesi yerine bir tablonun verilerine ihtiyacınız olsa da geçerlidir.FROM deyiminde birden fazla tabloyu birleştirmek WHERE deyimindeki bir alt sorguyu kullanmaktan daha iyiperformans sağlar.Dizinlerden faydalanmayan SQL ifadelerini kullanmayın. Bu ifadeler bir alt sorguda toplama işlevlerininkullanımını, alt sorguda UNION ifadesini veya UNION ifadesine sahip ORDER BY deyimini bulundurur.Bir dizinin kullanımı, SELECT sorgusunun işlenme hızını büyük oranda artırabilir. Ancak, belirli SQL sözdizimleriveritabanının dizin kullanmasını önler ve onu arama ve sıralama işlemleri için asıl veriyi kullanmaya zorlar.Özellikle LIKE(%XXXX%) öğesindeki gibi bir satır aralığı joker karakteriyle LIKE operatörünü kullanmaktankaçınmayı unutmayın.LIKE işlemi joker aramalarının kullanımını desteklediğinden, tam eşleşme karşılaştırmalarını kullanmaktan dahayavaş performans sağlar. Özellikle, arama dizesine bir joker karakterle başlarsanız, veritabanı aramada dizinlerikullanamaz. Bunun yerine, veritabanı tablonun her satırındaki metni aramalıdır.IN operatörünü kullanmaktan kaçının. Olası değerler önceden biliniyorsa, IN işlemi daha hızlı çalıştırma için ANDveya OR öğeleri kullanılarak yazılabilir.Aşağıdaki iki ifadenin saniyesi daha hızlı çalışır. IN() veya NOT IN() ifadelerinin kullanımı yerine basit eşitlikifadelerini OR ile birlikte kullandığı için daha hızlıdır:
  • 96. 92FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMESQL veritabanı performansıSon güncelleme 30/3/2011-- SlowerSELECT lastName, firstName, salaryFROM main.employeesWHERE salary IN (2000, 2500)-- FasterSELECT lastName, firstName, salaryFROM main.employeesWHERE salary = 2000OR salary = 2500Performansı iyileştirmek için, bir SQL ifadesinin alternatif formlarını deneyin.Önceki örneklerle gösterildiği gibi, bir SQL ifadesinin yazılış biçimi veritabanı performansını da etkileyebilir. Belirlibir sonuç kümesi elde etmek amacıyla bir SQL SELECT ifadesi yazmanın genellikle birden çok yolu vardır. Bazıdurumlarda, bir yaklaşım diğerinden fark edilir ölçüde daha hızlı çalışır. Önceki önerilere ek olarak, farklı SQLifadeleri ve onların performansıyla ilgili daha fazla bilgiyi SQL diliyle ilgili kaynaklardan edinebilirsiniz.SQL ifadesinin performansıAlternatif SQL ifadelerini hangisinin daha hızlı olduğunu belirlemek için doğrudan karşılaştırın.Bir SQL ifadesinin çeşitli versiyonlarının performansını karşılaştırmanın en iyi yolu onları doğrudan veritabanınız veveriler ile test etmektir.Aşağıdaki geliştirme araçları SQL ifadelerini çalıştırırken çalıştırma zamanları sağlar. Bunları ifadelerin alternatifversiyonlarının hızını karşılaştırmak için kullanın:• Run! (Paul Robertson tarafından hazırlanan AIR SQL sorgu yazma ve test etme aracı)• Lita (David Deraedt tarafından hazırlanan SQLite Yönetim Aracı)
  • 97. 93Son güncelleme 30/3/2011Bölüm 9: Kıyaslama ve konuşlandırmaKıyaslamaUygulamaları karşılaştırmak için bir çok araç bulunmaktadır. Flash topluluğu üyeleri tarafından geliştirilen Stats sınıfıve PerformanceTest sınıfını kullanabilirsiniz. Ayrıca Adobe® Flash® Builder™ uygulamasındaki profil oluşturucuyu veFlexPMD aracını kullanabilirsiniz.Stats sınıfıÇalışma zamanının yayınlama sürümünü kullanarak kodunuzun çalışma zamanında profilini oluşturmak için haricibir araç kullanmadan Stats sınıfını kullanabilirsiniz. Stats sınıfı Flash topluluğundan mr. Doob tarafındangeliştirilmiştir. Stats sınıfını şu adresten indirebilirsiniz: https://github.com/mrdoob/Hi-ReS-Stats.Stats sınıfı aşağıdaki öğeleri izlemenizi sağlar:• Saniyede oluşturulan kareler (sayı ne kadar büyükse o kadar iyidir).• Bir kareyi oluşturmak için kullanılan milisaniyeler (sayı ne kadar küçükse o kadar iyidir).• Kodun kullanmakta olduğu bellek miktarı. Her karede artıyorsa uygulamanızda bellek sızıntısı olabilir. Olası belleksızıntısını araştırmanız önemlidir.• Uygulamanın kullandığı maksimum bellek miktarı.İndirildiğinde Stats sınıfı aşağıdaki sıkışık kodla beraber kullanılabilir:import net.hires.debug.*;addChild( new Stats() );Adobe® Flash® Professional veya Flash Builder’daki koşullu derlemeyi kullanarak Stats nesnesini etkinleştirebilirsiniz:CONFIG::DEBUG{import net.hires.debug.*;addChild( new Stats() );}DEBUG sabitinin değerini değiştirerek Stats nesnesinin derlemesini etkinleştirebilir veya devre dışı bırakabilirsiniz.Aynı yaklaşım uygulamanızda derlenmemesini istediğiniz herhangi bir kodu değiştirmek için kullanılabilir.PerformanceTest sınıfıActionScript kod yürütme işleminin profilini oluşturmak için Grank Skinner birim testi iş akışı ile tümleştirilebilenbir araç geliştirdi. PerformanceTest sınıfına özel bir sınıf iletirsiniz, o da kodunuzda bir dizi test uygular.PerformanceTest sınıfı farklı yaklaşımları kolayca karşılaştırmanıza olanak tanır. PerformanceTest sınıfı şu adrestenindirilebilir: http://www.gskinner.com/blog/archives/2009/04/as3_performance.html.Flash Builder profil oluşturucuFlash Builder kodunuzu yüksek ayrıntı düzeyiyle karşılaştırmanızı sağlayan bir profil oluşturucuyla birlikte gelir.Not: Profil oluşturucuya erişmek için Flash Player’ın hata ayıklama sürümünü kullanın. Aksi halde, hata mesajıylakarşılaşırsınız.
  • 98. 94FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRMEKıyaslama ve konuşlandırmaSon güncelleme 30/3/2011Profil oluşturucu, ayrıca Adobe Flash Professional’da üretilen içerikle birlikte kullanılabilir. Bunu yapmak içinderlenmiş SWF dosyasını ActionScript’ten veya Flex projesinden Flash Builder’a yükleyin ve profil oluşturucuyu buprogramda çalıştırın. Profil oluşturucu hakkında daha fazla bilgi için Flash Builder 4ü Kullanma bölümüne “Flexuygulamalarının profilini oluşturma” başlıklı makaleye bakın.FlexPMDAdobe Teknik Servisi, ActionScript 3.0 kodunun kalitesini denetleyen FlexPMD adında bir araç üretti. FlexPMD,JavaPMD’ye benzeyen bir ActionScript aracıdır. FlexPMD bir ActionScript 3.0 veya Flex kaynak dizinini denetleyerekkod kalitesini iyileştirir. Kullanılmayan kodlar, fazla uzun kod veya Flex bileşeni yaşam ömrünün yanlış kullanımı gibizayıf kodlama işlemlerini algılar.FlexPMD, şu adreste bulunan bir Adobe açık kaynaklı projesidir:http://opensource.adobe.com/wiki/display/flexpmd/FlexPMD. Şu adreste bir Eclipse eklentisi de mevcuttur:http://opensource.adobe.com/wiki/display/flexpmd/FlexPMD+Eclipse+plugin.FlexPMD kod denetimini kolaylaştırır ve kodunuzun temiz ve en iyileştirilmiş olmasını sağlar. FlexPMD’nin gerçekgücü genişletilebilirliğinde yatar. Geliştirici olarak herhangi bir kodu denetlemek için kendi kural kümelerinizioluşturabilirsiniz. Örneğin filtrelerin fazla kullanılması veya bunun gibi yakalamak istediğiniz başka zayıf kodlamaişlemlerini algılayan bir kural kümesi yaratabilirsiniz.DağıtmaFlash Builder’da uygulamanızın son sürümünü dışa aktarırken yayınlama sürümünü dışa aktardığınızdan emin olun.Yayınlama sürümünün dışa aktarılması SWF dosyasının içerisindeki hata ayıklama bilgilerini kaldırır. Hata ayıklamabilgilerinin kaldırılması SWF dosyasını küçültür ve uygulamanın daha hızlı çalışmasını sağlar.Projenizin yayınlama sürümünü dışa aktarmak için Flash Builder’daki Proje panelini ve Sürüm Yapısını Dışa Aktarseçeneğini kullanın.Not: Projenizi Flash Professional’da derlerken sürüm ve hata ayıklama sürümleri arasında seçme seçeneğiniz yoktur.Derlenmiş SWF dosyası varsayılan olarak yayınlama sürümdür.