SlideShare ist ein Scribd-Unternehmen logo
1 von 98
Downloaden Sie, um offline zu lesen
ADOBE®
FLASH®
PLATFORM
için Performansı En İyileştirme
Son güncelleme 30/3/2011
Telif Hakkı
© 2011 Adobe Systems Incorporated and its licensors. All rights reserved.
Adobe® Flash® Platform için Performansı En İyileştirme
This user guide is protected under copyright law, furnished for informational use only, is subject to change without notice, and should not be construed as a
commitment by Adobe Systems Incorporated. Adobe Systems Incorporated assumes no responsibility or liability for any errors or inaccuracies that may appear
in 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) any
reuse 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 the
following 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 Financial
Services, Adobe Garamond, Adobe Genesis, Adobe Griffo, Adobe Jenson, Adobe Kis, Adobe OnLocation, Adobe Originals logo, Adobe PDF logo, Adobe
Premiere, 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/or
other countries.
Android is a trademark of Google Inc. ActiveX and Windows are either registered trademarks or trademarks of Microsoft Corporation in the United States and
other countries. Windows is either a registered trademark or a trademark of Microsoft Corporation in the United States and/or other countries. Macintosh is a
trademark 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 and
Commercial Computer Software Documentation are being licensed to U.S. Government end users (a) only as Commercial Items and (b) with only those rights
as 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 402
of the Vietnam Era Veterans Readjustment Assistance Act of 1974 (38 USC 4212), and Section 503 of the Rehabilitation Act of 1973, as amended, and the
regulations 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 be
incorporated by reference.
iii
Son güncelleme 30/3/2011
İçindekiler
Bölüm 1: Giriş
Çalışma zamanı kodunu çalıştırmanın temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Algılanan performans ile gerçek performansın karşılaştırılması . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
En iyileştirmelerinizin hedefini belirleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Bölüm 2: Belleği saklama
Görüntüleme nesneleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
İlkel türler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Nesneleri yeniden kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Belleği boşaltmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Bitmap'leri kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Filtreleri ve dinamik bitmap'i kaldırma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Doğrudan mipmap oluşturma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3B efektlerini kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Metin nesneleri ve bellek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Olay modeli ile geri aramaların karşılaştırması . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Bölüm 3: CPU kullanımını en aza indirme
CPU kullanımı için Flash Player 10.1 geliştirmeleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Uyku modu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Nesneleri dondurma ve çözme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Olayları etkinleştirme ve devre dışı bırakma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Fare etkileşimleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Zamanlayıcılarla ENTER_FRAME olaylarının karşılaştırılması . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Hareket arası oluşturma sendromu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Bö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 API'si . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Olayı dıştan içe ve içten dışa tetikleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Piksellerle çalışma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Normal ifadeler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Çeşitli en iyileştirmeler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Bölüm 5: Performans oluşturma
Yeniden çizilen bölgeler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Sahne alanı dışı içerik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Film kalitesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Alfa karıştırma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Uygulama kare hızı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Bitmap'leri önbelleğe alma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Bitmap'leri elle önbelleğe alma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Metin nesnelerinin oluşturulması . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
GPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
ivFLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
İçindekiler
Son güncelleme 30/3/2011
Eş zamanlı olmayan işlemler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Saydam pencereler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Vektör şekli düzleştirme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Bölüm 6: Ağ etkileşimini en iyileştirme
Ağ etkileşimi için geliştirmeler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Harici içerik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Girdi çıktı hataları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Flash Remoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Gereksiz ağ işlemleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Bölüm 7: Medya ile çalışma
Video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
StageVideo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Ses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Bölüm 8: SQL veritabanı performansı
Veritabanı performansı için uygulama tasarımı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Veritabanı dosyası en iyileştirmesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Gereksiz veritabanı çalışma zamanı işleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Etkili SQL sözdizimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
SQL ifadesinin performansı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Bölüm 9: Kıyaslama ve konuşlandırma
Kıyaslama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Dağıtma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
1
Son güncelleme 30/3/2011
Bölüm 1: Giriş
Adobe® AIR® ve Adobe® Flash® Player uygulamaları, masaüstleri, mobil aygıtlar, tabletler ve televizyon aygıtları gibi
birçok platformda çalışır. Bu belge, bu uygulamaları dağıtan geliştiriciler için en iyi çalışma biçimlerini ana hatlarıyla
kod ö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ırma
Bu en iyileştirmelerin çoğu, hem AIR çalışma zamanında hem de Flash Player çalışma zamanında tüm aygıtlardaki
uygulamalar 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.5'te sunulan yeteneklere odaklanır. Ancak bu en
iyileştirmelerin çoğu, önceki AIR ve Flash Player sürümleri için de geçerlidir.
Çalışma zamanı kodunu çalıştırmanın temelleri
Uygulama performansının nasıl iyileştirileceğini anlamanın bir püf noktası da Flash Platform çalışma zamanının kodu
nası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 her
birine 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 Flash
Professional'daki ayarları kullanarak ayarlayabilirsiniz. Birinci kare hızını kodda da belirtebilirsiniz. Yalnızca
ActionScript olan bir uygulamada, kare hızını kök belge sınıfınıza [SWF(frameRate="24")] meta veri etiketini
uygulayarak ayarlayın. MXML’de, Application veya WindowedApplication etiketindeki frameRate niteliğini
ayarlayı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ıyla
sonuçlanır. Birinci aşamanın ilk bölümünde, çalışma zamanı olayları gelir ve gönderilir. Bu olaylar, bir ağ üzerinden
yapılan veri yüklemeden gelen bir yanıt gibi senkronize olmayan işlemlerin tamamlanmasını veya ilerlemesini temsil
edebilir. Ayrıca, bu olaylar kullanıcı girdisinden gelen olayları da içerir. Çalışma zamanı, olaylar gönderilirken
kodunuzu, kaydettirdiğiniz dinleyicilerde çalıştırır. Herhangi bir olay gerçekleşmezse, çalışma zamanı bu çalıştırma
aşamasını herhangi bir işlem gerçekleştirmeden tamamlamayı bekler. Çalışma zamanı, bir etkinliğin olmamasından
dolayı, 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ışma
zamanı bu olayları sıraya dizer ve bir sonraki karede gönderir.
2FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Giriş
Son güncelleme 30/3/2011
Birinci karenin ikinci bölümü enterFrame olayıdır. Bu olay, her karede bir defa gönderildiği için diğerlerinden
farklı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ı ekranda
görünür olan tüm öğelerin durumunu hesaplar ve bu öğeleri ekranda çizer. Ardından bu süreç, bir parkurun
etrafı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 öğesini
kullanmaktan 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, kare
dö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 ve
oluşturma için ayrılan süreyi kısaltarak karedeki kullanılabilir sürenin yarısından fazlasını alır. Özellikle de filtreler ve
karış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ından
fazlası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 önce
bir 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 bile
animasyon 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ğıdaki
kaynakları inceleyin:
• Flash Player Mental Model - The Elastic Racetrack (Flash Player Zihin Modeli - Elastik Parkur) (makale Ted Patrick
tarafından yazılmıştır)
• Asynchronous ActionScript Execution (ActionScript’i Senkronize Olmayan Bir Şekilde Çalıştırma) (makale Trevor
McCauley tarafından yazılmıştır)
• Adobe AIR'yi 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 sunumunun
videosu)
Algılanan performans ile gerçek performansın
karşılaştırılması
Uygulamanızın iyi performans gösterip göstermediği konusunda en son kararı verecek kişiler, uygulamanın
kullanıcılarıdır. Geliştiriciler, uygulamanın performansını belirli işlemlerin çalışmak için ne kadar süre gerektirdiği
veya nesnelerin kaç tane örneğinin oluşturulduğuna göre ölçebilir. Ancak, bu ölçümler son kullanıcılar için önemli
değ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?
3FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Giriş
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ışma
zamanı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 belirleme
Bazı performans geliştirmeleri kullanıcılar için fark edilebilir bir geliştirme oluşturmaz. Performans en
iyileş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 en
iyileş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 iyi
performans gösterir. Ancak, uygulama oluşturmak için Flash Platform kullanmanın nedenlerinden biri de zengin ve
etkileyici uygulamalara olanak veren medya ve grafik özellikleridir. Uygulamada istediğiniz zenginlik düzeyinin
uygulamanı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 önce
bekleyip 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ği
düşü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ün
değ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üf
noktaları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ğıdaki
kaynakları inceleyin:
• AIR için performans ayarlama uygulamaları: http://www.adobe.com/go/learn_fp_goldman_tv_tr (Oliver
Goldman'ın MAX konferansındaki sunumunun videosu)
• Performans ayarlayan Adobe AIR uygulamaları: http://www.adobe.com/go/learn_fp_air_perf_devnet_tr (Oliver
Goldman'ın sunuma dayalı Adobe Developer Bağlantısı makalesi)
4
Son güncelleme 30/3/2011
Bölüm 2: Belleği saklama
Belleği saklamak, masaüstü uygulamalarında bile uygulama gelişimi açısından her zaman önemlidir. Ancak, mobil
cihazlarda bellek tüketimi daha önemlidir ve uygulamanızın kullandığı bellek miktarını sınırlamakta fayda vardır.
Görüntüleme nesneleri
Uygun 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 en
iyileş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. Bir
zaman çizelgesi kullanan animasyonlar için, MovieClip nesneleri kullanın. Her zaman uygulamanız için en etkili nesne
tü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: 236
trace(getSize(new Sprite()));
// output: 412
trace(getSize(new MovieClip()));
// output: 440
getSize() 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ürler
Kodu 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 en
iyileştirmenin bir yolu yoktur.
5FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Belleği saklama
Son güncelleme 30/3/2011
// Primitive types
var a:Number;
trace(getSize(a));
// output: 8
var b:int;
trace(getSize(b));
// output: 4
var c:uint;
trace(getSize(c));
// output: 4
var d:Boolean;
trace(getSize(d));
// output: 4
var e:String;
trace(getSize(e));
// output: 4
64 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 types
var a:Number = 8;
trace(getSize(a));
// output: 4
a = Number.MAX_VALUE;
trace(getSize(a));
// output: 8
Davranış String türü için farklıdır. Ayrılan saklama miktarı String'in uzunluğuna bağlıdır.
var name:String;
trace(getSize(name));
// output: 4
name = "";
trace(getSize(name));
// output: 24
name = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum
has been the industry's standard dummy text ever since the 1500s, when an unknown printer took
a galley of type and scrambled it to make a type specimen book. It has survived not only five
centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It
was popularized in the 1960s with the release of Letraset sheets containing Lorem Ipsum
passages, and more recently with desktop publishing software like Aldus PageMaker including
versions of Lorem Ipsum.";
trace(getSize(name));
// output: 1172
Kodu kıyaslamak ve görev için en etkili nesneyi seçmek için getSize() yöntemini kullanın.
6FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Belleği saklama
Son güncelleme 30/3/2011
Nesneleri yeniden kullanma
Mü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ı yeniden
oluş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 code
area = 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 loop
var 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 nesnesi
kullanarak 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-transparent
myImage = new BitmapData(20,20,false,0xF0D062);
// Create a container for each BitmapData instance
myContainer = new Bitmap(myImage);
// Add it to the display list
addChild(myContainer);
// Place each container
myContainer.x = (myContainer.width + 8) * Math.round(i % 20);
myContainer.y = (myContainer.height + 8) * int(i / 20);
}
7FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Belleği saklama
Son güncelleme 30/3/2011
Not: Pozitif değerler kullanırken, yuvarlanan değerin int öğesine dağıtılması Math.floor() yönteminin
kullanılmasından çok daha hızlıdır.
Aşağıdaki resim bitmap döşemenin sonucunu gösterir:
Bitmap döşemenin sonucu
En 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-transparent
var 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 instance
myContainer = new Bitmap(myImage);
// Add it to the display list
addChild(myContainer);
// Place each container
myContainer.x = (myContainer.width + 8) * Math.round(i % 20);
myContainer.y = (myContainer.height + 8) * int(i / 20);
}
Bu yaklaşım yaklaşık 700 KB'lı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:
8FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Belleği saklama
Son güncelleme 30/3/2011
// Create a single 20 x 20 pixel bitmap, non-transparent
var 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 instance
myContainer = new Bitmap(myImage);
// Add it to the DisplayList
addChild(myContainer);
// Place each container
myContainer.x = (myContainer.width + 8) * Math.round(i % 20);
myContainer.y = (myContainer.height + 8) * int(i / 20);
// Set a specific rotation, alpha, and depth
myContainer.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 sonucu
Daha fazla Yardım konusu
“Bitmap'leri önbelleğe alma” sayfa 52
9FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Belleği saklama
Son güncelleme 30/3/2011
Nesne kuyruğu
Mü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 yeniden
kullanımını içerir. Uygulamanızın başlatılması sırasında tanımlı bir sayıda nesne oluşturup onları bir Array veya
Vector 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. Ancak
başvuruların null değerine ayarlanması bu öğeyi çöp toplama için uygun hale getireceğinden bu işlemi
gerç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. Bu
ayrıca çöp toplayıcının uygulamanızı yavaşlatarak çalışma ihtimalini de düşürür. Aşağıdaki kod, nesne kuyruğu
tekniğ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();
}
10FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Belleği saklama
Son güncelleme 30/3/2011
public 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, bu
nesnelerden örnekler döndürür ve disposeSprite() yöntemi onları bırakır. Kod, kuyruk tamamen kullanıldığında
onun büyümesine olanak verir. Ayrıca, kuyruk yorulduğunda yeni nesnelerin ayrılmayacağı sabit boyutlu bir kuyruk
oluş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 sonra
onları başka bir görev için yeniden kullanır.
11FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Belleği saklama
Son güncelleme 30/3/2011
stage.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, size
SpritePool 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 olarak
toplandığından emin olmak için, nesneye yapılan tüm başvuruları silin. ActionScript 1.0 ve 2.0’da kullanılan eski
delete operatörünün ActionScript 3.0’da farklı davrandığını unutmayın. Operatör yalnızca dinamik nesnelerin
dinamik ö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 memory
mySprite = null;
Şunu unutmayın ki, bir nesnenin null değerine ayarlanması bellekten kaldırılacağı anlamına gelmez. Bazen
kullanılabilir bellek yeterince düşük sayılmıyorsa çöp toplayıcı çalışmaz. Çöp toplama tahmin edilemez. Nesne silme
yerine bellek ayırma işlemi çöp toplamayı tetikler. Çöp toplayıcı çalıştığında, henüz toplanmamış nesne grafikleri
bulur. 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 fark
edilir 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çin
daha az işleme zamanı harcar. Çöp toplama işlemini garanti sağlayan bir işlem olarak göz önünde bulundurun ve
mü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öntemi
kullanılarak başlatılabilir. Adobe® Flash® Builder™ ile paketlenen profil oluşturucu, çöp toplayıcıyı el ile başlatmanıza
olanak tanır. Çöp toplayıcıyı çalıştırmak uygulamanızın nasıl yanıt verdiğini ve nesnelerin bellekten doğru bir şekilde
silinip 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ı null
olarak ayarlamadan önce removeEventListener() yöntemini kullanan olay dinleyicilerini kaldırın.
12FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Belleği saklama
Son güncelleme 30/3/2011
Neyse ki, bitmap'ler tarafından kullanılan bellek miktarı hızlı bir şekilde azaltılabilir. Örneğin, BitmapData sınıfı bir
dispose() yöntemi içerir. Bir sonraki örnek 1.8 MB'lık bir BitmapData örneği oluşturur. Kullanımda olan geçerli
bellek 1,8 MB'a çı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 instance
var image:BitmapData = new BitmapData(800, 600);
trace(System.totalMemory / 1024);
// output: 44964
Daha 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 instance
var image:BitmapData = new BitmapData(800, 600);
trace(System.totalMemory / 1024);
// output: 44964
image.dispose();
image = null;
trace(System.totalMemory / 1024);
// output: 43084
dispose() yöntemi pikselleri bellekten kaldırsa da, başvuru yine de onu tamamen bırakmak için null değerine
ayarlanmalıdır. Belleğin hemen boşaltılması için artık bir BitmapData nesnesine ihtiyaç duymadığınızda her zaman
dispose() 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 XML
ağ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 26
Bitmap'leri kullanma
Bitmap'ler yerine vektörlerin kullanılması bellek kazanmanın iyi bir yoludur. Ancak, özellikle yüksek sayıda vektör
kullanımı, işlemci ve GPU kaynağı ihtiyacını önemli ölçüde artırır. Çalışma zamanı ekranda piksel çizmek için vektör
içeriği oluşturmaya kıyasla daha az işleme kaynağı gerektireceğinden, bitmap kullanmak, oluşturmayı en iyileştirmek
için iyi bir yoldur.
Daha fazla Yardım konusu
“Bitmap'leri elle önbelleğe alma” sayfa 60
13FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Belleği saklama
Son güncelleme 30/3/2011
Bitmap altörnekleme
Belleğ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-bit
gö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.1'de mevcuttur.
Not: Flash Player 10.1'den önce bellekte oluşturulan tüm pikseller 32 bit'lik (4 bayt) bölümler halinde saklanıyordu. 300
x 300 piksellik basit bir logo 350 KB'lık bellek harcıyordu (300*300*4/1024). Bu yeni davranışla, aynı opak logosu
yalnızca 175 KB harcar. Logo saydamsa, 16 bit’e aşağı örneklenmez ve bellekte aynı boyutta yer kaplar. Bu özellik
yalnızca gömülü bitmap'ler 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 zor
olabilir. 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çin
bile farkları algılamak zordur. Ancak, resmi yakınlaştırırken az miktarda renk bozulması olabilir ve bir 32 bit degrade
gö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. Flash
Player 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üphaneden
veya bir [Embed] etiketinden gelebilir.
Not: Ayrıca, Flash Player 10.1 ve AIR 2.5, bitmap'leri 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.5'ten
ö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 bitmap'ler
Flash Player 10.1 ve AIR 2.5'te, aynı görüntünün birden fazla örneği oluşturulduğunda, tüm BitmapData örnekleri için
bitmap'in tek bir sürümü kullanılır. Aşağıdaki şema bu kavramı gösterir:
Bellekteki Görüntülenen
Logo Örneği
Logo Örneği
Bitmap Kaynağı
Bitmap Kaynağı
14FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Belleği saklama
Son güncelleme 30/3/2011
Flash Player 10.1 ve AIR 2.5'te bellekteki bitmap'ler
Bu yaklaşım bir uygulama tarafından birçok bitmap ile kullanılan bellek miktarını önemli ölçüde düşürür. Aşağıdaki
kod 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ülenen
Logo Örneği
Logo Örneği
Bitmap Kaynağı
15FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Belleği saklama
Son güncelleme 30/3/2011
Birden 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 mobil
aygı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, new
Point(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:
16FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Belleği saklama
Son güncelleme 30/3/2011
Bir örneği değiştirmenin sonucu
Dahili 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şturulur
ve başka herhangi bir örnek güncellenmez. Aşağıdaki resim bu kavramı gösterir:
Bir bitmap'i değiştirmenin bellekteki sonucu
Tek bir yıldız değiştirilirse, bellekte yeni bir kopya oluşturulur. Sonuçta elde edilen animasyon, Flash Player 10.1 ve
AIR 2.5'te bellekten yaklaşık 8 KB kullanır.
Bellekteki Görüntülenen
Logo Örneği
Logo Örneği
Logo Örneği
setPixel()
Bitmap Kaynağı
Bitmap Kaynağı
17FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Belleği saklama
Son 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çin
beginBitmapFill() yöntemi en uygun yöntemdir:
var container:Sprite = new Sprite();
var source:BitmapData = new Star(0,0);
// Fill the surface with the source BitmapData
container.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 olarak
dö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 Matrix
nesnesini 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 stars
matrix.rotate(angle);
// Clear the content
container.graphics.clear();
// Fill the surface with the source BitmapData
container.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:
18FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Belleği saklama
Son güncelleme 30/3/2011
Döndürülen yıldızların sonucu
Bu yaklaşımla, orijinal kaynak BitmapData nesnesinin güncellenmesi otomatik olarak onun sahne alanındaki
herhangi 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 olup
olmadığı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 bitmap'i kaldırma
Pixel 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 aza
indirmeye çalışın. Bir görüntüleme nesnesine bir filtre uygulandığında, çalışma zamanı bellekte iki bitmap oluşturur.
Bu bitmap'lerin her biri görüntüleme nesnesinin boyutundadır. Birincisi, görüntüleme nesnesinin rasterleştirilmiş bir
versiyonu olarak oluşturulur ve sonrasında uygulanan filtre ile ikinci bir bitmap üretmek için kullanılır.
19FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Belleği saklama
Son güncelleme 30/3/2011
Filtre uygulandığında bellekte bulunan iki bitmap
Bir filtrenin özelliklerinden birini değiştirirken, ortaya çıkacak bitmap'in oluşturulması için bitmap'lerin ikisi de
bellekte 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çinde
değ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, bir
bulanıklaştırma filtresi uygulanan bir metin nesnesi düşünün. Bu durumda metin basit dekorasyon için kullanılır ve
değ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 yeniden
oluş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ş
bitmap'lerin kullanılması iyi bir uygulamadır. ActionScript’te çalışma zamanında oluşturulmuş dinamik bitmap'leri
kullanmaktan kaçının. Harici olarak geliştirilmiş bitmap'lerin kullanılması, özellikle filtre özellikleri zaman içinde
değ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çbir
işlem yapmadan görüntüleyebilirsiniz, bu işlem çok daha hızlı olabilir.
Doğrudan mipmap oluşturma
Gerekirse, büyük görüntüleri ölçeklendirirken mipmap oluşturma özelliğini kullanın.
Flash Player 10.1 ve AIR 2.5'te mevcut olan başka yeni bir özellik mipmap oluşturmayla ilgilidir. Flash Player 9 ve AIR
1.0, ölçeği küçültülmüş bitmap'lerin kalite ve performansını iyileştiren bir mipmap oluşturma özelliği sunmuştu.
Bellekteki Görüntülenen
Sonuç
Filtrelenmemiş bitmap versiyonu
Filtrelenmiş bitmap versiyonu
20FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Belleği saklama
Son güncelleme 30/3/2011
Not: Mipmap oluşturma özelliği yalnızca dinamik olarak yüklenmiş görüntüler veya gömülü bitmap'ler için geçerlidir.
Mipmap oluşturma filtrelenen veya önbelleğe alınan görüntüleme nesnelerine uygulanmaz. Mipmap oluşturma yalnızca
bitmap çift sayı olan bir genişlik ve yüksekliğe sahipse işlenebilir. Tek sayı olan bir genişlik veya yükseklikle
karşılaşıldığında, mipmap oluşturma durur. Örneğin, 250 x 250 boyutunda bir görüntüye 125 x 125 olacak şekilde
mipmap oluşturma uygulanabilir ancak daha fazlası uygulanamaz. Bu durumda, boyutların en az bir tanesi tek sayıdır.
İkinin üsleri olan boyutlara sahip bitmap'ler 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 minik
resim oluşturmak için ölçeklemek istediğini düşünün. Mipmap oluşturma özelliği, bitmap'in orta seviye altörnekleme
versiyonları kullanılarak ölçeklendirildiğinde görüntüyü düzgün bir şekilde oluşturur. Çalışma zamanının önceki
sürümleri bellekte bitmap'in orta seviye altörneklenmiş sürümlerini oluşturuyordu. 1024 x 1024 boyutlarında bir
görüntü 64 x 64 şeklinde yüklenip görüntülendiğinde, çalışma zamanının eski sürümleri yarı boyutlu bitmap'lerin her
birini oluştururdu. Örneğin, bu durumda 512 x 512, 256 x 256, 128 x 128 ve 64 x 64 bitmap'ler 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) mipmap'i 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 bitmap
kullanılıyorsa, 4 MB orijinal bitmap bellekten boşaltılır. Mipmap'in yeniden oluşturulması gerekiyorsa, orijinal bitmap
yeniden yüklenir. Ayrıca, çeşitli boyutlarda başka mipmap'i oluşturulmuş bitmap'ler gerekiyorsa, bitmap'in
oluşturulması için bitmap'lerin 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 bitmap'ler incelenir. Başka versiyonlar
bulunmazsa, 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 şeklinde
açılmasına olanak tanır. Mipmap'in oluşturulması önemli ölçüde daha hızlıdır; büyük bitmap'ler tarafından kullanılan
bellek 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ş bitmap'lerin
kalitesini 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 bitmap'lerle işleme başlamayın.
3B efektlerini kullanma
3B 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 motoru
sundu. 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 perspektifi
dönüştürülmüş görüntüleme nesnesinin bir bitmap olarak rasterleştirildiğini ve bundan dolayı daha fazla bellek
gerektirdiğ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:
21FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Belleği saklama
Son güncelleme 30/3/2011
Perspektif dönüştürme sonucu ortaya çıkan kenar yumuşatma
Kenar yumuşatma, vektör içeriğinin bitmap olarak dinamik bir şekilde rasterleştirilmesinin sonucudur. Bu kenar
yumuşatma, AIR ve Flash Player'ın masaüstü sürümünde ve mobil için AIR 2.0.1 ve AIR 2.5'te 3B efektler
kullandığınızda gerçekleşir. Ancak mobil aygıtlar için Flash Player'a kenar yumuşatma uygulanmaz.
3B efektinizi yerel API'ye dayanmadan elle oluşturabiliyorsanız, bu da bellek kullanımını azaltabilir. Ancak Flash
Player 10 ve AIR 1.5'te tanıtılan yeni 3B özellikleri doku eşlemeyi drawTriangles() gibi yöntemler sayesinde çok
daha 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 iyi
performans 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, 3B
dönüştürmeleri yapar. Ancak renderModeCPU olursa, 3B dönüştürmeleri GPU değil, CPU gerçekleştirir. Flash Player
10.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ın
bellekte iki bitmap gerektireceğini dikkate alın. Bir bitmap kaynak bitmap için ve ikinci bir bitmap de perspektifi
dö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, CPU
3B dönüştürmeler yaptığında, 3B özelleri tutumlu şekilde kullanın.
Metin nesneleri ve bellek
Salt 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 Metin
Motoru'nu (FTE) sunmuştu. Ancak, FTE üzerine flash.text.engine paketinde sağlanan ek bir ActionScript 3.0 katmanı
gerektiren düşük düzeyli bir API'dir.
22FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
Belleği saklama
Son güncelleme 30/3/2011
Salt okunur metinler için, düşük bellek kullanımı ve daha iyi oluşturma sunan Flash Metin Motoru kullanılması en
iyisidir. Giriş metni için, girdi işleme ve kelime sarma gibi genel davranışlar oluşturmak için daha az ActionScript
gerektiğinden, TextField nesnelerini kullanmak daha iyi bir seçimdir.
Daha fazla Yardım konusu
“Metin nesnelerinin oluşturulması” sayfa 66
Olay 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 yeniden
kullanımı için en iyileştirilmiştir. dispatchEvent() yöntemi dinleyici listesi üzerinden döngüde ilerler ve kayıtlı her
nesnede olay işleyicisini çağırır. Ancak olay modelinin dezavantajlarından biri uygulamanızı kullandığınız süre
boyunca ç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. Bildirimin
tamamlanması 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şlevi
kullanmak işlemine göre daha fazla bellek kullanabilir. Olay nesneleri bellekte oluşturulmalı ve ayrılmalıdır; bu da
performansta düşüşe neden olur. Örneğin Event.ENTER_FRAME olayını dinlerken olay işleyicisi için her karede yeni
bir 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.
23
Son güncelleme 30/3/2011
Bölüm 3: CPU kullanımını en aza indirme
En 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ştirmeleri
Flash Player 10.1 CPU işlemeden tasarruf etmeyi sağlayan iki yeni özellik sunar. Özellikler arasında, ekran dışına
gittiğinde SWF içeriğinin duraklatılması ve devam ettirilmesi ve bir sayfadaki Flash Player örnekleri sayısının
sınırlandırılması yer alır.
Duraklatma ve devam etme
Not: 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) devre
dışı örneklerle ilgili yeni bir özellik sunar. Bu özellik ekrandaki içerik açılıp kapatıldığında SWF dosyasını duraklatıp
devam ettirerek işlemci kullanımını kısıtlamanıza izin verir. Bu özellikle, Flash Player içeriğin oynatılması devam
ettirildiğ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şturma
durur. Herhangi bir ses veya video yürütülmüyorsa, oynatmanın veya ActionScript yürütülmesinin
duraklatılmadığından emin olmak için hasPriority HTML parametresini true olarak ayarlayın. Ancak, içerik
ekranın dışındayken veya gizliyken hasPriority HTML parametresinin değerine bakılmaksızın SWF içeriği
oluş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. Ses
ve video yürütülmesi durdurulur ve SWF içeriği görünür hale gelmedikçe içerik oluşturma işlemine devam
edilmez.
Örnek yönetimi
Not: Ö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" />
24FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
CPU kullanımını en aza indirme
Son güncelleme 30/3/2011
Bu özellik bir sayfada başlatılmış olan Flash Player örneklerinin sayısını kısıtlar. Örneklerin sayısını kısıtlamak işlemci
ve pil kaynaklarını korumaya yardım eder. Amaç bir sayfadaki diğer içeriğe içerik önceliği vererek SWF içeriğine belirli
bir öncelik atamaktır. Basit bir örnek düşünün: kullanıcı bir web sitesini taramaktadır ve dizin sayfası üç farklı SWF
dosyası 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 ekran
dışıdır ve kaydırmayı gerektirir. İlk iki animasyon normal şekilde başlatılır ancak sonuncusu görünür olana kadar
ertelenir. hasPriority parametresi mevcut olmadığında veya false değerine ayarlandığında bu senaryo varsayılan
davranıştır. Bir SWF dosyasının ekran dışı olsa da başlatılmasını sağlamak için, hasPriority parametresini true
değerine ayarlayın. Ancak, hasPriority parametresinin değerinden bağımsız olarak, kullanıcıya görünmeyen bir
SWF 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, herhangi
bir 1x1 piksel veya 0x0 piksel içerik SWF dosyalarının ertelenmesini önleyerek başlatılır. Ancak SWF dosyaları halen
tı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 etkileri
kullanıcının aygıtında görünür olan alan
SWF
hasPriority false olarak
ayarlanmış veya
mevcut değil
SWF filmi başlatıldı
SWF filmi başlatılmadı
SWF
hasPriority false olarak
ayarlanmış veya
mevcut değil
SWF
hasPriority false
olarak ayarlanmış
veya mevcut değil
25FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
CPU kullanımını en aza indirme
Son güncelleme 30/3/2011
hasPriority parametresi için farklı değerlerin etkileri
Uyku modu
Flash 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, mobil
uygulama kullanan bir kullanıcı rahatsız edilirse ve aygıtı kullanmayı bırakırsa, çalışma zamanı arka ışığın ne zaman
uyku moduna girdiğini algılar. Daha sonra kare hızını saniyede 4 kareye (fps) düşürür ve oluşturmayı duraklatır. AIR
uygulamaları için ayrıca uygulama arka plana geçtiğinde uyku modu başlar.
ActionScript kodu Stage.frameRate özelliğini 4 fps'ye ayarlamaya benzer olarak uyku modunda çalışmaya devam
eder. Ancak oluşturma adımı atlanır, böylece kullanıcı oynatıcının 4 fps'de çalıştığını göremez. Sıfır yerine 4 fps'lik bir
kare hızı seçildi, çünkü bu tüm bağlantıların açık kalmasına olanak verir (NetStream, Socket ve NetConnection). Sıfıra
geçmek tüm açık bağlantıları keser. Çoğu aygıt üreticisi yenileme hızı olarak 250 ms'lik (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 kare
hı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ın
müzik oynattığı bir medya oynatıcı uygulaması düşünün. Ekran uyku moduna girerse, çalışma zamanı oynatılmakta
olan 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 fps'ye 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 ışığı her
zaman açık olmaya zorlar.
kullanıcının aygıtında görünür olan alan
SWF
hasPriority false olarak
ayarlanmış veya
mevcut değil
SWF
hasPriority true
olarak ayarlanmış
SWF filmi başlatıldı
SWF filmi başlatılmadı
SWF
hasPriority false
olarak ayarlanmış
veya mevcut değil
26FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
CPU kullanımını en aza indirme
Son 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 getirir
ve 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 durumunu
varsayı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 fps'ye 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 eder
ancak 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 çözme
REMOVED_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 listesinde
olmasa 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 ve
Event.ADDED_TO_STAGE olaylarıyla doğru uygun biçimde dondurmak ve çözmek çok önemlidir. Aşağıdaki örnekte
klavye ile etkileşen sahne alanında oynatılan bir film klibi gösterilmektedir:
// Listen to keyboard events
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyIsDown);
stage.addEventListener(KeyboardEvent.KEY_UP, keyIsUp);
// Create object to store key states
var keys:Dictionary = new Dictionary(true);
function keyIsDown(e:KeyboardEvent):void
{
// Remember that the key was pressed
keys[e.keyCode] = true;
if (e.keyCode==Keyboard.LEFT || e.keyCode==Keyboard.RIGHT)
{
runningBoy.play();
}
}
function keyIsUp(e:KeyboardEvent):void
{
// Remember that the key was released
keys[e.keyCode] = false;
for each (var value:Boolean in keys)
if ( value ) return;
runningBoy.stop();
27FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
CPU kullanımını en aza indirme
Son 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 klibi
Kaldır düğmesi tıklatıldığında, film klibi görüntüleme listesinden kaldırılır:
28FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
CPU kullanımını en aza indirme
Son güncelleme 30/3/2011
// Show or remove running boy
showBtn.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. Film
klibi ç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_STAGE
runningBoy.addEventListener(Event.ADDED_TO_STAGE,activate);
runningBoy.addEventListener(Event.REMOVED_FROM_STAGE,deactivate);
function activate(e:Event):void
{
// Restart everything
e.currentTarget.addEventListener(Event.ENTER_FRAME,handleMovement);
}
function deactivate(e:Event):void
{
// Freeze the running boy - consumes fewer CPU resources when not shown
e.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 klavye
doğ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ı nesnenin
dondurulmasını sağlamaz. Çöp toplayıcı çalışmıyorsa, nesne artık görüntülenmese de bellek ve işlemci işlemesini
kullanmaya devam eder. Nesnenin mümkün olduğunca az işlemci işlemesini kullanmasını sağlamak için, onu
görüntüleme listesinden kaldırırken tamamen dondurduğunuzdan emin olun.
Flash Player 10 ve AIR 1.5'ten 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 ve
AIR 1.0 ile kullanılırken, içeriğin LoaderInfo nesnesi tarafından gönderilen Event.UNLOAD olayının dinlenmesi
yoluyla 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 bir
SWF dosyasını kaldırmanıza, yüklü olan SWF dosyasındaki her nesneyi otomatik olarak dondurmanıza ve çöp
toplayı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.
29FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
CPU kullanımını en aza indirme
Son güncelleme 30/3/2011
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 no automatic object deactivation
// All deactivation must be processed manually
loader.unload();
}
Dondurmayı yerel olarak işleyip çöp toplama işlemini çalışmaya zorlayan unloadAndStop() yöntemini kullanmak iyi
bir 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 automatically
loader.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 ve
Event.DEACTIVATE öğelerinin gönderilmesi durdurulur.
Olayları etkinleştirme ve devre dışı bırakma
Arka plan etkinsizliğini algılamak ve uygulamanızı uygun şekilde en iyileştirmek için Event.ACTIVATE ve
Event.DEACTIVATE olaylarını kullanın.
30FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
CPU kullanımını en aza indirme
Son 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çin
uygulamanıza hassas ayar yapmanıza yardımcı olabilir. Bu olaylar, çalışma zamanının ne zaman odak kazandığını veya
kaybettiğ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 rate
stage.frameRate = originalFrameRate;
}
function onDeactivate ( e:Event ):void
{
// set frame rate to 0
stage.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ştirmek
yerine, 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 Netbook'larda bulunan "Duraklat ve Devam
Ettir" ö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 26
Fare etkileşimleri
Fare 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 nesne
ekranda gösterildiğinde yoğun işlemci kullanımı gerektirebilir. Bu işlemeden kaçınmak için kolay bir yöntem de, fare
etkileşimi gerektirmeyen nesnelerdeki fare etkileşimlerini devre dışı bırakmaktır. Aşağıdaki kod mouseEnabled ve
mouseChildren özelliklerinin kullanımını gösterir:
31FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
CPU kullanımını en aza indirme
Son güncelleme 30/3/2011
// Disable any mouse interaction with this InteractiveObject
myInteractiveObject.mouseEnabled = false;
const MAX_NUM:int = 10;
// Create a container for the InteractiveObjects
var container:Sprite = new Sprite();
for ( var i:int = 0; i< MAX_NUM; i++ )
{
// Add InteractiveObject to the container
container.addChild( new Sprite() );
}
// Disable any mouse interaction on all the children
container.mouseChildren = false;
Mümkün olduğunca fare etkileşimini devre dışı bırakmayı göz önünde bulundurun. Bu, uygulamanızın daha az
işlemci işlemesi kullanmasını sağlar ve bunun bir sonucu olarak da mobil aygıtlarda pil kullanımının azaltılmasına
yardımcı olur.
Zamanlayıcılarla ENTER_FRAME olaylarının
karşı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ılar
tercih 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şım
ise 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ıklarla
kodunuzun ç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 olarak
gö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ı indirme
veya 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üncelleme
hızında günceller. Yüksek güncelleme hızı TimerEvent nesnesindeki updateAfterEvent() yöntemi ile sağlanır. Bu
yöntem ekranı gerektiğinde zamanlayıcı her olay gönderdiğinde güncellenmeye zorlar. Aşağıdaki kod bu fikri
göstermektedir:
32FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
CPU kullanımını en aza indirme
Son güncelleme 30/3/2011
// Use a low frame rate for the application
stage.frameRate = 10;
// Choose one update per second
var 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 screen
e.updateAfterEvent();
}
updateAfterEvent() yönteminin çağrılması kare hızını değiştirmez. Yalnızca çalışma zamanını, ekrandaki değişen
içeriği güncellemeye zorlar. Zaman çizelgesi halen 10 kare/saniyede çalışmaktadır. Düşük performanslı aygıtlarda veya
olay işleyici işlemlerinin ağır işleme gerektiren kodlar barındırması durumunda zamanlayıcıların ve ENTER_FRAME
olaylarının tam olarak doğru olmadığını unutmayın. SWF dosyasının kare hızında olduğu gibi, zamanlayıcının
gü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şlemin
gerç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ünde
bulundurun. 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 ve
gö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 öğesi
kullanın. Daha az sıklıkta gerçekleşen veya arka plan işlemleri için her 2000 milisaniyede bir tetiklenen başka bir
Timer öğesi kullanın.
• Tek bir Timer nesnesi kullanın ve işlemlerin Timer nesnesinin birden fazla delay özelliği aralığında tetiklenmesini
sağlayın.
Örneğin, 100 milisaniyede bir gerçekleşmesi gereken işlemleriniz ve 200 milisaniyede gerçekleşmesini istediğiniz
başka işlemler olduğunu varsayın. Bu durumda, 100 milisaniyelik bir delay değeri olan tek bir Timer nesnesi
kullanı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:
33FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
CPU kullanımını en aza indirme
Son güncelleme 30/3/2011
var 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 ms
if (!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 true
olmadığı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üleme
nesnelerinin 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ölgesi
büyükse veya küçük olmasına rağmen yüksek miktarda veya karmaşık görüntüleme nesneleri içeriyorsa, çalışma
zamanının oluşturma için daha fazla süreye ihtiyacı vardır. İstenen yeniden çizme miktarını test etmek için, Flash
Player’ı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 63
Hareket 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ı kullanma
eğ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.
34
Son güncelleme 30/3/2011
Bö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çin
bir 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: 107
Aş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 length
var 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
35FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
ActionScript 3.0 performansı
Son güncelleme 30/3/2011
Vektörün boyutu önceden belirlenmezse, vektör alanı azaldıkça boyut artar. Vektör boyutu her arttığında yeni bir
bellek 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 kopyalama
işlemi performansa zarar verir. Yukarıdaki kod vektörün ilk boyutunu belirleyerek performans için en iyi hale
getirilmiştir. Ancak kod korunabilirlik açısından en iyi hale getirilmemiştir. Korunabilirliği arttırmak için yeniden
kullanılmış değeri bir sabitte depolayın:
// Store the reused value to maintain code easily
const 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: 47
Mümkün oldukça, daha hızlı çalıştıkları için Vector nesnesi API'lerini kullanmaya çalışın.
Çizim API'si
Daha hızlı kod çalıştırma için çizim API'sini kullanın.
Flash Player 10 ve AIR 1.5, daha iyi kod çalıştırma performansı edinmenize olanak vermek için yeni bir çizim API'si
sağ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 API'si 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şlemeyi
iş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 );
36FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
ActionScript 3.0 performansı
Son güncelleme 30/3/2011
Aş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 tetikleme
Olay 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ın
iç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 oyun
yarattığı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 elma
tarafı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 event
currentApple.addEventListener ( MouseEvent.CLICK, onAppleClick );
}
function onAppleClick ( e:MouseEvent ):void
{
currentAppleClicked = e.currentTarget as InteractiveObject;
currentAppleClicked.removeEventListener(MouseEvent.CLICK, onAppleClick );
removeChild ( currentAppleClicked );
}
37FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME
ActionScript 3.0 performansı
Son güncelleme 30/3/2011
Kod, her bir Apple örneğinde addEventListener() yöntemini çağırır. Ayrıca bir elma tıklatıldığında
removeEventListener 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öntemlerine
yapı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çe
tetikleme 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 apple's parent
// Passing true as third parameter catches the event during its capture phase
container.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 en
iyileş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 ileterek
olayı dıştan içe tetiklemede kullanılabilir:
// Listen to the MouseEvent.CLICK on apple's parent
// Passing false as third parameter catches the event during its bubbling phase
container.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 );
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe
Flashplatform optimizing content türkçe

Weitere ähnliche Inhalte

Was ist angesagt?

Adobe Fireworks CS4 Kullanım Kitapçığı Türkçe
Adobe Fireworks CS4 Kullanım Kitapçığı TürkçeAdobe Fireworks CS4 Kullanım Kitapçığı Türkçe
Adobe Fireworks CS4 Kullanım Kitapçığı Türkçedeniz armutlu
 
Zaxcom Nomad kullanım kılavuzu
Zaxcom Nomad kullanım kılavuzuZaxcom Nomad kullanım kılavuzu
Zaxcom Nomad kullanım kılavuzuRadikal Ltd.
 
Analog devre elemanları
Analog devre elemanlarıAnalog devre elemanları
Analog devre elemanlarıErol Dizdar
 
Doğru akım ve alternatif akım devreleri
Doğru akım ve alternatif akım devreleriDoğru akım ve alternatif akım devreleri
Doğru akım ve alternatif akım devreleriErol Dizdar
 
Görüntü işleme
Görüntü işlemeGörüntü işleme
Görüntü işlemeErol Dizdar
 
YÜZ BULMA VE TANIMA SİSTEMLERİ KULLANARAK
YÜZ BULMA VE TANIMA SİSTEMLERİ KULLANARAKYÜZ BULMA VE TANIMA SİSTEMLERİ KULLANARAK
YÜZ BULMA VE TANIMA SİSTEMLERİ KULLANARAKRecep Holat
 
vehicle gearbox modelling
vehicle gearbox modellingvehicle gearbox modelling
vehicle gearbox modellingmustafa köstek
 

Was ist angesagt? (17)

Fireworks cs5 help
Fireworks cs5 helpFireworks cs5 help
Fireworks cs5 help
 
Dreamweaver cs5 help
Dreamweaver cs5 helpDreamweaver cs5 help
Dreamweaver cs5 help
 
Adobe Fireworks CS4 Kullanım Kitapçığı Türkçe
Adobe Fireworks CS4 Kullanım Kitapçığı TürkçeAdobe Fireworks CS4 Kullanım Kitapçığı Türkçe
Adobe Fireworks CS4 Kullanım Kitapçığı Türkçe
 
Illustrator cs5 help part 0001
Illustrator cs5 help part 0001Illustrator cs5 help part 0001
Illustrator cs5 help part 0001
 
Indesign cs5 help part 0001
Indesign cs5 help part 0001Indesign cs5 help part 0001
Indesign cs5 help part 0001
 
Trt staj 2
Trt staj 2Trt staj 2
Trt staj 2
 
Zaxcom Nomad kullanım kılavuzu
Zaxcom Nomad kullanım kılavuzuZaxcom Nomad kullanım kılavuzu
Zaxcom Nomad kullanım kılavuzu
 
213 gim016
213 gim016213 gim016
213 gim016
 
Analog devre elemanları
Analog devre elemanlarıAnalog devre elemanları
Analog devre elemanları
 
Doğru akım ve alternatif akım devreleri
Doğru akım ve alternatif akım devreleriDoğru akım ve alternatif akım devreleri
Doğru akım ve alternatif akım devreleri
 
Avid hd omni tr
Avid hd omni trAvid hd omni tr
Avid hd omni tr
 
Görüntü işleme
Görüntü işlemeGörüntü işleme
Görüntü işleme
 
YÜZ BULMA VE TANIMA SİSTEMLERİ KULLANARAK
YÜZ BULMA VE TANIMA SİSTEMLERİ KULLANARAKYÜZ BULMA VE TANIMA SİSTEMLERİ KULLANARAK
YÜZ BULMA VE TANIMA SİSTEMLERİ KULLANARAK
 
SAP PP İçindekiler
SAP PP İçindekilerSAP PP İçindekiler
SAP PP İçindekiler
 
Visual studio
Visual studioVisual studio
Visual studio
 
481 bb0091
481 bb0091481 bb0091
481 bb0091
 
vehicle gearbox modelling
vehicle gearbox modellingvehicle gearbox modelling
vehicle gearbox modelling
 

Andere mochten auch

ASP.Net MVC ile Web Uygulamaları -14(Spark ViewEngine)
ASP.Net MVC ile Web Uygulamaları -14(Spark ViewEngine)ASP.Net MVC ile Web Uygulamaları -14(Spark ViewEngine)
ASP.Net MVC ile Web Uygulamaları -14(Spark ViewEngine)İbrahim ATAY
 
Adobe Flash ActionScript 3 Programlama Türkçe
Adobe Flash ActionScript 3 Programlama TürkçeAdobe Flash ActionScript 3 Programlama Türkçe
Adobe Flash ActionScript 3 Programlama Türkçedeniz armutlu
 
Final Paper UTP Web Development Application July 2009
Final Paper UTP Web Development Application July 2009Final Paper UTP Web Development Application July 2009
Final Paper UTP Web Development Application July 2009Firdaus Adib
 
ASP.Net MVC ile Web Uygulamaları -5(Logger)
ASP.Net MVC ile Web Uygulamaları -5(Logger)ASP.Net MVC ile Web Uygulamaları -5(Logger)
ASP.Net MVC ile Web Uygulamaları -5(Logger)İbrahim ATAY
 
Final Paper UTP Algorithm Data Structure July 2008
Final Paper UTP Algorithm Data Structure July 2008Final Paper UTP Algorithm Data Structure July 2008
Final Paper UTP Algorithm Data Structure July 2008Firdaus Adib
 
ASP.Net MVC ile Web Uygulamaları -9(NHibernate Configutarion)
ASP.Net MVC ile Web Uygulamaları -9(NHibernate Configutarion)ASP.Net MVC ile Web Uygulamaları -9(NHibernate Configutarion)
ASP.Net MVC ile Web Uygulamaları -9(NHibernate Configutarion)İbrahim ATAY
 
ASP.Net MVC ile Web Uygulamaları -15(Layout ve View)
ASP.Net MVC ile Web Uygulamaları -15(Layout ve View)ASP.Net MVC ile Web Uygulamaları -15(Layout ve View)
ASP.Net MVC ile Web Uygulamaları -15(Layout ve View)İbrahim ATAY
 
ImageThink SXSW Interactive, March 13, 2015
ImageThink SXSW Interactive, March 13, 2015ImageThink SXSW Interactive, March 13, 2015
ImageThink SXSW Interactive, March 13, 2015ImageThink
 
Yazılım ve-yazılımcı-nedir- net-ve-net-platformu
Yazılım ve-yazılımcı-nedir- net-ve-net-platformuYazılım ve-yazılımcı-nedir- net-ve-net-platformu
Yazılım ve-yazılımcı-nedir- net-ve-net-platformuAhmet S.
 
Algoritma Nedir?
Algoritma Nedir?Algoritma Nedir?
Algoritma Nedir?Ahmet S.
 
Expert Business Speaker_Mike Wittenstein
Expert Business Speaker_Mike WittensteinExpert Business Speaker_Mike Wittenstein
Expert Business Speaker_Mike WittensteinMike Wittenstein
 
Final Paper UTP Web Development Application January 2010
Final Paper UTP Web Development Application January 2010Final Paper UTP Web Development Application January 2010
Final Paper UTP Web Development Application January 2010Firdaus Adib
 
Adobe Flash ActionScript 3 components help Türkçe
Adobe Flash ActionScript 3 components help TürkçeAdobe Flash ActionScript 3 components help Türkçe
Adobe Flash ActionScript 3 components help Türkçedeniz armutlu
 
Final Paper UTP Web Development Application July 2008
Final Paper UTP Web Development Application July 2008Final Paper UTP Web Development Application July 2008
Final Paper UTP Web Development Application July 2008Firdaus Adib
 
ASP.Net MVC ile Web Uygulamaları -12(Test Drive Developmet)
ASP.Net MVC ile Web Uygulamaları -12(Test Drive Developmet)ASP.Net MVC ile Web Uygulamaları -12(Test Drive Developmet)
ASP.Net MVC ile Web Uygulamaları -12(Test Drive Developmet)İbrahim ATAY
 
ASP.Net MVC ile Web Uygulamaları -13(AntiXSSLibrary)
ASP.Net MVC ile Web Uygulamaları -13(AntiXSSLibrary)ASP.Net MVC ile Web Uygulamaları -13(AntiXSSLibrary)
ASP.Net MVC ile Web Uygulamaları -13(AntiXSSLibrary)İbrahim ATAY
 

Andere mochten auch (20)

ASP.Net MVC ile Web Uygulamaları -14(Spark ViewEngine)
ASP.Net MVC ile Web Uygulamaları -14(Spark ViewEngine)ASP.Net MVC ile Web Uygulamaları -14(Spark ViewEngine)
ASP.Net MVC ile Web Uygulamaları -14(Spark ViewEngine)
 
Adobe Flash ActionScript 3 Programlama Türkçe
Adobe Flash ActionScript 3 Programlama TürkçeAdobe Flash ActionScript 3 Programlama Türkçe
Adobe Flash ActionScript 3 Programlama Türkçe
 
Final Paper UTP Web Development Application July 2009
Final Paper UTP Web Development Application July 2009Final Paper UTP Web Development Application July 2009
Final Paper UTP Web Development Application July 2009
 
ASP.Net MVC ile Web Uygulamaları -5(Logger)
ASP.Net MVC ile Web Uygulamaları -5(Logger)ASP.Net MVC ile Web Uygulamaları -5(Logger)
ASP.Net MVC ile Web Uygulamaları -5(Logger)
 
LinkedIn for students
LinkedIn for studentsLinkedIn for students
LinkedIn for students
 
Final Paper UTP Algorithm Data Structure July 2008
Final Paper UTP Algorithm Data Structure July 2008Final Paper UTP Algorithm Data Structure July 2008
Final Paper UTP Algorithm Data Structure July 2008
 
Prof hi̇t araştırmaları II Grupları 2014 2015 2. Dönem
Prof hi̇t araştırmaları II Grupları 2014 2015 2. DönemProf hi̇t araştırmaları II Grupları 2014 2015 2. Dönem
Prof hi̇t araştırmaları II Grupları 2014 2015 2. Dönem
 
ASP.Net MVC ile Web Uygulamaları -9(NHibernate Configutarion)
ASP.Net MVC ile Web Uygulamaları -9(NHibernate Configutarion)ASP.Net MVC ile Web Uygulamaları -9(NHibernate Configutarion)
ASP.Net MVC ile Web Uygulamaları -9(NHibernate Configutarion)
 
.net framework
.net framework.net framework
.net framework
 
ASP.Net MVC ile Web Uygulamaları -15(Layout ve View)
ASP.Net MVC ile Web Uygulamaları -15(Layout ve View)ASP.Net MVC ile Web Uygulamaları -15(Layout ve View)
ASP.Net MVC ile Web Uygulamaları -15(Layout ve View)
 
Prof. hi̇t. araştirmlari i
Prof. hi̇t. araştirmlari iProf. hi̇t. araştirmlari i
Prof. hi̇t. araştirmlari i
 
ImageThink SXSW Interactive, March 13, 2015
ImageThink SXSW Interactive, March 13, 2015ImageThink SXSW Interactive, March 13, 2015
ImageThink SXSW Interactive, March 13, 2015
 
Yazılım ve-yazılımcı-nedir- net-ve-net-platformu
Yazılım ve-yazılımcı-nedir- net-ve-net-platformuYazılım ve-yazılımcı-nedir- net-ve-net-platformu
Yazılım ve-yazılımcı-nedir- net-ve-net-platformu
 
Algoritma Nedir?
Algoritma Nedir?Algoritma Nedir?
Algoritma Nedir?
 
Expert Business Speaker_Mike Wittenstein
Expert Business Speaker_Mike WittensteinExpert Business Speaker_Mike Wittenstein
Expert Business Speaker_Mike Wittenstein
 
Final Paper UTP Web Development Application January 2010
Final Paper UTP Web Development Application January 2010Final Paper UTP Web Development Application January 2010
Final Paper UTP Web Development Application January 2010
 
Adobe Flash ActionScript 3 components help Türkçe
Adobe Flash ActionScript 3 components help TürkçeAdobe Flash ActionScript 3 components help Türkçe
Adobe Flash ActionScript 3 components help Türkçe
 
Final Paper UTP Web Development Application July 2008
Final Paper UTP Web Development Application July 2008Final Paper UTP Web Development Application July 2008
Final Paper UTP Web Development Application July 2008
 
ASP.Net MVC ile Web Uygulamaları -12(Test Drive Developmet)
ASP.Net MVC ile Web Uygulamaları -12(Test Drive Developmet)ASP.Net MVC ile Web Uygulamaları -12(Test Drive Developmet)
ASP.Net MVC ile Web Uygulamaları -12(Test Drive Developmet)
 
ASP.Net MVC ile Web Uygulamaları -13(AntiXSSLibrary)
ASP.Net MVC ile Web Uygulamaları -13(AntiXSSLibrary)ASP.Net MVC ile Web Uygulamaları -13(AntiXSSLibrary)
ASP.Net MVC ile Web Uygulamaları -13(AntiXSSLibrary)
 

Ähnlich wie Flashplatform optimizing content türkçe

Flash as3 bileşenlerini kullanma
Flash as3 bileşenlerini kullanmaFlash as3 bileşenlerini kullanma
Flash as3 bileşenlerini kullanmadeniz armutlu
 
Avid Pro Tools HD Native Kullanici Kilavuzu v90_69708
Avid Pro Tools HD Native Kullanici Kilavuzu v90_69708Avid Pro Tools HD Native Kullanici Kilavuzu v90_69708
Avid Pro Tools HD Native Kullanici Kilavuzu v90_69708Radikal Ltd.
 
Adobe flash cs4 pro uygulamasını kullanma
Adobe flash cs4 pro uygulamasını kullanmaAdobe flash cs4 pro uygulamasını kullanma
Adobe flash cs4 pro uygulamasını kullanmadeniz armutlu
 
optical character recognition(matlab)with feature extraction
  optical character recognition(matlab)with feature extraction  optical character recognition(matlab)with feature extraction
optical character recognition(matlab)with feature extractionmustafa köstek
 
Laravel51 türkçe sample
Laravel51 türkçe sampleLaravel51 türkçe sample
Laravel51 türkçe sampleEnis Demirci
 
makine öğrenmesi sınıflandırma(öğrenmeli öğrenme) yöntemlerinin weka ortamınd...
makine öğrenmesi sınıflandırma(öğrenmeli öğrenme) yöntemlerinin weka ortamınd...makine öğrenmesi sınıflandırma(öğrenmeli öğrenme) yöntemlerinin weka ortamınd...
makine öğrenmesi sınıflandırma(öğrenmeli öğrenme) yöntemlerinin weka ortamınd...mustafa köstek
 
Resimlerle web araçları hazırlama
Resimlerle web araçları hazırlamaResimlerle web araçları hazırlama
Resimlerle web araçları hazırlamaErol Dizdar
 
Beyaz Şapkalı Hacker Eğitimi Yardımcı Ders Notları
Beyaz Şapkalı Hacker Eğitimi Yardımcı Ders NotlarıBeyaz Şapkalı Hacker Eğitimi Yardımcı Ders Notları
Beyaz Şapkalı Hacker Eğitimi Yardımcı Ders NotlarıBGA Cyber Security
 
Beyazsapkalihackeregitimikitap 140409071714-phpapp02
Beyazsapkalihackeregitimikitap 140409071714-phpapp02Beyazsapkalihackeregitimikitap 140409071714-phpapp02
Beyazsapkalihackeregitimikitap 140409071714-phpapp02Öncü Furkan
 
Iç donanım birimleri
Iç donanım birimleriIç donanım birimleri
Iç donanım birimleriErol Dizdar
 
Beyazsapkalihackeregitimikitap2
Beyazsapkalihackeregitimikitap2Beyazsapkalihackeregitimikitap2
Beyazsapkalihackeregitimikitap2oxioxi3
 
Avid sync hd turkce
Avid sync hd turkceAvid sync hd turkce
Avid sync hd turkceRadikal Ltd.
 
Sunucu işletim sistemi 2
Sunucu işletim sistemi 2Sunucu işletim sistemi 2
Sunucu işletim sistemi 2Erol Dizdar
 
Comodo internet security 2011 ver. 5.0 Kullanim Klavuzu
Comodo internet security 2011 ver. 5.0 Kullanim KlavuzuComodo internet security 2011 ver. 5.0 Kullanim Klavuzu
Comodo internet security 2011 ver. 5.0 Kullanim KlavuzuEra Brown
 

Ähnlich wie Flashplatform optimizing content türkçe (17)

Flash as3 bileşenlerini kullanma
Flash as3 bileşenlerini kullanmaFlash as3 bileşenlerini kullanma
Flash as3 bileşenlerini kullanma
 
Avid Pro Tools HD Native Kullanici Kilavuzu v90_69708
Avid Pro Tools HD Native Kullanici Kilavuzu v90_69708Avid Pro Tools HD Native Kullanici Kilavuzu v90_69708
Avid Pro Tools HD Native Kullanici Kilavuzu v90_69708
 
Adobe flash cs4 pro uygulamasını kullanma
Adobe flash cs4 pro uygulamasını kullanmaAdobe flash cs4 pro uygulamasını kullanma
Adobe flash cs4 pro uygulamasını kullanma
 
optical character recognition(matlab)with feature extraction
  optical character recognition(matlab)with feature extraction  optical character recognition(matlab)with feature extraction
optical character recognition(matlab)with feature extraction
 
Laravel51 türkçe sample
Laravel51 türkçe sampleLaravel51 türkçe sample
Laravel51 türkçe sample
 
makine öğrenmesi sınıflandırma(öğrenmeli öğrenme) yöntemlerinin weka ortamınd...
makine öğrenmesi sınıflandırma(öğrenmeli öğrenme) yöntemlerinin weka ortamınd...makine öğrenmesi sınıflandırma(öğrenmeli öğrenme) yöntemlerinin weka ortamınd...
makine öğrenmesi sınıflandırma(öğrenmeli öğrenme) yöntemlerinin weka ortamınd...
 
SAP Portal kılavuzu
SAP Portal kılavuzuSAP Portal kılavuzu
SAP Portal kılavuzu
 
Resimlerle web araçları hazırlama
Resimlerle web araçları hazırlamaResimlerle web araçları hazırlama
Resimlerle web araçları hazırlama
 
BGA- BEYAZ SAPKALI HACKER EGITIMI
BGA- BEYAZ SAPKALI HACKER EGITIMIBGA- BEYAZ SAPKALI HACKER EGITIMI
BGA- BEYAZ SAPKALI HACKER EGITIMI
 
Beyaz Şapkalı Hacker Eğitimi Yardımcı Ders Notları
Beyaz Şapkalı Hacker Eğitimi Yardımcı Ders NotlarıBeyaz Şapkalı Hacker Eğitimi Yardımcı Ders Notları
Beyaz Şapkalı Hacker Eğitimi Yardımcı Ders Notları
 
Beyazsapkalihackeregitimikitap 140409071714-phpapp02
Beyazsapkalihackeregitimikitap 140409071714-phpapp02Beyazsapkalihackeregitimikitap 140409071714-phpapp02
Beyazsapkalihackeregitimikitap 140409071714-phpapp02
 
Iç donanım birimleri
Iç donanım birimleriIç donanım birimleri
Iç donanım birimleri
 
Beyazsapkalihackeregitimikitap2
Beyazsapkalihackeregitimikitap2Beyazsapkalihackeregitimikitap2
Beyazsapkalihackeregitimikitap2
 
Avid sync hd turkce
Avid sync hd turkceAvid sync hd turkce
Avid sync hd turkce
 
Sunucu işletim sistemi 2
Sunucu işletim sistemi 2Sunucu işletim sistemi 2
Sunucu işletim sistemi 2
 
Comodo internet security 2011 ver. 5.0 Kullanim Klavuzu
Comodo internet security 2011 ver. 5.0 Kullanim KlavuzuComodo internet security 2011 ver. 5.0 Kullanim Klavuzu
Comodo internet security 2011 ver. 5.0 Kullanim Klavuzu
 
Adonai ufal
Adonai ufalAdonai ufal
Adonai ufal
 

Mehr von deniz armutlu

Dijital olcme ve egitim araclari deniz 2014 v1
Dijital olcme ve egitim araclari deniz 2014 v1Dijital olcme ve egitim araclari deniz 2014 v1
Dijital olcme ve egitim araclari deniz 2014 v1deniz armutlu
 
Dönem sonu işlemleri
Dönem sonu işlemleriDönem sonu işlemleri
Dönem sonu işlemlerideniz armutlu
 
Adobe Flash cs4 türkçe
Adobe Flash cs4 türkçeAdobe Flash cs4 türkçe
Adobe Flash cs4 türkçedeniz armutlu
 
Adobe Flash cs4 türkçe
Adobe Flash cs4 türkçeAdobe Flash cs4 türkçe
Adobe Flash cs4 türkçedeniz armutlu
 
Adobe flash cs3 yardımcı el kitabı türkçe
Adobe flash cs3 yardımcı el kitabı türkçeAdobe flash cs3 yardımcı el kitabı türkçe
Adobe flash cs3 yardımcı el kitabı türkçedeniz armutlu
 
Adobe Fireworks CS3 Türkçe Yardım Kitapçığı
Adobe Fireworks CS3 Türkçe Yardım KitapçığıAdobe Fireworks CS3 Türkçe Yardım Kitapçığı
Adobe Fireworks CS3 Türkçe Yardım Kitapçığıdeniz armutlu
 
Fireworks CS4 Türkçe Kullanım Kitapçığı
Fireworks CS4 Türkçe Kullanım KitapçığıFireworks CS4 Türkçe Kullanım Kitapçığı
Fireworks CS4 Türkçe Kullanım Kitapçığıdeniz armutlu
 
Adobe photoshop cs3 tr
Adobe photoshop cs3 trAdobe photoshop cs3 tr
Adobe photoshop cs3 trdeniz armutlu
 
Deniz Armutlu CV (Özgeçmiş)Örneği
Deniz Armutlu CV (Özgeçmiş)ÖrneğiDeniz Armutlu CV (Özgeçmiş)Örneği
Deniz Armutlu CV (Özgeçmiş)Örneğideniz armutlu
 
Butun Derslerin 1. Donem Sonu Notlarim
Butun Derslerin 1. Donem Sonu NotlarimButun Derslerin 1. Donem Sonu Notlarim
Butun Derslerin 1. Donem Sonu Notlarimdeniz armutlu
 
Megep Veritabani Dersi Modul 2 Veritabaninda Tablolar
Megep  Veritabani Dersi Modul 2  Veritabaninda TablolarMegep  Veritabani Dersi Modul 2  Veritabaninda Tablolar
Megep Veritabani Dersi Modul 2 Veritabaninda Tablolardeniz armutlu
 
BTT Modul 13. Isletim Sistemleri Destek
BTT Modul 13. Isletim Sistemleri DestekBTT Modul 13. Isletim Sistemleri Destek
BTT Modul 13. Isletim Sistemleri Destekdeniz armutlu
 
BTT Modul 11 Isletim Sistemlerinin Temelleri
BTT Modul 11 Isletim Sistemlerinin TemelleriBTT Modul 11 Isletim Sistemlerinin Temelleri
BTT Modul 11 Isletim Sistemlerinin Temellerideniz armutlu
 
BTT Modul 12 Isletim Sistemi Kurulumu
BTT Modul 12 Isletim Sistemi KurulumuBTT Modul 12 Isletim Sistemi Kurulumu
BTT Modul 12 Isletim Sistemi Kurulumudeniz armutlu
 
BTT Modul 14 Isletim Sistemleri Gelismis Ozellikler Sunumu
BTT Modul 14 Isletim Sistemleri Gelismis Ozellikler SunumuBTT Modul 14 Isletim Sistemleri Gelismis Ozellikler Sunumu
BTT Modul 14 Isletim Sistemleri Gelismis Ozellikler Sunumudeniz armutlu
 
Veritabani.Modul1.Planlama.Ver.1.0
Veritabani.Modul1.Planlama.Ver.1.0Veritabani.Modul1.Planlama.Ver.1.0
Veritabani.Modul1.Planlama.Ver.1.0deniz armutlu
 
BTT. Modul1. Islemciler CPU
BTT. Modul1. Islemciler CPUBTT. Modul1. Islemciler CPU
BTT. Modul1. Islemciler CPUdeniz armutlu
 
BTT. Modul 14. Isletim Sistemleri Gelismis Ozellikler Megep Modulu
BTT. Modul 14. Isletim Sistemleri Gelismis Ozellikler Megep ModuluBTT. Modul 14. Isletim Sistemleri Gelismis Ozellikler Megep Modulu
BTT. Modul 14. Isletim Sistemleri Gelismis Ozellikler Megep Moduludeniz armutlu
 

Mehr von deniz armutlu (19)

Dijital olcme ve egitim araclari deniz 2014 v1
Dijital olcme ve egitim araclari deniz 2014 v1Dijital olcme ve egitim araclari deniz 2014 v1
Dijital olcme ve egitim araclari deniz 2014 v1
 
Dönem sonu işlemleri
Dönem sonu işlemleriDönem sonu işlemleri
Dönem sonu işlemleri
 
Adobe Flash cs4 türkçe
Adobe Flash cs4 türkçeAdobe Flash cs4 türkçe
Adobe Flash cs4 türkçe
 
Adobe Flash cs4 türkçe
Adobe Flash cs4 türkçeAdobe Flash cs4 türkçe
Adobe Flash cs4 türkçe
 
Adobe flash cs3 yardımcı el kitabı türkçe
Adobe flash cs3 yardımcı el kitabı türkçeAdobe flash cs3 yardımcı el kitabı türkçe
Adobe flash cs3 yardımcı el kitabı türkçe
 
Adobe Fireworks CS3 Türkçe Yardım Kitapçığı
Adobe Fireworks CS3 Türkçe Yardım KitapçığıAdobe Fireworks CS3 Türkçe Yardım Kitapçığı
Adobe Fireworks CS3 Türkçe Yardım Kitapçığı
 
Fireworks CS4 Türkçe Kullanım Kitapçığı
Fireworks CS4 Türkçe Kullanım KitapçığıFireworks CS4 Türkçe Kullanım Kitapçığı
Fireworks CS4 Türkçe Kullanım Kitapçığı
 
Adobe photoshop cs3 tr
Adobe photoshop cs3 trAdobe photoshop cs3 tr
Adobe photoshop cs3 tr
 
Deniz Armutlu CV (Özgeçmiş)Örneği
Deniz Armutlu CV (Özgeçmiş)ÖrneğiDeniz Armutlu CV (Özgeçmiş)Örneği
Deniz Armutlu CV (Özgeçmiş)Örneği
 
Butun Derslerin 1. Donem Sonu Notlarim
Butun Derslerin 1. Donem Sonu NotlarimButun Derslerin 1. Donem Sonu Notlarim
Butun Derslerin 1. Donem Sonu Notlarim
 
Megep Veritabani Dersi Modul 2 Veritabaninda Tablolar
Megep  Veritabani Dersi Modul 2  Veritabaninda TablolarMegep  Veritabani Dersi Modul 2  Veritabaninda Tablolar
Megep Veritabani Dersi Modul 2 Veritabaninda Tablolar
 
Photoshop Cs3
Photoshop Cs3Photoshop Cs3
Photoshop Cs3
 
BTT Modul 13. Isletim Sistemleri Destek
BTT Modul 13. Isletim Sistemleri DestekBTT Modul 13. Isletim Sistemleri Destek
BTT Modul 13. Isletim Sistemleri Destek
 
BTT Modul 11 Isletim Sistemlerinin Temelleri
BTT Modul 11 Isletim Sistemlerinin TemelleriBTT Modul 11 Isletim Sistemlerinin Temelleri
BTT Modul 11 Isletim Sistemlerinin Temelleri
 
BTT Modul 12 Isletim Sistemi Kurulumu
BTT Modul 12 Isletim Sistemi KurulumuBTT Modul 12 Isletim Sistemi Kurulumu
BTT Modul 12 Isletim Sistemi Kurulumu
 
BTT Modul 14 Isletim Sistemleri Gelismis Ozellikler Sunumu
BTT Modul 14 Isletim Sistemleri Gelismis Ozellikler SunumuBTT Modul 14 Isletim Sistemleri Gelismis Ozellikler Sunumu
BTT Modul 14 Isletim Sistemleri Gelismis Ozellikler Sunumu
 
Veritabani.Modul1.Planlama.Ver.1.0
Veritabani.Modul1.Planlama.Ver.1.0Veritabani.Modul1.Planlama.Ver.1.0
Veritabani.Modul1.Planlama.Ver.1.0
 
BTT. Modul1. Islemciler CPU
BTT. Modul1. Islemciler CPUBTT. Modul1. Islemciler CPU
BTT. Modul1. Islemciler CPU
 
BTT. Modul 14. Isletim Sistemleri Gelismis Ozellikler Megep Modulu
BTT. Modul 14. Isletim Sistemleri Gelismis Ozellikler Megep ModuluBTT. Modul 14. Isletim Sistemleri Gelismis Ozellikler Megep Modulu
BTT. Modul 14. Isletim Sistemleri Gelismis Ozellikler Megep Modulu
 

Flashplatform optimizing content türkçe

  • 2. Son güncelleme 30/3/2011 Telif Hakkı © 2011 Adobe Systems Incorporated and its licensors. All rights reserved. Adobe® Flash® Platform için Performansı En İyileştirme This user guide is protected under copyright law, furnished for informational use only, is subject to change without notice, and should not be construed as a commitment by Adobe Systems Incorporated. Adobe Systems Incorporated assumes no responsibility or liability for any errors or inaccuracies that may appear in 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) any reuse 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 the following 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 Financial Services, Adobe Garamond, Adobe Genesis, Adobe Griffo, Adobe Jenson, Adobe Kis, Adobe OnLocation, Adobe Originals logo, Adobe PDF logo, Adobe Premiere, 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/or other countries. Android is a trademark of Google Inc. ActiveX and Windows are either registered trademarks or trademarks of Microsoft Corporation in the United States and other countries. Windows is either a registered trademark or a trademark of Microsoft Corporation in the United States and/or other countries. Macintosh is a trademark 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 and Commercial Computer Software Documentation are being licensed to U.S. Government end users (a) only as Commercial Items and (b) with only those rights as 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 402 of the Vietnam Era Veterans Readjustment Assistance Act of 1974 (38 USC 4212), and Section 503 of the Rehabilitation Act of 1973, as amended, and the regulations 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 be incorporated by reference.
  • 3. iii Son güncelleme 30/3/2011 İçindekiler Bölüm 1: Giriş Çalışma zamanı kodunu çalıştırmanın temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Algılanan performans ile gerçek performansın karşılaştırılması . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 En iyileştirmelerinizin hedefini belirleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Bölüm 2: Belleği saklama Görüntüleme nesneleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 İlkel türler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Nesneleri yeniden kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Belleği boşaltmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Bitmap'leri kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Filtreleri ve dinamik bitmap'i kaldırma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Doğrudan mipmap oluşturma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3B efektlerini kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Metin nesneleri ve bellek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Olay modeli ile geri aramaların karşılaştırması . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Bölüm 3: CPU kullanımını en aza indirme CPU kullanımı için Flash Player 10.1 geliştirmeleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Uyku modu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Nesneleri dondurma ve çözme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Olayları etkinleştirme ve devre dışı bırakma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Fare etkileşimleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Zamanlayıcılarla ENTER_FRAME olaylarının karşılaştırılması . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Hareket arası oluşturma sendromu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Bö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 API'si . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Olayı dıştan içe ve içten dışa tetikleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Piksellerle çalışma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Normal ifadeler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Çeşitli en iyileştirmeler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Bölüm 5: Performans oluşturma Yeniden çizilen bölgeler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Sahne alanı dışı içerik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Film kalitesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 Alfa karıştırma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 Uygulama kare hızı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Bitmap'leri önbelleğe alma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 Bitmap'leri elle önbelleğe alma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Metin nesnelerinin oluşturulması . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 GPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
  • 4. ivFLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME İçindekiler Son güncelleme 30/3/2011 Eş zamanlı olmayan işlemler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Saydam pencereler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Vektör şekli düzleştirme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 Bölüm 6: Ağ etkileşimini en iyileştirme Ağ etkileşimi için geliştirmeler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Harici içerik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Girdi çıktı hataları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Flash Remoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 Gereksiz ağ işlemleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Bölüm 7: Medya ile çalışma Video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 StageVideo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Ses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Bölüm 8: SQL veritabanı performansı Veritabanı performansı için uygulama tasarımı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Veritabanı dosyası en iyileştirmesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Gereksiz veritabanı çalışma zamanı işleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Etkili SQL sözdizimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 SQL ifadesinin performansı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Bölüm 9: Kıyaslama ve konuşlandırma Kıyaslama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 Dağıtma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
  • 5. 1 Son güncelleme 30/3/2011 Bölüm 1: Giriş Adobe® AIR® ve Adobe® Flash® Player uygulamaları, masaüstleri, mobil aygıtlar, tabletler ve televizyon aygıtları gibi birçok platformda çalışır. Bu belge, bu uygulamaları dağıtan geliştiriciler için en iyi çalışma biçimlerini ana hatlarıyla kod ö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ırma Bu en iyileştirmelerin çoğu, hem AIR çalışma zamanında hem de Flash Player çalışma zamanında tüm aygıtlardaki uygulamalar 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.5'te sunulan yeteneklere odaklanır. Ancak bu en iyileştirmelerin çoğu, önceki AIR ve Flash Player sürümleri için de geçerlidir. Çalışma zamanı kodunu çalıştırmanın temelleri Uygulama performansının nasıl iyileştirileceğini anlamanın bir püf noktası da Flash Platform çalışma zamanının kodu nası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 her birine 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 Flash Professional'daki ayarları kullanarak ayarlayabilirsiniz. Birinci kare hızını kodda da belirtebilirsiniz. Yalnızca ActionScript olan bir uygulamada, kare hızını kök belge sınıfınıza [SWF(frameRate="24")] meta veri etiketini uygulayarak ayarlayın. MXML’de, Application veya WindowedApplication etiketindeki frameRate niteliğini ayarlayı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ıyla sonuçlanır. Birinci aşamanın ilk bölümünde, çalışma zamanı olayları gelir ve gönderilir. Bu olaylar, bir ağ üzerinden yapılan veri yüklemeden gelen bir yanıt gibi senkronize olmayan işlemlerin tamamlanmasını veya ilerlemesini temsil edebilir. Ayrıca, bu olaylar kullanıcı girdisinden gelen olayları da içerir. Çalışma zamanı, olaylar gönderilirken kodunuzu, kaydettirdiğiniz dinleyicilerde çalıştırır. Herhangi bir olay gerçekleşmezse, çalışma zamanı bu çalıştırma aşamasını herhangi bir işlem gerçekleştirmeden tamamlamayı bekler. Çalışma zamanı, bir etkinliğin olmamasından dolayı, 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ışma zamanı bu olayları sıraya dizer ve bir sonraki karede gönderir.
  • 6. 2FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME Giriş Son güncelleme 30/3/2011 Birinci karenin ikinci bölümü enterFrame olayıdır. Bu olay, her karede bir defa gönderildiği için diğerlerinden farklı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ı ekranda görünür olan tüm öğelerin durumunu hesaplar ve bu öğeleri ekranda çizer. Ardından bu süreç, bir parkurun etrafı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 öğesini kullanmaktan 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, kare dö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 ve oluşturma için ayrılan süreyi kısaltarak karedeki kullanılabilir sürenin yarısından fazlasını alır. Özellikle de filtreler ve karış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ından fazlası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 önce bir 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 bile animasyon 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ğıdaki kaynakları inceleyin: • Flash Player Mental Model - The Elastic Racetrack (Flash Player Zihin Modeli - Elastik Parkur) (makale Ted Patrick tarafından yazılmıştır) • Asynchronous ActionScript Execution (ActionScript’i Senkronize Olmayan Bir Şekilde Çalıştırma) (makale Trevor McCauley tarafından yazılmıştır) • Adobe AIR'yi 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 sunumunun videosu) Algılanan performans ile gerçek performansın karşılaştırılması Uygulamanızın iyi performans gösterip göstermediği konusunda en son kararı verecek kişiler, uygulamanın kullanıcılarıdır. Geliştiriciler, uygulamanın performansını belirli işlemlerin çalışmak için ne kadar süre gerektirdiği veya nesnelerin kaç tane örneğinin oluşturulduğuna göre ölçebilir. Ancak, bu ölçümler son kullanıcılar için önemli değ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ŞTIRME Giriş 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ışma zamanı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 belirleme Bazı performans geliştirmeleri kullanıcılar için fark edilebilir bir geliştirme oluşturmaz. Performans en iyileş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 en iyileş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 iyi performans gösterir. Ancak, uygulama oluşturmak için Flash Platform kullanmanın nedenlerinden biri de zengin ve etkileyici uygulamalara olanak veren medya ve grafik özellikleridir. Uygulamada istediğiniz zenginlik düzeyinin uygulamanı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 önce bekleyip 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ği düşü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ün değ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üf noktaları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ğıdaki kaynakları inceleyin: • AIR için performans ayarlama uygulamaları: http://www.adobe.com/go/learn_fp_goldman_tv_tr (Oliver Goldman'ın MAX konferansındaki sunumunun videosu) • Performans ayarlayan Adobe AIR uygulamaları: http://www.adobe.com/go/learn_fp_air_perf_devnet_tr (Oliver Goldman'ın sunuma dayalı Adobe Developer Bağlantısı makalesi)
  • 8. 4 Son güncelleme 30/3/2011 Bölüm 2: Belleği saklama Belleği saklamak, masaüstü uygulamalarında bile uygulama gelişimi açısından her zaman önemlidir. Ancak, mobil cihazlarda bellek tüketimi daha önemlidir ve uygulamanızın kullandığı bellek miktarını sınırlamakta fayda vardır. Görüntüleme nesneleri Uygun 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 en iyileş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. Bir zaman çizelgesi kullanan animasyonlar için, MovieClip nesneleri kullanın. Her zaman uygulamanız için en etkili nesne tü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: 236 trace(getSize(new Sprite())); // output: 412 trace(getSize(new MovieClip())); // output: 440 getSize() 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ürler Kodu 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 en iyileştirmenin bir yolu yoktur.
  • 9. 5FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME Belleği saklama Son güncelleme 30/3/2011 // Primitive types var a:Number; trace(getSize(a)); // output: 8 var b:int; trace(getSize(b)); // output: 4 var c:uint; trace(getSize(c)); // output: 4 var d:Boolean; trace(getSize(d)); // output: 4 var e:String; trace(getSize(e)); // output: 4 64 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 types var a:Number = 8; trace(getSize(a)); // output: 4 a = Number.MAX_VALUE; trace(getSize(a)); // output: 8 Davranış String türü için farklıdır. Ayrılan saklama miktarı String'in uzunluğuna bağlıdır. var name:String; trace(getSize(name)); // output: 4 name = ""; trace(getSize(name)); // output: 24 name = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularized in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."; trace(getSize(name)); // output: 1172 Kodu 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ŞTIRME Belleği saklama Son güncelleme 30/3/2011 Nesneleri yeniden kullanma Mü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ı yeniden oluş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 code area = 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 loop var 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 nesnesi kullanarak 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-transparent myImage = new BitmapData(20,20,false,0xF0D062); // Create a container for each BitmapData instance myContainer = new Bitmap(myImage); // Add it to the display list addChild(myContainer); // Place each container myContainer.x = (myContainer.width + 8) * Math.round(i % 20); myContainer.y = (myContainer.height + 8) * int(i / 20); }
  • 11. 7FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME Belleği saklama Son güncelleme 30/3/2011 Not: Pozitif değerler kullanırken, yuvarlanan değerin int öğesine dağıtılması Math.floor() yönteminin kullanılmasından çok daha hızlıdır. Aşağıdaki resim bitmap döşemenin sonucunu gösterir: Bitmap döşemenin sonucu En 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-transparent var 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 instance myContainer = new Bitmap(myImage); // Add it to the display list addChild(myContainer); // Place each container myContainer.x = (myContainer.width + 8) * Math.round(i % 20); myContainer.y = (myContainer.height + 8) * int(i / 20); } Bu yaklaşım yaklaşık 700 KB'lı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ŞTIRME Belleği saklama Son güncelleme 30/3/2011 // Create a single 20 x 20 pixel bitmap, non-transparent var 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 instance myContainer = new Bitmap(myImage); // Add it to the DisplayList addChild(myContainer); // Place each container myContainer.x = (myContainer.width + 8) * Math.round(i % 20); myContainer.y = (myContainer.height + 8) * int(i / 20); // Set a specific rotation, alpha, and depth myContainer.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 sonucu Daha fazla Yardım konusu “Bitmap'leri önbelleğe alma” sayfa 52
  • 13. 9FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME Belleği saklama Son güncelleme 30/3/2011 Nesne kuyruğu Mü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 yeniden kullanımını içerir. Uygulamanızın başlatılması sırasında tanımlı bir sayıda nesne oluşturup onları bir Array veya Vector 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. Ancak başvuruların null değerine ayarlanması bu öğeyi çöp toplama için uygun hale getireceğinden bu işlemi gerç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. Bu ayrıca çöp toplayıcının uygulamanızı yavaşlatarak çalışma ihtimalini de düşürür. Aşağıdaki kod, nesne kuyruğu tekniğ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ŞTIRME Belleği saklama Son güncelleme 30/3/2011 public 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, bu nesnelerden örnekler döndürür ve disposeSprite() yöntemi onları bırakır. Kod, kuyruk tamamen kullanıldığında onun büyümesine olanak verir. Ayrıca, kuyruk yorulduğunda yeni nesnelerin ayrılmayacağı sabit boyutlu bir kuyruk oluş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 sonra onları başka bir görev için yeniden kullanır.
  • 15. 11FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME Belleği saklama Son güncelleme 30/3/2011 stage.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, size SpritePool 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 olarak toplandığından emin olmak için, nesneye yapılan tüm başvuruları silin. ActionScript 1.0 ve 2.0’da kullanılan eski delete operatörünün ActionScript 3.0’da farklı davrandığını unutmayın. Operatör yalnızca dinamik nesnelerin dinamik ö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 memory mySprite = null; Şunu unutmayın ki, bir nesnenin null değerine ayarlanması bellekten kaldırılacağı anlamına gelmez. Bazen kullanılabilir bellek yeterince düşük sayılmıyorsa çöp toplayıcı çalışmaz. Çöp toplama tahmin edilemez. Nesne silme yerine bellek ayırma işlemi çöp toplamayı tetikler. Çöp toplayıcı çalıştığında, henüz toplanmamış nesne grafikleri bulur. 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 fark edilir 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çin daha az işleme zamanı harcar. Çöp toplama işlemini garanti sağlayan bir işlem olarak göz önünde bulundurun ve mü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öntemi kullanılarak başlatılabilir. Adobe® Flash® Builder™ ile paketlenen profil oluşturucu, çöp toplayıcıyı el ile başlatmanıza olanak tanır. Çöp toplayıcıyı çalıştırmak uygulamanızın nasıl yanıt verdiğini ve nesnelerin bellekten doğru bir şekilde silinip 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ı null olarak ayarlamadan önce removeEventListener() yöntemini kullanan olay dinleyicilerini kaldırın.
  • 16. 12FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME Belleği saklama Son güncelleme 30/3/2011 Neyse ki, bitmap'ler tarafından kullanılan bellek miktarı hızlı bir şekilde azaltılabilir. Örneğin, BitmapData sınıfı bir dispose() yöntemi içerir. Bir sonraki örnek 1.8 MB'lık bir BitmapData örneği oluşturur. Kullanımda olan geçerli bellek 1,8 MB'a çı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 instance var image:BitmapData = new BitmapData(800, 600); trace(System.totalMemory / 1024); // output: 44964 Daha 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 instance var image:BitmapData = new BitmapData(800, 600); trace(System.totalMemory / 1024); // output: 44964 image.dispose(); image = null; trace(System.totalMemory / 1024); // output: 43084 dispose() yöntemi pikselleri bellekten kaldırsa da, başvuru yine de onu tamamen bırakmak için null değerine ayarlanmalıdır. Belleğin hemen boşaltılması için artık bir BitmapData nesnesine ihtiyaç duymadığınızda her zaman dispose() 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 XML ağ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 26 Bitmap'leri kullanma Bitmap'ler yerine vektörlerin kullanılması bellek kazanmanın iyi bir yoludur. Ancak, özellikle yüksek sayıda vektör kullanımı, işlemci ve GPU kaynağı ihtiyacını önemli ölçüde artırır. Çalışma zamanı ekranda piksel çizmek için vektör içeriği oluşturmaya kıyasla daha az işleme kaynağı gerektireceğinden, bitmap kullanmak, oluşturmayı en iyileştirmek için iyi bir yoldur. Daha fazla Yardım konusu “Bitmap'leri elle önbelleğe alma” sayfa 60
  • 17. 13FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME Belleği saklama Son güncelleme 30/3/2011 Bitmap altörnekleme Belleğ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-bit gö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.1'de mevcuttur. Not: Flash Player 10.1'den önce bellekte oluşturulan tüm pikseller 32 bit'lik (4 bayt) bölümler halinde saklanıyordu. 300 x 300 piksellik basit bir logo 350 KB'lık bellek harcıyordu (300*300*4/1024). Bu yeni davranışla, aynı opak logosu yalnızca 175 KB harcar. Logo saydamsa, 16 bit’e aşağı örneklenmez ve bellekte aynı boyutta yer kaplar. Bu özellik yalnızca gömülü bitmap'ler 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 zor olabilir. 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çin bile farkları algılamak zordur. Ancak, resmi yakınlaştırırken az miktarda renk bozulması olabilir ve bir 32 bit degrade gö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. Flash Player 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üphaneden veya bir [Embed] etiketinden gelebilir. Not: Ayrıca, Flash Player 10.1 ve AIR 2.5, bitmap'leri 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.5'ten ö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 bitmap'ler Flash Player 10.1 ve AIR 2.5'te, aynı görüntünün birden fazla örneği oluşturulduğunda, tüm BitmapData örnekleri için bitmap'in tek bir sürümü kullanılır. Aşağıdaki şema bu kavramı gösterir: Bellekteki Görüntülenen Logo Örneği Logo Örneği Bitmap Kaynağı Bitmap Kaynağı
  • 18. 14FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME Belleği saklama Son güncelleme 30/3/2011 Flash Player 10.1 ve AIR 2.5'te bellekteki bitmap'ler Bu yaklaşım bir uygulama tarafından birçok bitmap ile kullanılan bellek miktarını önemli ölçüde düşürür. Aşağıdaki kod 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ülenen Logo Örneği Logo Örneği Bitmap Kaynağı
  • 19. 15FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME Belleği saklama Son güncelleme 30/3/2011 Birden 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 mobil aygı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, new Point(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ŞTIRME Belleği saklama Son güncelleme 30/3/2011 Bir örneği değiştirmenin sonucu Dahili 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şturulur ve başka herhangi bir örnek güncellenmez. Aşağıdaki resim bu kavramı gösterir: Bir bitmap'i değiştirmenin bellekteki sonucu Tek bir yıldız değiştirilirse, bellekte yeni bir kopya oluşturulur. Sonuçta elde edilen animasyon, Flash Player 10.1 ve AIR 2.5'te bellekten yaklaşık 8 KB kullanır. Bellekteki Görüntülenen Logo Örneği Logo Örneği Logo Örneği setPixel() Bitmap Kaynağı Bitmap Kaynağı
  • 21. 17FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME Belleği saklama Son 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çin beginBitmapFill() yöntemi en uygun yöntemdir: var container:Sprite = new Sprite(); var source:BitmapData = new Star(0,0); // Fill the surface with the source BitmapData container.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 olarak dö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 Matrix nesnesini 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 stars matrix.rotate(angle); // Clear the content container.graphics.clear(); // Fill the surface with the source BitmapData container.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ŞTIRME Belleği saklama Son güncelleme 30/3/2011 Döndürülen yıldızların sonucu Bu yaklaşımla, orijinal kaynak BitmapData nesnesinin güncellenmesi otomatik olarak onun sahne alanındaki herhangi 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 olup olmadığı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 bitmap'i kaldırma Pixel 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 aza indirmeye çalışın. Bir görüntüleme nesnesine bir filtre uygulandığında, çalışma zamanı bellekte iki bitmap oluşturur. Bu bitmap'lerin her biri görüntüleme nesnesinin boyutundadır. Birincisi, görüntüleme nesnesinin rasterleştirilmiş bir versiyonu 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ŞTIRME Belleği saklama Son güncelleme 30/3/2011 Filtre uygulandığında bellekte bulunan iki bitmap Bir filtrenin özelliklerinden birini değiştirirken, ortaya çıkacak bitmap'in oluşturulması için bitmap'lerin ikisi de bellekte 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çinde değ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, bir bulanıklaştırma filtresi uygulanan bir metin nesnesi düşünün. Bu durumda metin basit dekorasyon için kullanılır ve değ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 yeniden oluş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ş bitmap'lerin kullanılması iyi bir uygulamadır. ActionScript’te çalışma zamanında oluşturulmuş dinamik bitmap'leri kullanmaktan kaçının. Harici olarak geliştirilmiş bitmap'lerin kullanılması, özellikle filtre özellikleri zaman içinde değ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çbir işlem yapmadan görüntüleyebilirsiniz, bu işlem çok daha hızlı olabilir. Doğrudan mipmap oluşturma Gerekirse, büyük görüntüleri ölçeklendirirken mipmap oluşturma özelliğini kullanın. Flash Player 10.1 ve AIR 2.5'te mevcut olan başka yeni bir özellik mipmap oluşturmayla ilgilidir. Flash Player 9 ve AIR 1.0, ölçeği küçültülmüş bitmap'lerin kalite ve performansını iyileştiren bir mipmap oluşturma özelliği sunmuştu. Bellekteki Görüntülenen Sonuç Filtrelenmemiş bitmap versiyonu Filtrelenmiş bitmap versiyonu
  • 24. 20FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME Belleği saklama Son güncelleme 30/3/2011 Not: Mipmap oluşturma özelliği yalnızca dinamik olarak yüklenmiş görüntüler veya gömülü bitmap'ler için geçerlidir. Mipmap oluşturma filtrelenen veya önbelleğe alınan görüntüleme nesnelerine uygulanmaz. Mipmap oluşturma yalnızca bitmap çift sayı olan bir genişlik ve yüksekliğe sahipse işlenebilir. Tek sayı olan bir genişlik veya yükseklikle karşılaşıldığında, mipmap oluşturma durur. Örneğin, 250 x 250 boyutunda bir görüntüye 125 x 125 olacak şekilde mipmap oluşturma uygulanabilir ancak daha fazlası uygulanamaz. Bu durumda, boyutların en az bir tanesi tek sayıdır. İkinin üsleri olan boyutlara sahip bitmap'ler 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 minik resim oluşturmak için ölçeklemek istediğini düşünün. Mipmap oluşturma özelliği, bitmap'in orta seviye altörnekleme versiyonları kullanılarak ölçeklendirildiğinde görüntüyü düzgün bir şekilde oluşturur. Çalışma zamanının önceki sürümleri bellekte bitmap'in orta seviye altörneklenmiş sürümlerini oluşturuyordu. 1024 x 1024 boyutlarında bir görüntü 64 x 64 şeklinde yüklenip görüntülendiğinde, çalışma zamanının eski sürümleri yarı boyutlu bitmap'lerin her birini oluştururdu. Örneğin, bu durumda 512 x 512, 256 x 256, 128 x 128 ve 64 x 64 bitmap'ler 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) mipmap'i 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 bitmap kullanılıyorsa, 4 MB orijinal bitmap bellekten boşaltılır. Mipmap'in yeniden oluşturulması gerekiyorsa, orijinal bitmap yeniden yüklenir. Ayrıca, çeşitli boyutlarda başka mipmap'i oluşturulmuş bitmap'ler gerekiyorsa, bitmap'in oluşturulması için bitmap'lerin 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 bitmap'ler incelenir. Başka versiyonlar bulunmazsa, 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 şeklinde açılmasına olanak tanır. Mipmap'in oluşturulması önemli ölçüde daha hızlıdır; büyük bitmap'ler tarafından kullanılan bellek 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ş bitmap'lerin kalitesini 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 bitmap'lerle işleme başlamayın. 3B efektlerini kullanma 3B 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 motoru sundu. 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 perspektifi dönüştürülmüş görüntüleme nesnesinin bir bitmap olarak rasterleştirildiğini ve bundan dolayı daha fazla bellek gerektirdiğ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ŞTIRME Belleği saklama Son güncelleme 30/3/2011 Perspektif dönüştürme sonucu ortaya çıkan kenar yumuşatma Kenar yumuşatma, vektör içeriğinin bitmap olarak dinamik bir şekilde rasterleştirilmesinin sonucudur. Bu kenar yumuşatma, AIR ve Flash Player'ın masaüstü sürümünde ve mobil için AIR 2.0.1 ve AIR 2.5'te 3B efektler kullandığınızda gerçekleşir. Ancak mobil aygıtlar için Flash Player'a kenar yumuşatma uygulanmaz. 3B efektinizi yerel API'ye dayanmadan elle oluşturabiliyorsanız, bu da bellek kullanımını azaltabilir. Ancak Flash Player 10 ve AIR 1.5'te tanıtılan yeni 3B özellikleri doku eşlemeyi drawTriangles() gibi yöntemler sayesinde çok daha 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 iyi performans 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, 3B dönüştürmeleri yapar. Ancak renderModeCPU olursa, 3B dönüştürmeleri GPU değil, CPU gerçekleştirir. Flash Player 10.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ın bellekte iki bitmap gerektireceğini dikkate alın. Bir bitmap kaynak bitmap için ve ikinci bir bitmap de perspektifi dö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, CPU 3B dönüştürmeler yaptığında, 3B özelleri tutumlu şekilde kullanın. Metin nesneleri ve bellek Salt 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 Metin Motoru'nu (FTE) sunmuştu. Ancak, FTE üzerine flash.text.engine paketinde sağlanan ek bir ActionScript 3.0 katmanı gerektiren düşük düzeyli bir API'dir.
  • 26. 22FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME Belleği saklama Son güncelleme 30/3/2011 Salt okunur metinler için, düşük bellek kullanımı ve daha iyi oluşturma sunan Flash Metin Motoru kullanılması en iyisidir. Giriş metni için, girdi işleme ve kelime sarma gibi genel davranışlar oluşturmak için daha az ActionScript gerektiğinden, TextField nesnelerini kullanmak daha iyi bir seçimdir. Daha fazla Yardım konusu “Metin nesnelerinin oluşturulması” sayfa 66 Olay 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 yeniden kullanımı için en iyileştirilmiştir. dispatchEvent() yöntemi dinleyici listesi üzerinden döngüde ilerler ve kayıtlı her nesnede olay işleyicisini çağırır. Ancak olay modelinin dezavantajlarından biri uygulamanızı kullandığınız süre boyunca ç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. Bildirimin tamamlanması 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şlevi kullanmak işlemine göre daha fazla bellek kullanabilir. Olay nesneleri bellekte oluşturulmalı ve ayrılmalıdır; bu da performansta düşüşe neden olur. Örneğin Event.ENTER_FRAME olayını dinlerken olay işleyicisi için her karede yeni bir 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. 23 Son güncelleme 30/3/2011 Bölüm 3: CPU kullanımını en aza indirme En 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ştirmeleri Flash Player 10.1 CPU işlemeden tasarruf etmeyi sağlayan iki yeni özellik sunar. Özellikler arasında, ekran dışına gittiğinde SWF içeriğinin duraklatılması ve devam ettirilmesi ve bir sayfadaki Flash Player örnekleri sayısının sınırlandırılması yer alır. Duraklatma ve devam etme Not: 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) devre dışı örneklerle ilgili yeni bir özellik sunar. Bu özellik ekrandaki içerik açılıp kapatıldığında SWF dosyasını duraklatıp devam ettirerek işlemci kullanımını kısıtlamanıza izin verir. Bu özellikle, Flash Player içeriğin oynatılması devam ettirildiğ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şturma durur. Herhangi bir ses veya video yürütülmüyorsa, oynatmanın veya ActionScript yürütülmesinin duraklatılmadığından emin olmak için hasPriority HTML parametresini true olarak ayarlayın. Ancak, içerik ekranın dışındayken veya gizliyken hasPriority HTML parametresinin değerine bakılmaksızın SWF içeriği oluş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. Ses ve video yürütülmesi durdurulur ve SWF içeriği görünür hale gelmedikçe içerik oluşturma işlemine devam edilmez. Örnek yönetimi Not: Ö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ŞTIRME CPU kullanımını en aza indirme Son güncelleme 30/3/2011 Bu özellik bir sayfada başlatılmış olan Flash Player örneklerinin sayısını kısıtlar. Örneklerin sayısını kısıtlamak işlemci ve pil kaynaklarını korumaya yardım eder. Amaç bir sayfadaki diğer içeriğe içerik önceliği vererek SWF içeriğine belirli bir öncelik atamaktır. Basit bir örnek düşünün: kullanıcı bir web sitesini taramaktadır ve dizin sayfası üç farklı SWF dosyası 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 ekran dışıdır ve kaydırmayı gerektirir. İlk iki animasyon normal şekilde başlatılır ancak sonuncusu görünür olana kadar ertelenir. hasPriority parametresi mevcut olmadığında veya false değerine ayarlandığında bu senaryo varsayılan davranıştır. Bir SWF dosyasının ekran dışı olsa da başlatılmasını sağlamak için, hasPriority parametresini true değerine ayarlayın. Ancak, hasPriority parametresinin değerinden bağımsız olarak, kullanıcıya görünmeyen bir SWF 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, herhangi bir 1x1 piksel veya 0x0 piksel içerik SWF dosyalarının ertelenmesini önleyerek başlatılır. Ancak SWF dosyaları halen tı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 etkileri kullanıcının aygıtında görünür olan alan SWF hasPriority false olarak ayarlanmış veya mevcut değil SWF filmi başlatıldı SWF filmi başlatılmadı SWF hasPriority false olarak ayarlanmış veya mevcut değil SWF hasPriority false olarak ayarlanmış veya mevcut değil
  • 29. 25FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME CPU kullanımını en aza indirme Son güncelleme 30/3/2011 hasPriority parametresi için farklı değerlerin etkileri Uyku modu Flash 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, mobil uygulama kullanan bir kullanıcı rahatsız edilirse ve aygıtı kullanmayı bırakırsa, çalışma zamanı arka ışığın ne zaman uyku moduna girdiğini algılar. Daha sonra kare hızını saniyede 4 kareye (fps) düşürür ve oluşturmayı duraklatır. AIR uygulamaları için ayrıca uygulama arka plana geçtiğinde uyku modu başlar. ActionScript kodu Stage.frameRate özelliğini 4 fps'ye ayarlamaya benzer olarak uyku modunda çalışmaya devam eder. Ancak oluşturma adımı atlanır, böylece kullanıcı oynatıcının 4 fps'de çalıştığını göremez. Sıfır yerine 4 fps'lik bir kare hızı seçildi, çünkü bu tüm bağlantıların açık kalmasına olanak verir (NetStream, Socket ve NetConnection). Sıfıra geçmek tüm açık bağlantıları keser. Çoğu aygıt üreticisi yenileme hızı olarak 250 ms'lik (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 kare hı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ın müzik oynattığı bir medya oynatıcı uygulaması düşünün. Ekran uyku moduna girerse, çalışma zamanı oynatılmakta olan 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 fps'ye 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 ışığı her zaman açık olmaya zorlar. kullanıcının aygıtında görünür olan alan SWF hasPriority false olarak ayarlanmış veya mevcut değil SWF hasPriority true olarak ayarlanmış SWF filmi başlatıldı SWF filmi başlatılmadı SWF hasPriority false olarak ayarlanmış veya mevcut değil
  • 30. 26FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME CPU kullanımını en aza indirme Son 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 getirir ve 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 durumunu varsayı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 fps'ye 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 eder ancak 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 çözme REMOVED_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 listesinde olmasa 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 ve Event.ADDED_TO_STAGE olaylarıyla doğru uygun biçimde dondurmak ve çözmek çok önemlidir. Aşağıdaki örnekte klavye ile etkileşen sahne alanında oynatılan bir film klibi gösterilmektedir: // Listen to keyboard events stage.addEventListener(KeyboardEvent.KEY_DOWN, keyIsDown); stage.addEventListener(KeyboardEvent.KEY_UP, keyIsUp); // Create object to store key states var keys:Dictionary = new Dictionary(true); function keyIsDown(e:KeyboardEvent):void { // Remember that the key was pressed keys[e.keyCode] = true; if (e.keyCode==Keyboard.LEFT || e.keyCode==Keyboard.RIGHT) { runningBoy.play(); } } function keyIsUp(e:KeyboardEvent):void { // Remember that the key was released keys[e.keyCode] = false; for each (var value:Boolean in keys) if ( value ) return; runningBoy.stop();
  • 31. 27FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME CPU kullanımını en aza indirme Son 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 klibi Kaldı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ŞTIRME CPU kullanımını en aza indirme Son güncelleme 30/3/2011 // Show or remove running boy showBtn.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. Film klibi ç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_STAGE runningBoy.addEventListener(Event.ADDED_TO_STAGE,activate); runningBoy.addEventListener(Event.REMOVED_FROM_STAGE,deactivate); function activate(e:Event):void { // Restart everything e.currentTarget.addEventListener(Event.ENTER_FRAME,handleMovement); } function deactivate(e:Event):void { // Freeze the running boy - consumes fewer CPU resources when not shown e.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 klavye doğ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ı nesnenin dondurulmasını sağlamaz. Çöp toplayıcı çalışmıyorsa, nesne artık görüntülenmese de bellek ve işlemci işlemesini kullanmaya devam eder. Nesnenin mümkün olduğunca az işlemci işlemesini kullanmasını sağlamak için, onu görüntüleme listesinden kaldırırken tamamen dondurduğunuzdan emin olun. Flash Player 10 ve AIR 1.5'ten 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 ve AIR 1.0 ile kullanılırken, içeriğin LoaderInfo nesnesi tarafından gönderilen Event.UNLOAD olayının dinlenmesi yoluyla 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 bir SWF dosyasını kaldırmanıza, yüklü olan SWF dosyasındaki her nesneyi otomatik olarak dondurmanıza ve çöp toplayı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ŞTIRME CPU kullanımını en aza indirme Son güncelleme 30/3/2011 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 no automatic object deactivation // All deactivation must be processed manually loader.unload(); } Dondurmayı yerel olarak işleyip çöp toplama işlemini çalışmaya zorlayan unloadAndStop() yöntemini kullanmak iyi bir 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 automatically loader.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 ve Event.DEACTIVATE öğelerinin gönderilmesi durdurulur. Olayları etkinleştirme ve devre dışı bırakma Arka plan etkinsizliğini algılamak ve uygulamanızı uygun şekilde en iyileştirmek için Event.ACTIVATE ve Event.DEACTIVATE olaylarını kullanın.
  • 34. 30FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME CPU kullanımını en aza indirme Son 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çin uygulamanıza hassas ayar yapmanıza yardımcı olabilir. Bu olaylar, çalışma zamanının ne zaman odak kazandığını veya kaybettiğ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 rate stage.frameRate = originalFrameRate; } function onDeactivate ( e:Event ):void { // set frame rate to 0 stage.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ştirmek yerine, 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 Netbook'larda bulunan "Duraklat ve Devam Ettir" ö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 26 Fare etkileşimleri Fare 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 nesne ekranda gösterildiğinde yoğun işlemci kullanımı gerektirebilir. Bu işlemeden kaçınmak için kolay bir yöntem de, fare etkileşimi gerektirmeyen nesnelerdeki fare etkileşimlerini devre dışı bırakmaktır. Aşağıdaki kod mouseEnabled ve mouseChildren özelliklerinin kullanımını gösterir:
  • 35. 31FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME CPU kullanımını en aza indirme Son güncelleme 30/3/2011 // Disable any mouse interaction with this InteractiveObject myInteractiveObject.mouseEnabled = false; const MAX_NUM:int = 10; // Create a container for the InteractiveObjects var container:Sprite = new Sprite(); for ( var i:int = 0; i< MAX_NUM; i++ ) { // Add InteractiveObject to the container container.addChild( new Sprite() ); } // Disable any mouse interaction on all the children container.mouseChildren = false; Mümkün olduğunca fare etkileşimini devre dışı bırakmayı göz önünde bulundurun. Bu, uygulamanızın daha az işlemci işlemesi kullanmasını sağlar ve bunun bir sonucu olarak da mobil aygıtlarda pil kullanımının azaltılmasına yardımcı olur. Zamanlayıcılarla ENTER_FRAME olaylarının karşı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ılar tercih 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şım ise 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ıklarla kodunuzun ç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 olarak gö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ı indirme veya 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üncelleme hızında günceller. Yüksek güncelleme hızı TimerEvent nesnesindeki updateAfterEvent() yöntemi ile sağlanır. Bu yöntem ekranı gerektiğinde zamanlayıcı her olay gönderdiğinde güncellenmeye zorlar. Aşağıdaki kod bu fikri göstermektedir:
  • 36. 32FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME CPU kullanımını en aza indirme Son güncelleme 30/3/2011 // Use a low frame rate for the application stage.frameRate = 10; // Choose one update per second var 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 screen e.updateAfterEvent(); } updateAfterEvent() yönteminin çağrılması kare hızını değiştirmez. Yalnızca çalışma zamanını, ekrandaki değişen içeriği güncellemeye zorlar. Zaman çizelgesi halen 10 kare/saniyede çalışmaktadır. Düşük performanslı aygıtlarda veya olay işleyici işlemlerinin ağır işleme gerektiren kodlar barındırması durumunda zamanlayıcıların ve ENTER_FRAME olaylarının tam olarak doğru olmadığını unutmayın. SWF dosyasının kare hızında olduğu gibi, zamanlayıcının gü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şlemin gerç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ünde bulundurun. 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 ve gö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 öğesi kullanın. Daha az sıklıkta gerçekleşen veya arka plan işlemleri için her 2000 milisaniyede bir tetiklenen başka bir Timer öğesi kullanın. • Tek bir Timer nesnesi kullanın ve işlemlerin Timer nesnesinin birden fazla delay özelliği aralığında tetiklenmesini sağlayın. Örneğin, 100 milisaniyede bir gerçekleşmesi gereken işlemleriniz ve 200 milisaniyede gerçekleşmesini istediğiniz başka işlemler olduğunu varsayın. Bu durumda, 100 milisaniyelik bir delay değeri olan tek bir Timer nesnesi kullanı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ŞTIRME CPU kullanımını en aza indirme Son güncelleme 30/3/2011 var 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 ms if (!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 true olmadığı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üleme nesnelerinin 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ölgesi büyükse veya küçük olmasına rağmen yüksek miktarda veya karmaşık görüntüleme nesneleri içeriyorsa, çalışma zamanının oluşturma için daha fazla süreye ihtiyacı vardır. İstenen yeniden çizme miktarını test etmek için, Flash Player’ı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 63 Hareket 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ı kullanma eğ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. 34 Son güncelleme 30/3/2011 Bö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çin bir 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: 107 Aş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 length var 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ŞTIRME ActionScript 3.0 performansı Son güncelleme 30/3/2011 Vektörün boyutu önceden belirlenmezse, vektör alanı azaldıkça boyut artar. Vektör boyutu her arttığında yeni bir bellek 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 kopyalama işlemi performansa zarar verir. Yukarıdaki kod vektörün ilk boyutunu belirleyerek performans için en iyi hale getirilmiştir. Ancak kod korunabilirlik açısından en iyi hale getirilmemiştir. Korunabilirliği arttırmak için yeniden kullanılmış değeri bir sabitte depolayın: // Store the reused value to maintain code easily const 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: 47 Mümkün oldukça, daha hızlı çalıştıkları için Vector nesnesi API'lerini kullanmaya çalışın. Çizim API'si Daha hızlı kod çalıştırma için çizim API'sini kullanın. Flash Player 10 ve AIR 1.5, daha iyi kod çalıştırma performansı edinmenize olanak vermek için yeni bir çizim API'si sağ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 API'si 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şlemeyi iş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ŞTIRME ActionScript 3.0 performansı Son güncelleme 30/3/2011 Aş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 tetikleme Olay 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ın iç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 oyun yarattığı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 elma tarafı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 event currentApple.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ŞTIRME ActionScript 3.0 performansı Son güncelleme 30/3/2011 Kod, her bir Apple örneğinde addEventListener() yöntemini çağırır. Ayrıca bir elma tıklatıldığında removeEventListener 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öntemlerine yapı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çe tetikleme 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 apple's parent // Passing true as third parameter catches the event during its capture phase container.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 en iyileş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 ileterek olayı dıştan içe tetiklemede kullanılabilir: // Listen to the MouseEvent.CLICK on apple's parent // Passing false as third parameter catches the event during its bubbling phase container.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 );