Top Banner
ADOBE ® FLASH ® PLATFORM için Performansı En İyileştirme
98

Flashplatform optimizing content türkçe

Jan 27, 2015

Download

Education

deniz armutlu

Flashplatform optimizing content türkçe
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Flashplatform optimizing content türkçe

ADOBE® FLASH® PLATFORM için Performansı En İyileştirme

Page 2: Flashplatform optimizing content türkçe

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.

Page 3: Flashplatform optimizing content türkçe

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

Page 4: Flashplatform optimizing content türkçe

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

Page 5: Flashplatform optimizing content türkçe

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.

Page 6: Flashplatform optimizing content türkçe

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?

Page 7: Flashplatform optimizing content türkçe

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)

Page 8: Flashplatform optimizing content türkçe

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.

Page 9: Flashplatform optimizing content türkçe

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.

Page 10: Flashplatform optimizing content türkçe

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);

}

Page 11: Flashplatform optimizing content türkçe

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:

Page 12: Flashplatform optimizing content türkçe

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

Page 13: Flashplatform optimizing content türkçe

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(); }

Page 14: Flashplatform optimizing content türkçe

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.

Page 15: Flashplatform optimizing content türkçe

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.

Page 16: Flashplatform optimizing content türkçe

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

Page 17: Flashplatform optimizing content türkçe

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ğı

Page 18: Flashplatform optimizing content türkçe

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ğı

Page 19: Flashplatform optimizing content türkçe

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:

Page 20: Flashplatform optimizing content türkçe

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ğı

Page 21: Flashplatform optimizing content türkçe

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:

Page 22: Flashplatform optimizing content türkçe

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.

Page 23: Flashplatform optimizing content türkçe

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

Page 24: Flashplatform optimizing content türkçe

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:

Page 25: Flashplatform optimizing content türkçe

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.

Page 26: Flashplatform optimizing content türkçe

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.

Page 27: Flashplatform optimizing content türkçe

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" />

Page 28: Flashplatform optimizing content türkçe

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 olarakayarlanmış veya

mevcut değil

SWF filmi başlatıldı

SWF filmi başlatılmadı

SWFhasPriority false olarak

ayarlanmış veyamevcut değil

SWF

hasPriority falseolarak ayarlanmışveya mevcut değil

Page 29: Flashplatform optimizing content türkçe

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 olarakayarlanmış veya

mevcut değil

SWF

hasPriority true olarak ayarlanmış

SWF filmi başlatıldı

SWF filmi başlatılmadı

SWF

hasPriority falseolarak ayarlanmışveya mevcut değil

Page 30: Flashplatform optimizing content türkçe

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();

Page 31: Flashplatform optimizing content türkçe

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:

Page 32: Flashplatform optimizing content türkçe

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.

Page 33: Flashplatform optimizing content türkçe

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.

Page 34: Flashplatform optimizing content türkçe

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:

Page 35: Flashplatform optimizing content türkçe

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:

Page 36: Flashplatform optimizing content türkçe

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:

Page 37: Flashplatform optimizing content türkçe

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.

Page 38: Flashplatform optimizing content türkçe

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

Page 39: Flashplatform optimizing content türkçe

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 );

Page 40: Flashplatform optimizing content türkçe

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 );

}

Page 41: Flashplatform optimizing content türkçe

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 );

Page 42: Flashplatform optimizing content türkçe

38FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

ActionScript 3.0 performansı

Son güncelleme 30/3/2011

Piksellerle çalışma

setVector() yöntemini kullanarak pikselleri boyayın.

Pikselleri boyarken, bazı basit en iyileştirmeler BitmapData sınıfının uygun yöntemleri kullanılarak kolaylıkla

gerçekleştirilebilir. Pikselleri boyamanın hızlı bir yolu, setVector() yöntemini kullanmaktır:

// Image dimensions var wdth:int = 200; var hght:int = 200; var total:int = wdth*hght; // Pixel colors Vector var pixels:Vector.<uint> = new Vector.<uint>(total, true); for ( var i:int = 0; i< total; i++ ) {

// Store the color of each pixel pixels[i] = Math.random()*0xFFFFFF;

} // Create a non-transparent BitmapData object var myImage:BitmapData = new BitmapData ( wdth, hght, false ); var imageContainer:Bitmap = new Bitmap ( myImage ); // Paint the pixels myImage.setVector ( myImage.rect, pixels ); addChild ( imageContainer );

setPixel() veya setPixel32() gibi yavaş yöntemler kullanırken, öğelerin daha hızlı çalışması için lock() ve

unlock() yöntemlerini kullanın. Aşağıdaki kodda, performansın iyileştirilmesi için lock() ve unlock() yöntemleri

kullanılıyor:

Page 43: Flashplatform optimizing content türkçe

39FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

ActionScript 3.0 performansı

Son güncelleme 30/3/2011

var buffer:BitmapData = new BitmapData(200,200,true,0xFFFFFFFF); var bitmapContainer:Bitmap = new Bitmap(buffer); var positionX:int; var positionY:int; // Lock update buffer.lock(); var starting:Number=getTimer(); for (var i:int = 0; i<2000000; i++) {

// Random positions positionX = Math.random()*200; positionY = Math.random()*200; // 40% transparent pixels buffer.setPixel32( positionX, positionY, 0x66990000 );

} // Unlock update buffer.unlock(); addChild( bitmapContainer ); trace( getTimer () - starting ); // output : 670

BitmapData sınıfının lock() yöntemi BitmapData nesnesi değiştiğinde bir görüntüyü kitler ve ona başvuran

nesnelerin güncellenmesini önler. Örneğin, bir Bitmap nesnesi bir BitmapData nesnesine başvurursa, BitmapData

nesnesini kilitleyebilirsiniz, değiştirebilirsiniz ve sonrasında kilidini açabilirsiniz. BitmapData nesnesinin kilidi açılana

kadar Bitmap nesnesi değişmez. Performansı artırmak için, setPixel() veya setPixel32() yöntemine birçok çağrı

yapmadan önce veya yaptıktan sonra unlock() yöntemiyle birlikte bu yöntemi kullanın. lock() ve unlock()

yöntemlerinin çağrılması ekranın gereksiz yere güncellenmesini önler.

Not: Görüntüleme listesinde olamayan bir bitmap’in piksellerini işlerken (çift arabellek) bu teknik bazen performansı

arttırmaz. Bir bitmap nesnesi bitmap arabelleğine başvurmuyorsa lock() ve unlock() yönteminin kullanılması

performansı arttırmaz. Flash Player arabelleğe başvurulmadığını ve bitmap’in ekran üzerinde oluşturulmadığını algılar.

getPixel(), getPixel32(), setPixel() ve setPixel32() gibi pikselleri yineleyen yöntemler özellikle mobil

aygıtlarda yavaş çalışabilir. Mümkünse tek çağrıda bütün pikselleri geri alan yöntemleri kullanın. Pikselleri okumak

için, getPixels() yönteminden daha hızlı olan getVector() yöntemini kullanın. Ayrıca mümkünse, daha hızlı

çalıştıkları için Vector nesnelerine dayanan API’leri kullanmayı unutmayın.

Normal ifadeler

Temel dize bulma ve ayıklama için normal bir ifade yerine indexOf(), substr() veya substring() gibi String

sınıfı yöntemlerini kullanın.

Düzenli bir ifade kullanarak yapılabilen bazı işlemler String sınıfının yöntemlerinin kullanımıyla da

gerçekleştirilebilir. Örneğin, bir dizenin başka bir dize içerip içermediğini belirlemek için, String.indexOf()

yöntemini veya düzenli bir ifade kullanabilirsiniz. Ancak, bir String sınıfı yöntemi mevcut olduğunda, ona denk olan

düzenli ifadeden daha hızlı çalışır ve başka bir nesnenin oluşturulmasını gerektirmez.

Öğeleri gruplandırmanız gerekiyorsa ancak sonuç olarak grup içeriklerini yalıtmanız gerekmiyorsa, normal ifadenin

içindeki bir grup (“(xxxx)”) yerine yakalama yapmayan bir grup (“(?:xxxx)”) kullanın.

Page 44: Flashplatform optimizing content türkçe

40FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

ActionScript 3.0 performansı

Son güncelleme 30/3/2011

Orta karmaşıklıktaki normal ifadelerde, genellikle ifadenin parçalarını grup olacak şekilde bir araya getirirsiniz.

Örneğin, aşağıdaki düzenli ifade deseninde, parantezler “ab” metninin etrafında bir grup oluşturur. Bunun

sonucunda, “+” nicelik belirteci tek bir karakter yerine gruba uygulanır:

/(ab)+/

Varsayılan olarak, grupların her birinin içeriği “yakalanır”. Deseninizdeki grupların her birinin içeriğini düzenli

ifadeyi çalıştırmanın sonucunun bir parçası olarak alabilirsiniz. Bu grup sonuçlarının yakalanması, grup sonuçlarını

içerecek nesneler oluşturulduğu için daha uzun sürer ve daha fazla bellek gerektirir. Buna alternatif olarak, açma

parantezinden sonra bir soru işareti ve iki nokta ekleyerek yakalama yapmayan grup sözdizimini kullanabilirsiniz. Bu

sözdizimi karakterlerin bir grup gibi davrandığını ancak sonuç için yakalanmadığını belirtir.

/(?:ab)+/

Yakalama yapmayan grup sözdizimi daha hızlı sonuç verir ve standart grup sözdizimine göre daha az bellek kullanır.

Düzenli bir ifade yetersiz performans gösterirse alternatif bir düzenli ifade yapısı kullanmayı deneyin..

Bazen, aynı metin yapısının test edilmesi veya tanımlanması için birden fazla düzenli ifade yapısı kullanılabilir. Çeşitli

nedenlerden dolayı, belirli yapılar alternatiflerinden daha hızlı çalışır. Normal bir ifadenin kodunuzu gerektiğinden

daha yavaş çalıştırdığını belirlerseniz, aynı sonucu veren alternatif normal desenleri kullanmayı düşünün. Hangisinin

daha hızlı olduğuna karar vermek için bu alternatif desenleri test edin.

Çeşitli en iyileştirmeler

Bir TextField nesnesi için += operatörü yerine appendText() yöntemini kullanın.

TextField sınıfının text özelliğini kullanırken, += operatörü yerine appendText() yöntemini kullanın.

appendText() yöntemini kullanmak performansta iyileşme sağlar.

Örneğin, aşağıdaki kod += operatörünü kullanır ve döngü 1120 ms'de tamamlanır:

addChild ( myTextField ); myTextField.autoSize = TextFieldAutoSize.LEFT; var started:Number = getTimer(); for (var i:int = 0; i< 1500; i++ ) {

myTextField.text += "ActionScript 3"; } trace( getTimer() - started ); // output : 1120

Aşağıdaki örnekte, += operatörü appendText() yöntemiyle değiştirilir:

Page 45: Flashplatform optimizing content türkçe

41FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

ActionScript 3.0 performansı

Son güncelleme 30/3/2011

var myTextField:TextField = new TextField(); addChild ( myTextField ); myTextField.autoSize = TextFieldAutoSize.LEFT; var started:Number = getTimer(); for (var i:int = 0; i< 1500; i++ ) {

myTextField.appendText ( "ActionScript 3" ); } trace( getTimer() - started ); // output : 847

Kod artık 847 ms'de tamamlanır.

Mümkünse, metin alanlarını döngülerin dışında güncelleyin.

Bu kod basit bir tekniğin kullanımıyla daha da iyileştirilebilir. Her döngüdeki metin alanını güncellemek çok fazla

dahili işlenme gerektirir. Basitçe bir dize bitiştirip, ona döngünün dışındaki bir metin alanının değerini atadığınızda

kodu çalıştırma süresi önemli ölçüde düşer. Artık kodun tamamlanması için 2 ms gerekir:

var myTextField:TextField = new TextField(); addChild ( myTextField ); myTextField.autoSize = TextFieldAutoSize.LEFT; var started:Number = getTimer(); var content:String = myTextField.text; for (var i:int = 0; i< 1500; i++ ) {

content += "ActionScript 3"; } myTextField.text = content; trace( getTimer() - started ); // output : 2

Bir HTML metni ile çalışırken, eski yaklaşım öyle yavaştır ki bazı durumlarda Flash Player’da bir Timeout istisnası

atabilir. Örneğin, temeldeki donanım çok yavaşsa bir istisna atılabilir.

Not: Adobe® AIR® bu istisnayı atmaz.

var myTextField:TextField = new TextField(); addChild ( myTextField ); myTextField.autoSize = TextFieldAutoSize.LEFT; var started:Number = getTimer(); for (var i:int = 0; i< 1500; i++ ) {

myTextField.htmlText += "ActionScript <b>2</b>"; } trace( getTimer() - started );

Değer döngünün dışındaki bir dizeye atandığında kodun tamamlanması yalnızca 29 ms sürer:

Page 46: Flashplatform optimizing content türkçe

42FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

ActionScript 3.0 performansı

Son güncelleme 30/3/2011

var myTextField:TextField = new TextField(); addChild ( myTextField ); myTextField.autoSize = TextFieldAutoSize.LEFT; var started:Number = getTimer(); var content:String = myTextField.htmlText; for (var i:int = 0; i< 1500; i++ ) {

content += "<b>ActionScript<b> 3"; } myTextField.htmlText = content; trace ( getTimer() - started ); // output : 29

Not: Flash Player 10.1 ve AIR 2.5'te, dizelerin daha az bellek kullanması için String sınıfı iyileştirilmiştir.

Mümkünse köşeli parantez operatörünü kullanmaktan kaçının.

Köşeli parantez operatörünün kullanılması performansı yavaşlatabilir: Başvurunuzu yerel bir değişkende saklayarak

onu kullanmaktan kaçınabilirsiniz. Aşağıdaki kod örneği köşeli parantez operatörünün etkisiz kullanımını gösterir:

var lng:int = 5000; var arraySprite:Vector.<Sprite> = new Vector.<Sprite>(lng, true); var i:int; for ( i = 0; i< lng; i++ ) {

arraySprite[i] = new Sprite(); } var started:Number = getTimer(); for ( i = 0; i< lng; i++ ) {

arraySprite[i].x = Math.random()*stage.stageWidth; arraySprite[i].y = Math.random()*stage.stageHeight; arraySprite[i].alpha = Math.random(); arraySprite[i].rotation = Math.random()*360;

} trace( getTimer() - started ); // output : 16

Aşağıdaki en iyileştirilmiş sürüm köşeli parantez operatörünün kullanım oranını azaltır:

Page 47: Flashplatform optimizing content türkçe

43FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

ActionScript 3.0 performansı

Son güncelleme 30/3/2011

var lng:int = 5000; var arraySprite:Vector.<Sprite> = new Vector.<Sprite>(lng, true); var i:int; for ( i = 0; i< lng; i++ ) {

arraySprite[i] = new Sprite(); } var started:Number = getTimer(); var currentSprite:Sprite; for ( i = 0; i< lng; i++ ) {

currentSprite = arraySprite[i]; currentSprite.x = Math.random()*stage.stageWidth; currentSprite.y = Math.random()*stage.stageHeight; currentSprite.alpha = Math.random(); currentSprite.rotation = Math.random()*360; } trace( getTimer() - started ); // output : 9

Satır içi kodu, mümkün olduğunda, kodunuzdaki işlev çağrılarının sayısını düşürür.

İşlev çağırmak pahalı olabilir. Kod satır içini taşıyarak işlev çağrılarının sayısını azaltmayı deneyin. Kod satır içini

taşımak sadece performansı artırmak üzere en iyileştirmenin iyi bir yoludur. Ancak, satır içi kod, kodunuzun yeniden

kullanımını zorlaştırabilir ve SWF dosyanızın boyutunu büyütebilir. Bazı işlev çağrılarının, örneğin Math sınıfı

yöntemlerinin, satır içine taşınması kolaydır. Aşağıdaki kod, mutlak değerleri hesaplamak için Math.abs()

yöntemini kullanır:

const MAX_NUM:int = 500000; var arrayValues:Vector.<Number>=new Vector.<Number>(MAX_NUM,true); var i:int; for (i = 0; i< MAX_NUM; i++) {

arrayValues[i] = Math.random()-Math.random(); } var started:Number = getTimer(); var currentValue:Number; for (i = 0; i< MAX_NUM; i++) {

currentValue = arrayValues[i]; arrayValues[i] = Math.abs ( currentValue );

} trace( getTimer() - started ); // output : 70

Math.abs() tarafından yapılan hesaplama elle yapılabilir ve satır içine taşınabilir:

Page 48: Flashplatform optimizing content türkçe

44FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

ActionScript 3.0 performansı

Son güncelleme 30/3/2011

const MAX_NUM:int = 500000; var arrayValues:Vector.<Number>=new Vector.<Number>(MAX_NUM,true); var i:int; for (i = 0; i< MAX_NUM; i++) {

arrayValues[i] = Math.random()-Math.random(); } var started:Number = getTimer(); var currentValue:Number; for (i = 0; i< MAX_NUM; i++) {

currentValue = arrayValues[i]; arrayValues[i] = currentValue > 0 ? currentValue : -currentValue;

} trace( getTimer() - started ); // output : 15

İşlev çağrısı satır içi sonuçlarını taşımak, kodun dört kat daha hızlı olmasını sağlar. Bu yaklaşım pek çok durumda

kullanışlıdır ancak bunun yeniden kullanılabilirlik ve korunabilirlik açısından sebep olabileceği durumlara dikkat edin.

Not: Kod boyutu oynatıcının genel çalışmasının üzerinde büyük bir etkiye sahiptir. Uygulama yüksek düzeyde

ActionScript kodu içeriyorsa, sanal makine kodu doğrulamak ve JIT derlemek için çok zaman harcar. Özellik aramaları,

daha geniş miras hiyerarşileri nedeniyle ve dahili önbelleklerin daha fazla çalışmasından dolayı daha yavaş olabilir. Kod

boyutunu azaltmak için Adobe® Flex® çerçevesini, TLF çerçevesi kütüphanesini veya herhangi bir geniş üçüncü taraf

ActionScript kütüphanesini kullanmaktan kaçının.

Döngü şeklinde olan ifadeleri değerlendirmekten kaçının.

Başka bir en iyileştirme, döngü şeklinde olan bir ifadeyi değerlendirmeyerek sağlanabilir. Aşağıdaki kod bir dizi

üzerinde yinelenir ancak her yineleme için dizi uzunluğu değerlendirildiğinden dolayı en iyileştirilmez.

for (var i:int = 0; i< myArray.length; i++) { }

Değerin depolanması ve tekrar kullanılması daha iyi bir çözümdür.

var lng:int = myArray.length; for (var i:int = 0; i< lng; i++) { }

while döngüleri için ters sıra kullanın.

Ters sırada ilerleyen bir while döngüsü forward döngüsünden daha hızlıdır.

Page 49: Flashplatform optimizing content türkçe

45FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

ActionScript 3.0 performansı

Son güncelleme 30/3/2011

var i:int = myArray.length; while (--i > -1) { }

Bu ipuçları, tek satır kodun performansı ve belleği nasıl etkileyebileceğini göstererek birkaç ActionScript’i en

iyileştirme yolu sağlar. Çok sayıda başka ActionScript en iyileştirmesi mümkündür. Daha fazla bilgi için şu bağlantıya

bakın: http://www.rozengain.com/blog/2007/05/01/some-actionscript-30-optimizations/.

Page 50: Flashplatform optimizing content türkçe

46

Son güncelleme 30/3/2011

Bölüm 5: Performans oluşturma

Yeniden çizilen bölgeler

Projenizi oluştururken her zaman yeniden çizilen bölgeler seçeneğini kullanın.

Görüntü oluşturmayı geliştirmek için, projenizi oluştururken bölgeleri yeniden çizilen bölgeleri kullanmanız

önemlidir. Bu seçeneği kullanmak Flash Player'ın oluşturduğu ve işlediği bölgeleri görmenize izin verir. Flash Player'ın

hata ayıklama sürümünün bağlam menüsünde Yeniden Çizilen Bölgeleri Göster seçeneğini belirleyerek bu seçeneği

etkinleştirebilirsiniz.

Not: Yeniden Çizilen Bölgeleri Göster seçeneği, Adobe AIR'de veya Flash Player'ın yayınlama sürümünde mevcut

değildir. (Adobe AIR'de bağlam menüsü yalnızca masaüstü uygulamalarda kullanılabilir, ancak Yeniden Çizilen

Bölgeleri Göster gibi yerleşik veya standart öğeler içermez.)

Aşağıdaki görüntü bu seçeneğin zaman çizelgesinde basit bir animasyonlu MovieClip'de etkinleştirilmesini örnekler.

Yeniden çizilmiş bölgeler seçeneği etkin

Ayrıca bu seçeneği, flash.profiler.showRedrawRegions() yöntemini kullanarak programlama yoluyla

etkinleştirebilirsiniz:

// Enable Show Redraw Regions // Blue color is used to show redrawn regions flash.profiler.showRedrawRegions ( true, 0x0000FF );

Adobe AIR uygulamalarında bu yöntem, yeniden çizilen bölgeler seçeneğini etkinleştirmenin tek yoludur.

En iyileştirme fırsatlarını tanımlamak için yeniden çizilen bölgeleri kullanın. Bazı görüntüleme nesnelerinin

gösterilmemesine rağmen, hala oluşturulmakta olduklarından İşlemci döngüsü tükettiklerini unutmayın. Aşağıdaki

görüntü bu fikri örnekler. Siyah bir vektör şekli çalışan hareketli karakteri kaplar. Görüntü, görüntüleme nesnesinin

görüntüleme listesinden silinmediğini ve hala oluşturulduğunu gösterir. Bu İşlemci döngülerini tüketir:

Page 51: Flashplatform optimizing content türkçe

47FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

Yeniden çizilmiş bölgeler

Performansı artırmak için, gizli çalışan karakterin visible özelliğini false olarak ayarlayın veya görüntüleme

listesinden tamamen kaldırın. Zaman çizelgesini de durdurmanız gerekir. Bu adımlar görüntüleme nesnesinin

donmasını ve en az miktarda İşlemci gücü kullanmasını garantiler.

Tüm geliştirme döngüsü boyunca yeniden çizilen bölgeler seçeneğini kullanmayı unutmayın. Bu seçenek, projenin

sonuna geldiğinizde gereksiz yeniden çizilmiş bölgeler ve kaçırılmış olabilecek en iyileştirme alanları nedeniyle

şaşırmanızı engeller.

Daha fazla Yardım konusu

“Nesneleri dondurma ve çözme” sayfa 26

Sahne alanı dışı içerik

İçerikleri sahne alanı dışına yerleştirmekten kaçının. Bunun yerine, gerektiğinde nesneleri görüntüleme listesine

yerleştirin.

Mümkünse, grafiksel içeriği sahne alanı dışına yerleştirmemeye çalışın. Tasarımcılar ve geliştiriciler, uygulama ömrü

boyunca varlıkları yeniden kullanmak için genellikle öğeleri sahne alanı dışına yerleştirir. Aşağıdaki şekilde bu yaygın

teknik gösterilmektedir:

Page 52: Flashplatform optimizing content türkçe

48FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

Sahne alanı dışı içerik

Sahne alanı dışı öğeler ekranda gösterilmeyip oluşturulmasa da, yine de görüntüleme listesinde var olurlar. Çalışma

zamanı, bu öğelerin halen sahne alanı dışında olduğundan ve kullanıcının bunlarla etkileşim kurmadığından emin

olmak için bu öğelerde dahili testler çalıştırmaya devam eder. Sonuç olarak, mümkün olduğunca nesneleri sahne alanı

dışına yerleştirmekten kaçının ve bunları görüntüleme listesinden kaldırın.

Film kalitesi

Oluşturmayı iyileştirmek için uygun Sahne Alanı kalite ayarını kullanın.

Page 53: Flashplatform optimizing content türkçe

49FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

Telefonlar gibi küçük ekranlı mobil cihazlar için içerik geliştirirken, görüntü kalitesi masaüstü uygulamaları

geliştirmeye kıyasla daha az önem taşır. Sahne alanı kalitesine uygun ayarı yapmak oluşturma performansını

iyileştirebilir.

Sahne Alanı kalitesi için aşağıdaki ayarlar kullanılabilir:

• StageQuality.LOW: Oynatma hızını görünümden ayrıcalıklı kılar ve kenar yumuşatma kullanmaz. Bu ayar,

masaüstü veya TV için Adobe AIR'de desteklenmez.

• StageQuality.MEDIUM: Biraz kenar yumuşatma uygular ancak ölçeklenmiş bitmap’leri düzgünleştirmez. Bu ayar

mobil cihazlardaki AIR için varsayılan değerdir, ancak masaüstündeki ve TV'lerdeki AIR'lerde desteklenmez.

• StageQuality.HIGH: (Masaüstünde varsayılan) Görünümü oynatma hızından ayrıcalıklı kılar ve her zaman kenar

yumuşatma kullanır. SWF dosyası animasyon içermiyorsa, bitmap'ler düzgünleştirilir; SWF dosyası animasyon

içeriyorsa, bitmap'ler düzgünleştirilmez.

• StageQuality.BEST: En iyi görüntü kalitesini sunar ve oynatma hızını dikkate almaz. Tüm çıktının kenarları

yumuşatılır ve ölçeklenmiş bitmap'ler her zaman düzgünleştirilir.

StageQuality.MEDIUM öğesinin kullanımı genelde mobil aygıtlardaki uygulamalar için yeterli kaliteyi sağlar ve bazı

durumlarda StageQuality.LOW öğesinin kullanımı yeterli kaliteyi sağlayabilir. Flash Player 8’den itibaren, kenar

yumuşatmalı metin Sahne Alanı kalitesi LOW ayarına getirildiğinde bile doğru bir şekilde oluşturulabilir.

Not: Bazı mobil aygıtlarda, kalite HIGH olarak ayarlandığında bile, Flash Player uygulamalarında daha iyi performans

için MEDIUM kullanılır. Ancak, genelde mobil cihazların ekranları daha yüksek dpi'ye sahip olduğu için, kaliteyi HIGH

olarak ayarlamak algılanabilir bir fark yaratmaz. (Dpi cihaza bağlı olarak değişebilir.)

Aşağıdaki örnekte, film kalitesi MEDIUM değerine ve metin oluşturma Animasyon için Kenar Yumuşatma’ya ayarlıdır:

Orta Sahne alanı kalitesi ve Animasyon için Kenar Yumuşatma’ya ayarlı metin oluşturma

Sahne Alanı kalitesi ayarı, uygun metin oluşturma ayarı kullanılmadığı için metin kalitesini etkiler.

Çalışma zamanı, metin oluşturmayı Okunabilirlik için Kenar Yumuşatma'ya ayarlamanıza olanak sağlar. Bu ayar

hangi Sahne Alanı kalite ayarını kullandığınız fark etmeksizin metniniz (kenar yumuşatmalı) için mükemmel kaliteyi

korur.

Page 54: Flashplatform optimizing content türkçe

50FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

Düşük Sahne alanı kalitesi ve Okunabilirlik için Kenar Yumuşatma’ya ayarlı metin oluşturma

Metin oluşturma Bitmap Metni'ne (Kenar yumuşatma olmadan) ayarlanarak aynı oluşturma kalitesi sağlanabilir:

Düşük Sahne Alanı kalitesi ve Bitmap Metni'ne ayarlı metin oluşturma (Kenar yumuşatma olmadan)

Son iki örnek hangi Sahne Alanı kalitesini kullandığınız fark etmeksizin yüksek kaliteli metin elde edebileceğinizi

gösterir: Bu özellik Flash Player 8’den bu yana bulunmaktadır ve mobil aygıtlarda da kullanılabilir. Bazı aygıtlarda

performansı yükseltmek için Flash Player 10.1’in otomatik olarak StageQuality.MEDIUM değerine dönebileceğini

unutmayın.

Alfa karıştırma

Alpha özelliğini kullanmaktan mümkün olduğunca kaçının.

Alpha özelliğini kullanırken yavaşça görünme efekti gibi alfa karıştırma gerektiren efektleri kullanmaktan kaçının. Bir

görüntüleme nesnesi alfa karıştırma özelliğini kullandığında, çalışma zamanı son rengi belirlemek için her istiflenmiş

görüntüleme nesnesinin renk değerlerini ve arka plan rengini birleştirmelidir. Böylece alfa karıştırma, opak bir renk

çizmekten daha fazla işlemci işlemi gerektirebilir. Bu fazladan hesaplama, yavaş aygıtlarda performansı düşürebilir.

alpha özelliğini kullanmaktan mümkün olduğunca kaçının.

Page 55: Flashplatform optimizing content türkçe

51FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

Daha fazla Yardım konusu

“Bitmap'leri önbelleğe alma” sayfa 52

“Metin nesnelerinin oluşturulması” sayfa 66

Uygulama kare hızı

Genelde, daha iyi performans için, mümkün olan en düşük kare hızını kullanın.

Uygulamanın kare hızı, “Çalışma zamanı kodunu çalıştırmanın temelleri” sayfa 1 bölümünde belirtildiği şekilde, her

“uygulama kodu ve oluşturma” döngüsü için ne kadar süre gerektiğini belirler. Daha yüksek kare hızı daha sorunsuz

bir animasyon oluşturur. Ancak, animasyon veya diğer görsel değişiklikler gerçekleşmediğinde, genellikle yüksek kare

hızı kullanmak için bir neden yoktur. Daha yüksek bir kare hızı, düşük hızla karşılaştırıldığında daha fazla işlemci

döngüsü ve pil enerjisi harcar.

Aşağıda, uygulamanız için uygun bir varsayılan kare hızının ayarlanmasına ilişkin bazı genel kılavuzlar mevcuttur:

• Flex çerçevesi kullanıyorsanız, başlangıç kare hızını varsayılan değerde bırakın..

• Uygulamanız animasyon içeriyorsa, uygun kare hızı en az saniyede 20 karedir. 30 kareden fazla olan herhangi bir

hız genellikle gereksizdir.

• Uygulamanız animasyon içermiyorsa, saniyede 12 karelik bir hız büyük olasılıkla yeterlidir.

“Olabilecek en düşük kare hızı” uygulamanın o andaki etkinliğine bağlı olarak değişebilir. Daha fazla bilgi için, bir

sonraki ipucu olan “Uygulamanızın kare hızını dinamik olarak değiştirme” bölümünü inceleyin.

Uygulamanızdaki tek dinamik içerik video olduğunda düşük bir kare hızı kullanın.

Çalışma zamanı, uygulamanın kare hızı ne olursa olsun, yüklenen video içeriğini yerel kare hızında oynatır.

Uygulamanız bir animasyon veya hızla değişen görsel içerik içermiyorsa, düşük bir kare hızının kullanılması kullanıcı

arabiriminin deneyimini bozmaz.

Uygulamanızın kare hızını dinamik olarak değiştirme.

Uygulamanın ilk kare hızını proje veya derleyici ayarlarında tanımlarsınız ancak kare hızı o değerde sabitlenmez. Kare

hızını Stage.frameRate özelliğini (veya Flex’teki WindowedApplication.frameRate özelliği) ayarlayarak

değiştirebilirsiniz.

Kare hızını uygulamanızın geçerli gereksinimlerine göre değiştirin. Örneğin, uygulamanız herhangi bir animasyon

çalıştırmadığında, kare hızını düşürün. Hareketli bir geçiş başlamak üzere olduğunda, kare hızını yükseltin. Benzer

şekilde, uygulamanız arka planda çalışıyorsa (odağını kaybettikten sonra), kare hızını daha da düşürebilirsiniz.

Kullanıcının başka bir uygulama veya göreve odaklanmış olması mümkündür.

Aşağıdakiler, farklı etkinlik türleri için uygun olan kare hızının belirlenmesine yönelik bir başlangıç noktası olarak

kullanılacak genel kılavuzlardır:

• Flex çerçevesi kullanıyorsanız, başlangıç kare hızını varsayılan değerde bırakın..

• Animasyon oynatılırken, kare hızını en az saniyede 20 kare olarak ayarlayın. 30 kareden fazla olan herhangi bir hız

genellikle gereksizdir.

• Bir animasyon oynatılmıyorken, saniyede 12 karelik bir hız büyük olasılıkla yeterlidir.

Page 56: Flashplatform optimizing content türkçe

52FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

• Yüklenen video, uygulama kare hızına bağlı olmaksızın yerel kare hızında oynatılır. Uygulamanızdaki tek hareketli

içerik video ise, saniyede 12 karelik bir hız büyük olasılıkla yeterlidir.

• Uygulamanın bir girdi odağı olmadığında, saniyede 5 karelik bir hız büyük olasılıkla yeterlidir.

• AIR uygulaması görünür olmadığında, saniyede 2 kare veya daha az bir kare hızı büyük ihtimalle uygundur.

Örneğin bu yönerge, bir uygulama simge durumuna küçültüldüğünde geçerli olur. Ayrıca yerel pencerenin

visible özelliği false olursa, masaüstü aygıtlarda da geçerli olur.

Flex’e dahil uygulamalar için, spark.components geçerlidir. WindowedApplication sınıfında uygulamanın kare hızını

dinamik olarak değiştirmek için dahili destek mevcuttur. backgroundFrameRate özelliği, uygulama etkin

olmadığında uygulamanın kare hızını belirler. Varsayılan değer, Spark çerçevesiyle oluşturulmuş bir uygulamanın

kare hızını 1 kare/sn olarak değiştiren 1 değeridir. backgroundFrameRate özelliğini ayarlayarak arka plan kare hızını

değiştirebilirsiniz. Özelliği başka bir değere ayarlayabilirsiniz veya otomatik kare hızı azaltmayı kapatmak için -1

olarak ayarlayabilirsiniz.

Bir uygulamanın kare hızını dinamik olarak değiştirmeyle ilgili daha fazla bilgi için, aşağıdaki makaleleri inceleyin:

• Reducing CPU usage in Adobe AIR (Adobe AIR’de CPU kullanımını azaltma) (Jonnie Hallman tarafından yazılan

Adobe Geliştirici Merkezi makalesi ve örnek kod)

• Writing well-behaved, efficient, AIR applications (Başarılı davranış gösteren, etkili AIR uygulamaları yazma)

(Arno Gourdol tarafından yazılan makale ve örnek uygulama)

Grant Skinner bir kare hızı azaltma sınıfı oluşturdu. Bu sınıfı uygulamalarınızda, uygulamanız arka plandayken kare

hızını otomatik olarak düşürmek için kullanabilirsiniz. FramerateThrottler sınıfı hakkında daha fazla bilgi edinmek ve

bu sınıfın kaynak kodunu indirmek için, http://gskinner.com/blog/archives/2009/05/idle_cpu_usage.html adresinde

Grant'ın Idle CPU Usage in Adobe AIR and Flash Player (Adobe AIR ve Flash Player'da Boşta İşlemci Kullanımı)

başlıklı makalesine bakın.

Bağdaşık kare hızı

Bir SWF dosyasını derlerken, film için belirli bir kare hızı ayarlayabilirsiniz. Düşük CPU hızlı kısıtlı bir ortamda, bazen

kare hızı oynatma sırasında düşebilir. Kullanıcıdan kabul edilebilir bir kare hızını korumak için, çalışma zamanı bazı

karelerin oluşturulmasını atlar. Bazı karelerin oluşturulmasını atlamak kare hızının kabul edilebilir bir değerden aşağı

inmesini önler.

Not: Bu durumda, çalışma zamanı kare atlamaz, yalnızca karelerdeki içeriğin oluşturulmasını atlar. Kod çalıştırılmaya

devam eder ve görüntüleme listesi güncellenir ancak güncellemeler ekran üzerinde görünmez. Çalışma zamanı kare

hızını sabit tutamıyorsa, kaç karenin atlanacağını belirleyen eşik kare/saniye değeri belirlemek mümkün değildir.

Bitmap'leri önbelleğe alma

Karmaşık vektör içeriği için, uygun olduğu zaman bitmap'leri önbelleğe alma özelliğini kullanın.

İyi bir en iyileştirme, bitmap önbelleğe alma özelliği kullanılarak gerçekleştirilebilir. Bu özellik bir vektör nesnesini

önbelleğe alır, onu dahili şekilde bir bitmap olarak oluşturur ve o bitmap’i oluşturma için kullanır. Sonuç, oluşturma

için aşırı yüksek bir performans artışıdır ancak önemli miktarda bellek gerektirebilir. Karmaşık degradeler veya metin

gibi karmaşık vektör içeriği için bitmap'leri önbelleğe alma özelliğini kullanın.

Page 57: Flashplatform optimizing content türkçe

53FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

Karmaşık vektör grafikleri kullanan (metin veya degradeler gibi) bir hareketli nesne için bitmap'leri önbelleğe almayı

açmak performansı iyileştirir. Ancak, zaman çizelgesi yürütülen bir film klibi gibi görüntüleme nesnesinde bitmap

önbelleğe alımı etkinse tam tersi sonucu alırsınız. Her karede, çalışma zamanı önbelleğe alınmış bitmap'i güncellemeli

ve ekranda yeniden çizmelidir ve bu çok fazla işlemci döngüsü gerektirir. Bitmap'leri önbelleğe alma özelliği, yalnızca

önbelleğe alınmış bitmap bir kere oluşturulup güncellenme gereksinimi duyulmadan kullanılıyorsa yarar sağlar.

Bir Sprite nesnesi için bitmap önbelleğe alma özelliğini açarsanız; nesne çalışma zamanının önbelleğe alınan bitmap’i

yeniden oluşturmasına neden olmadan taşınabilir. Nesneninx ve y özelliklerinin değiştirilmesi yeniden oluşturmaya

neden olmaz. Ancak döndürme, ölçeklendirme veya alfa değerini değiştirme, çalışma zamanının önbelleğe alınmış

bitmap’i yeniden oluşturmasına neden olur ve bunun sonucunda performans zarar görür.

Not: AIR ve Packager for iPhone uygulamalarında bulunan DisplayObject.cacheAsBitmapMatrix özelliğinde bu

kısıtlama yoktur. cacheAsBitmapMatrix özelliğini kullanarak, bitmap yeniden oluşturmayı tetiklemeden görüntüleme

nesnesinin alfa değerini döndürebilir, ölçeklendirebilir, eğriltebilir ve değiştirebilirsiniz.

Önbelleğe alınan bir bitmap sıradan bir film klibi örneğine göre daha fazla bellek kullanabilir. Örneğin, Sahne

Alanı'ndaki bir film klibi 250 x 250 piksel boyutlarına sahipse, arabelleğe alınmadığında kullanacağı 1 KB yerine,

arabelleğe alındığında yaklaşık 250 KB kullanır.

Aşağıdaki örnekte elma görüntüsü içeren bir Sprite nesnesi vardır. Aşağıdaki sınıf elma sembolüne bağlıdır:

package org.bytearray.bitmap { import flash.display.Sprite; import flash.events.Event; public class Apple extends Sprite { private var destinationX:Number; private var destinationY:Number; public function Apple () { addEventListener(Event.ADDED_TO_STAGE,activation); addEventListener(Event.REMOVED_FROM_STAGE,deactivation); } private function activation(e:Event):void { initPos(); addEventListener (Event.ENTER_FRAME,handleMovement); } private function deactivation(e:Event):void

Page 58: Flashplatform optimizing content türkçe

54FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

{ removeEventListener(Event.ENTER_FRAME,handleMovement); } private function initPos():void { destinationX = Math.random()*(stage.stageWidth - (width>>1)); destinationY = Math.random()*(stage.stageHeight - (height>>1)); } private function handleMovement(e:Event):void { x -= (x - destinationX)*.5; y -= (y - destinationY)*.5; if (Math.abs(x - destinationX) < 1 && Math.abs(y - destinationY) < 1) initPos(); } } }

Kod, her elma için bir zaman çizelgesi gerekmediğinden MovieClip sınıfı yerine Sprite sınıfını kullanır. En iyi

performans için, mümkün olan en hafif nesneyi kullanın. Sonra, sınıf aşağıdaki kod ile başlatılır:

Page 59: Flashplatform optimizing content türkçe

55FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

import org.bytearray.bitmap.Apple; stage.addEventListener(MouseEvent.CLICK,createApples); stage.addEventListener(KeyboardEvent.KEY_DOWN,cacheApples); const MAX_NUM:int = 100; var apple:Apple; var holder:Sprite = new Sprite(); addChild(holder); function createApples(e:MouseEvent):void { for (var i:int = 0; i< MAX_NUM; i++) { apple = new Apple(); holder.addChild(apple); } } function cacheApples(e:KeyboardEvent):void { if (e.keyCode == 67) { var lng:int = holder.numChildren; for (var i:int = 0; i < lng; i++) { apple = holder.getChildAt (i) as Apple; apple.cacheAsBitmap = Boolean(!apple.cacheAsBitmap); } } }

Kullanıcı fareyi tıklattığında, elmalar arabelleğe alınmadan oluşturulur. Kullanıcı C (tuş kodu 67) tuşuna bastığında,

elma vektörleri bitmap'ler olarak arabelleğe alınır ve ekran üzerinde görüntülenir. Bu teknik CPU yavaş olduğunda

hem masaüstü hem de mobil cihazlar için oluşturma performansını büyük ölçüde iyileştirir.

Ancak, bitmap'leri arabelleğe alma özelliği oluşturma performansını iyileştirse de, hızla büyük miktarda bellek

tüketebilir. Bir nesne önbelleğe alındığı anda, yüzeyi aşağıdaki şemada gösterildiği gibi saydam bitmap olarak

yakalanır ve bellekte saklanır.

Page 60: Flashplatform optimizing content türkçe

56FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

Bellekte saklanan nesne ve bu nesnenin yüzey bitmap’i

Flash Player 10.1 ve AIR 2.5, “Filtreleri ve dinamik bitmap'i kaldırma” sayfa 18 bölümünde anlatılan yaklaşımı

uygulayarak bellek kullanımını en iyi hale getirir. Önbelleğe alınmış görüntüleme nesnesi ekranda değilse ya da

gizliyse, bir süre kullanılmadığında bellekteki bitmap serbest bırakılır.

Not: Görüntüleme nesnesinin opaqueBackground özelliği belirli bir renge ayarlanırsa, çalışma zamanı görüntüleme

nesnesini opak olarak varsayar. cacheAsBitmap özelliği ile birlikte kullanıldığında, çalışma zamanı bellekte saydam

olmayan bir 32 bit bitmap oluşturur. Alfa kanalı 0xFF olarak ayarlanır, bu da ekran üzerindeki bitmap’in çizilmesi için

saydamlık gerekmediğinden performansı iyileştirir. Alfa karıştırmayı önlemek oluşturma işlemini daha da hızlandırır.

Geçerli ekran derinliği 16 bit ile sınırlıysa, bellekteki bitmap 16 bit’lik bir görüntü olarak saklanır. opaqueBackground

özelliğinin kullanılması bitmap'leri artalanda önbelleğe alma işlemini başlatmaz.

Bellekten tasarruf etmek için, cacheAsBitmap özelliğini kullanın ve onu kap yerine her görüntüleme nesnesinde

etkinleştirin. Kaptaki bitmap'leri önbelleğe almayı etkinleştirme işlemi, 211 x 279 piksel boyutlarında saydam bitmap

oluşturarak son bitmap’in bellekte çok daha fazla yer kaplamasına yol açar. Görüntü yaklaşık 229 KB'lık bellek kullanır:

Kapta bitmap'leri arabelleğe almayı etkinleştirme

Ayrıca, kabı önbelleğe alarak, herhangi bir elmanın bir karede hareket etmeye başlaması durumunda bellekte

bitmap’in tamamının güncellenmesi riskini de alırsınız. Bağımsız örneklerde bitmap'leri arabelleğe almayı

etkinleştirmek bellekte yalnızca 42 KB kullanmak demek olan 7 KB'lık yüzeyleri arabelleğe almayla sonuçlanır.

Bellekteki

Bitmap versiyonu cacheAsBitmap = true

Görüntülenen

211 piksel

279 piksel

Page 61: Flashplatform optimizing content türkçe

57FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

Örneklerde bitmap'leri arabelleğe almayı etkinleştirme

Her elma örneğine görüntüleme listesi üzerinden erişilmesi ve getChildAt() yönteminin kullanılması başvuruları

daha kolay erişim için bir Vector nesnesinde saklar:

Page 62: Flashplatform optimizing content türkçe

58FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

import org.bytearray.bitmap.Apple; stage.addEventListener(KeyboardEvent.KEY_DOWN, cacheApples); const MAX_NUM:int = 200; var apple:Apple; var holder:Sprite = new Sprite(); addChild(holder); var holderVector:Vector.<Apple> = new Vector.<Apple>(MAX_NUM, true); for (var i:int = 0; i< MAX_NUM; i++) { apple = new Apple(); holder.addChild(apple); holderVector[i] = apple; } function cacheApples(e:KeyboardEvent):void { if (e.keyCode == 67) { var lng:int = holderVector.length for (var i:int = 0; i < lng; i++) { apple = holderVector[i]; apple.cacheAsBitmap = Boolean(!apple.cacheAsBitmap); } } }

Her karede önbelleğe alınmış içerik döndürülmüyor, ölçeklendirilmiyor veya değiştirilmiyorsa bitmap'leri önbelleğe

almanın oluşturma işlemini iyileştireceğini unutmayın. Ancak, oluşturma x ve y eksenlerinde çevrilme haricindeki

herhangi bir dönüştürme için iyileştirilmez. Bu durumlarda, Flash Player görüntüleme nesnesinde oluşan her

dönüştürme için önbelleğe alınan bitmap kopyasını günceller. Önbelleğe alınan kopyanın güncellenmesi işlemcinin

fazla kullanımı, yavaş performans ve yüksek pil kullanımına neden olabilir. AIR veya Packager for iPhone

uygulamalarında bulunan cacheAsBitmapMatrix özelliğinde bu kısıtlama yoktur.

Aşağıdaki kod hareket yöntemindeki alfa değerini değiştirir, bu da her karede elmanın opaklığını değiştirir.

private function handleMovement(e:Event):void { alpha = Math.random(); x -= (x - destinationX)*.5; y -= (y - destinationY)*.5; if (Math.abs(x - destinationX) < 1 && Math.abs(y - destinationY) < 1) initPos(); }

Bitmap'leri arabelleğe alma performansta bir yavaşlamaya sebep olur. Alfa değerinin değiştirilmesi, çalışma zamanını

her alfa değeri değişiminde bellekte arabelleğe alınan bitmap'i güncellemeye zorlar.

Page 63: Flashplatform optimizing content türkçe

59FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

Filtreler önbelleğe alınan bir film klibi oynatma kafasının her hareket edişinde güncellenen bitmap'lere bağlıdır. Bu

nedenle, bir filtre kullanılması, otomatik olarak cacheAsBitmap özelliğini true değerine ayarlar. Aşağıdaki şekilde

hareketli bir film klibi gösterilmektedir:

Hareketli film klibi

Performansta sorunlara yol açacağından, hareketli içerikte filtre kullanımından kaçının. Aşağıdaki şekilde, tasarımcı

bir alt gölge filtresi ekler:

Alt gölge filtresiyle hareketli film klibi

Sonuç olarak, film klibinin içindeki zaman çizelgesi oynatılıyorsa, bitmap yeniden oluşturulmalıdır. Basit bir x veya y

dönüşümü haricinde içerik değiştirilmişse de bitmap yeniden oluşturulmalıdır. Her kare, çalışma zamanını bitmap’i

yeniden çizmeye zorlar, bu da daha fazla işlemci kaynağı kullanımı gerektirir, düşük performansa neden olur ve daha

fazla pil ömrü tüketir.

AIR'de önbelleğe alınan bitmap dönüştürme matrisleri

Mobil AIR uygulamalarında önbelleğe alınan bitmap'leri kullanırken cacheAsBitmapMatrix özelliğini ayarlayın.

AIR mobil profilinde, bir görüntüleme nesnesinin cacheAsBitmapMatrix özelliğine Matris nesnesi atayabilirsiniz. Bu

özelliği ayarladığınızda, önbelleğe alınan bitmap'i yeniden oluşturmadan nesneye iki boyutlu dönüştürme

uygulayabilirsiniz. Ayrıca önbelleğe alınan bitmap'i yeniden oluşturmadan da alfa özelliğini değiştirebilirsiniz.

cacheAsBitmap özelliği de true değerine ayarlanmalı ve nesnede ayarlanmış bir 3B özellik olmamalıdır.

cacheAsBitmapMatrix özelliğinin ayarlanması, görüntüleme nesnesi ekran dışında da olsa, görünümden gizlenmiş

de olsa veya visible özelliği false olarak ayarlanmış da olsa, önbelleğe alınmış bitmap oluşturur. Farklı bir

dönüştürme içeren bir matris nesnesi kullanılarak cacheAsBitmapMatrix özelliğinin sıfırlanması da önbelleğe

alınmış bitmap'i yeniden oluşturur.

Page 64: Flashplatform optimizing content türkçe

60FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

cacheAsBitmapMatrix özelliğine uyguladığınız matris dönüştürmesi, bitmap önbelleğinde oluşturuldukça

görüntüleme nesnesine uygulanır. Böylece, dönüştürme 2x ölçek içeriyorsa, bitmap oluşturma, vektör oluşturma

boyutunun iki katıdır. Oluşturucu, önbelleğe alınan bitmap'e ters dönüştürme uygular; böylece son görüntü aynı

şekilde görünür. Bellek kullanımını azaltmak için, muhtemelen aslına uygun oluşturma konusunda taviz vererek

önbelleğe alınan bitmap'i daha küçük bir boyuta ölçekleyebilirsiniz. Ayrıca bazı durumlarda oluşturma kalitesini

artırmak için, yüksek bellek kullanımı pahasına, bitmap'i daha büyük bir boyuta ölçeklendirebilirsiniz. Genellikle,

aşağıdaki örnekte gösterildiği gibi, görünümdeki değişiklikleri önlemek için herhangi bir dönüştürme uygulamayan

bir matris niteliğindeki kimlik matrisi kullanın.

displayObject.cacheAsBitMap = true; displayObject.cacheAsBitmapMatrix = new Matrix();

cacheAsBitmapMatrix özelliği ayarlandıktan sonra, bitmap yeniden oluşturmayı tetiklemeden nesneyi

ölçeklendirebilir, eğriltebilir, döndürebilir ve çevirebilirsiniz.

Ayrıca 0 -1 aralığında alfa değerini de değiştirebilirsiniz. Renk dönüştürmesi ile birlikte transform.colorTransform

özelliği yoluyla alfa değerini değiştirirseniz, dönüştürme nesnesinde kullanılan alfa 0 ile 255 aralığında olmalıdır. Renk

dönüştürmesinin başka bir şekilde değiştirilmesi, önbelleğe alınan bitmap'i yeniden oluşturur.

Mobil aygıtlar için oluşturulan içerikte cacheAsBitmap öğesini true olarak ayarladığınızda her zaman

cacheAsBitmapMatrix özelliğini ayarlayın. Ancak, aşağıdaki olası dezavantajı unutmayın. Bir nesne

döndürüldükten, ölçeklendirildikten veya eğriltildikten sonra, son oluşturma, normal bir vektör oluşturma ile

karşılaştırıldığında bitmap ölçeklendirme veya kenar yumuşatma yapıları sergileyebilir.

Bitmap'leri elle önbelleğe alma

Özel bir bitmap'leri arabelleğe alma davranışı oluşturmak için BitmapData sınıfını kullanın.

Aşağıdaki örnek bir görüntüleme nesnesinin tek bir rasterleştirilmiş bitmap versiyonunu yeniden kullanır ve aynı

BitmapData nesnesine başvurur. Görüntüleme nesnelerinin her biri ölçeklendirilirken, bellekteki orijinal BitmapData

nesnesi güncellenmez ve yeniden çizilmez. Bu yaklaşım CPU kaynaklarından tasarruf sağlar ve uygulamaların daha

hızlı çalışmasına olanak verir. Görüntüleme nesnesi ölçeklendirilirken, içerikteki bitmap uzatılır.

Güncellenen BitmapApple sınıfı:

Page 65: Flashplatform optimizing content türkçe

61FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

package org.bytearray.bitmap { import flash.display.Bitmap; import flash.display.BitmapData; import flash.events.Event; public class BitmapApple extends Bitmap { private var destinationX:Number; private var destinationY:Number; public function BitmapApple(buffer:BitmapData) { super(buffer); addEventListener(Event.ADDED_TO_STAGE,activation); addEventListener(Event.REMOVED_FROM_STAGE,deactivation); } private function activation(e:Event):void { initPos(); addEventListener(Event.ENTER_FRAME,handleMovement); } private function deactivation(e:Event):void { removeEventListener(Event.ENTER_FRAME,handleMovement); } private function initPos():void { destinationX = Math.random()*(stage.stageWidth - (width>>1)); destinationY = Math.random()*(stage.stageHeight - (height>>1)); } private function handleMovement(e:Event):void { alpha = Math.random(); x -= (x - destinationX)*.5; y -= (y - destinationY)*.5; if ( Math.abs(x - destinationX) < 1 && Math.abs(y - destinationY) < 1) initPos(); } } }

Alfa değeri her karede hala değiştirilir. Aşağıdaki kod orijinal kaynak arabelleğini her bir BitmapApple örneğine iletir.

Page 66: Flashplatform optimizing content türkçe

62FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

import org.bytearray.bitmap.BitmapApple; const MAX_NUM:int = 100; var holder:Sprite = new Sprite(); addChild(holder); var holderVector:Vector.<BitmapApple> = new Vector.<BitmapApple>(MAX_NUM, true); var source:AppleSource = new AppleSource(); var bounds:Object = source.getBounds(source); var mat:Matrix = new Matrix(); mat.translate(-bounds.x,-bounds.y); var buffer:BitmapData = new BitmapData(source.width+1, source.height+1, true, 0); buffer.draw(source,mat); var bitmapApple:BitmapApple; for (var i:int = 0; i< MAX_NUM; i++) { bitmapApple = new BitmapApple(buffer); holderVector[i] = bitmapApple; holder.addChild(bitmapApple); }

Yalnızca önbelleğe alınmış tek bir bitmap bellekte kullanıldığından ve bütün BitmapApple örnekleri tarafından

paylaşıldığından bu teknik az miktarda bellek kullanır. Ek olarak, BitmapApple örneklerine yapılan alfa, döndürme

ve ölçeklendirme gibi herhangi bir değişime rağmen, orijinal kaynak bitmap’i asla güncellenmez. Bu tekniğin

kullanımı performansta yavaşlamayı önler.

Düzgün bir bitmap sonucu için, smoothing özelliğini true değerine ayarlayın:

public function BitmapApple(buffer:BitmapData) {

super (buffer);

smoothing = true;

addEventListener(Event.ADDED_TO_STAGE, activation); addEventListener(Event.REMOVED_FROM_STAGE, deactivation); }

Sahne Alanı kalitesini ayarlamak da performansı iyileştirebilir. Sahne Alanı kalitesini, rasterleştirmeden önce HIGH

değerine ayarlayın ve sonrasında LOW değerine geçin.

Page 67: Flashplatform optimizing content türkçe

63FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

import org.bytearray.bitmap.BitmapApple; const MAX_NUM:int = 100; var holder:Sprite = new Sprite(); addChild ( holder ); var holderVector:Vector.<BitmapApple> = new Vector.<BitmapApple>(MAX_NUM, true); var source:AppleSource = new AppleSource(); var bounds:Object = source.getBounds ( source ); var mat:Matrix = new Matrix(); mat.translate ( -bounds.x, -bounds.y ); var buffer:BitmapData = new BitmapData ( source.width+1, source.height+1, true, 0 ); stage.quality = StageQuality.HIGH; buffer.draw ( source, mat ); stage.quality = StageQuality.LOW; var bitmapApple:BitmapApple; for (var i:int = 0; i< MAX_NUM; i++ ) {

bitmapApple = new BitmapApple( buffer ); holderVector[i] = bitmapApple;

holder.addChild ( bitmapApple );

}

Sahne Alanı kalitesinin bitmap’e vektörü çizdikten önce ve sonra değiştirilmesi, ekranda kenarları yumuşatılmış içerik

elde etmek için kullanışlı bir teknik olabilir. Bu teknik son sahne alanı kalitesinden bağımsız olarak etkili olabilir.

Örneğin Sahne Alanı kalitesi LOW olarak ayarlıyken bile kenarları yumuşatılmış metin ile beraber kenarları

yumuşatılmış bitmap alabilirsiniz. Bu teknik cacheAsBitmap özelliği ile kullanılmaz. Bu durumda, Sahne Alanı

kalitesinin LOW olarak ayarlanması, bellekteki yüzeyleri ve son kaliteyi güncelleyen vektör kalitesini günceller.

Davranışları yalıtma

Event.ENTER_FRAME olayı gibi olayları mümkün olduğunca tek bir işleyicide ayırın.

Kod, Apple sınıfındaki Event.ENTER_FRAME olayının tek bir işleyicide yalıtılmasıyla daha da en iyileştirilebilir. Bu

teknik işlemci kaynaklarını korur. Aşağıdaki örnekte BitmapApple sınıfının hareket davranışını işlemediği farklı

yaklaşım gösterilmektedir:

Page 68: Flashplatform optimizing content türkçe

64FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

package org.bytearray.bitmap { import flash.display.Bitmap; import flash.display.BitmapData; public class BitmapApple extends Bitmap { private var destinationX:Number; private var destinationY:Number; public function BitmapApple(buffer:BitmapData) { super (buffer); smoothing = true; } }

Aşağıdaki kod elmaları örnekler ve hareketlerini tek bir işleyicide işler:

import org.bytearray.bitmap.BitmapApple; const MAX_NUM:int = 100; var holder:Sprite = new Sprite(); addChild(holder); var holderVector:Vector.<BitmapApple> = new Vector.<BitmapApple>(MAX_NUM, true); var source:AppleSource = new AppleSource(); var bounds:Object = source.getBounds(source); var mat:Matrix = new Matrix(); mat.translate(-bounds.x,-bounds.y); stage.quality = StageQuality.BEST; var buffer:BitmapData = new BitmapData(source.width+1,source.height+1, true,0); buffer.draw(source,mat); stage.quality = StageQuality.LOW; var bitmapApple:BitmapApple; for (var i:int = 0; i< MAX_NUM; i++) { bitmapApple = new BitmapApple(buffer); bitmapApple.destinationX = Math.random()*stage.stageWidth; bitmapApple.destinationY = Math.random()*stage.stageHeight; holderVector[i] = bitmapApple; holder.addChild(bitmapApple); } stage.addEventListener(Event.ENTER_FRAME,onFrame);

Page 69: Flashplatform optimizing content türkçe

65FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

var lng:int = holderVector.length function onFrame(e:Event):void { for (var i:int = 0; i < lng; i++) { bitmapApple = holderVector[i]; bitmapApple.alpha = Math.random(); bitmapApple.x -= (bitmapApple.x - bitmapApple.destinationX) *.5; bitmapApple.y -= (bitmapApple.y - bitmapApple.destinationY) *.5; if (Math.abs(bitmapApple.x - bitmapApple.destinationX ) < 1 &&

Math.abs(bitmapApple.y - bitmapApple.destinationY ) < 1) { bitmapApple.destinationX = Math.random()*stage.stageWidth; bitmapApple.destinationY = Math.random()*stage.stageHeight; } } }

Sonuç, her elmayı hareket ettiren 200 işleyici yerine hareketi işleyen tek bir Event.ENTER_FRAME olayıdır.

Animasyonun tamamı kolayca durdurulabilir; bu durum da bir oyunda kullanışlı bir özelliktir.

Örneğin, basit bir oyun aşağıdaki işleyiciyi kullanabilir:

stage.addEventListener(Event.ENTER_FRAME, updateGame); function updateGame (e:Event):void {

gameEngine.update(); }

Bir sonraki adım, elmaların fare veya klavye ile etkileşime girmesini sağlamaktır, bu da BitmapApple sınıfında

değişiklikler yapılmasını gerektirir.

package org.bytearray.bitmap { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; public class BitmapApple extends Sprite { public var destinationX:Number; public var destinationY:Number; private var container:Sprite; private var containerBitmap:Bitmap; public function BitmapApple(buffer:BitmapData) { container = new Sprite(); containerBitmap = new Bitmap(buffer); containerBitmap.smoothing = true; container.addChild(containerBitmap); addChild(container); } }

Page 70: Flashplatform optimizing content türkçe

66FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

Sonuçta geleneksel Sprite nesnelerine benzer etkileşimli BitmapApple örnekleri elde edilir. Ancak, örnekler

görüntüleme nesnelerinin yüzeyleri dönüştürüldüğünde yeniden örneklenmeyen tek bir bitmap’e bağlıdır.

Metin nesnelerinin oluşturulması

Metin oluşturma performansını iyileştirmek için bitmap'leri arabelleğe alma özelliğini ve opaqueBackground

özelliğini kullanın.

Flash Metin Motoru bazı mükemmel en iyileştirmeler sağlar. Ancak, bazı sınıfların tek bir metin satırı göstermesi

beklenir. Bu sebepten dolayı, TextLine sınıfı ile düzenlenebilir bir metin alanı oluşturmak oldukça büyük miktarda

bellek ve ActionScript kod satırı gerektirir. TextLine sınıfının en iyi kullanımı, daha hızlı oluşturmanın sağlanabilmesi

ve daha az bellek gerektirmesinden dolayı statik ve düzenlenebilir olmayan metin için olandır.

Bitmap'leri arabelleğe alma özelliği, oluşturma performansını iyileştirmek için vektör içeriğini bitmap'ler gibi

arabelleğe almanıza olanak verir. Bu özellik karmaşık vektör içeriği için ve oluşturulması için işleme gerektiren metin

içeriğiyle kullanıldığında kullanışlıdır.

Aşağıdaki örnek bitmap'lerin arabelleğe alınması özelliğinin ve opaqueBackground özelliğinin oluşturma

performansının iyileştirilmesi için nasıl kullanılabileceğini gösterir. Aşağıdaki resim kullanıcı bir şeyin yüklenmesini

beklerken görüntülenebilecek sıkça rastlanan bir Hoş Geldiniz ekranını gösterir.

Hoş Geldiniz ekranı

Aşağıdaki resim TextField nesnesine programlanabilir bir şekilde uygulanan hareket hızını gösterir. Metin sahnenin

üst kısmından ortasına kadar yavaşça hareket eder.

Page 71: Flashplatform optimizing content türkçe

67FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

Metnin hareket hızı

Aşağıdaki kod hareket hızını oluşturur. preloader değişkeni geçerli hedef nesneyi performansı düşüren özellik

aramalarını azaltmak için depolar.

wait_mc.addEventListener( Event.ENTER_FRAME, movePosition ); var destX:Number=stage.stageWidth/2; var destY:Number=stage.stageHeight/2; var preloader:DisplayObject; function movePosition( e:Event ):void {

preloader = e.currentTarget as DisplayObject; preloader.x -= ( preloader.x - destX ) * .1; preloader.y -= ( preloader.y - destY ) * .1; if (Math.abs(preloader.y-destY)<1)

preloader.removeEventListener( Event.ENTER_FRAME, movePosition ); }

Page 72: Flashplatform optimizing content türkçe

68FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

Math.abs() işlevi daha fazla performans iyileştirilmesi almak ve işlev çağrılarının sayısını azaltmak için satır içine

taşınabilir. Sabit noktalı değerlere sahip olmak açısından destX ve destY özellikleri için int türünü kullanmak iyi bir

uygulamadır. Int türünün kullanılması değerleri Math.ceil() veya Math.round() gibi yavaş yöntemler üzerinden el

ile yuvarlamak zorunda kalmadan mükemmel piksel yapışma elde etmenize olanak tanır. Değerlerin sürekli olarak

yuvarlanması nesnenin düzgün hareket etmesini engellediği için bu kod, koordinatları tamsayıya yuvarlamaz. Nesne,

koordinatlar her karedeki en yakın yuvarlanmış tamsayıya yapıştığından aksak hareket edebilir. Ancak bu teknik, bir

görüntü nesnesinin son konumunu ayarlarken kullanışlı olabilir. Aşağıdaki kodu kullanmayın:

// Do not use this code var destX:Number = Math.round ( stage.stageWidth / 2 ); var destY:Number = Math.round ( stage.stageHeight / 2);

Aşağıdaki kod çok daha hızlıdır:

var destX:int = stage.stageWidth / 2; var destY:int = stage.stageHeight / 2;

Önceki kod, değerlerin bölünmesi için bitsel geçiş sağlayan operatörlerin kullanımıyla daha da en iyileştirilebilir.

var destX:int = stage.stageWidth >> 1; var destY:int = stage.stageHeight >> 1;

Bitmap'leri arabelleğe alma özelliği, çalışma zamanının nesneleri dinamik bitmap'ler kullanarak oluşturmasını

kolaylaştırır. Bu örnekte, TextField nesnesini içeren film klibi arabelleğe alınır:

wait_mc.cacheAsBitmap = true;

Performansı iyileştirmenin ek bir yolu alfa şeffaflığını kaldırmaktır. Alfa şeffaflığı, önceki koddaki gibi saydam bitmap

görüntüleri çizerken çalışma zamanının üzerine ek bir yük koyar. Onu devre dışı bırakmak için arka plan olarak bir

renk belirleyerek opaqueBackground özelliğini kullanabilirsiniz.

Bellekte oluşturulan bitmap yüzeyi opaqueBackground özelliğini kullanırken de 32 bit kullanır. Ancak, alfa uzaklık

değeri 255 olarak ayarlanır ve saydamlık kullanılmaz. Sonuç olarak, opaqueBackground özelliği bellek kullanımını

azaltmaz ancak bitmap'leri arabelleğe alma özelliğini kullanırken oluşturma performansını iyileştirir. Aşağıdaki kod

en iyileştirmelerinin tümünü kapsar:

wait_mc.addEventListener( Event.ENTER_FRAME, movePosition ); wait_mc.cacheAsBitmap = true; // Set the background to the color of the scene background wait_mc.opaqueBackground = 0x8AD6FD; var destX:int = stage.stageWidth >> 1; var destY:int = stage.stageHeight >> 1; var preloader:DisplayObject; function movePosition ( e:Event ):void {

preloader = e.currentTarget as DisplayObject; preloader.x -= ( preloader.x - destX ) * .1; preloader.y -= ( preloader.y - destY ) * .1; if ( Math.abs ( preloader.y - destY ) < 1 )

e.currentTarget.removeEventListener ( Event.ENTER_FRAME, movePosition ); }

Animasyon artık en iyileştirilmiştir ve saydamlığın kaldırılmasıyla bitmap'lerin önbelleğe alınması da en

iyileştirilmiştir. Mobil aygıtlarda, bitmap önbelleğe alma özelliğini kullanırken farklı animasyon durumlarında Sahne

Alanı kalitesini LOW ve HIGH olarak değiştirmeyi düşünün:

Page 73: Flashplatform optimizing content türkçe

69FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

wait_mc.addEventListener( Event.ENTER_FRAME, movePosition ); wait_mc.cacheAsBitmap = true; wait_mc.opaqueBackground = 0x8AD6FD; // Switch to low quality stage.quality = StageQuality.LOW; var destX:int = stage.stageWidth>>1; var destY:int = stage.stageHeight>>1; var preloader:DisplayObject; function movePosition( e:Event ):void {

preloader = e.currentTarget as DisplayObject; preloader.x -= ( preloader.x - destX ) * .1; preloader.y -= ( preloader.y - destY ) * .1; if (Math.abs(e.currentTarget.y-destY)<1) {

// Switch back to high quality stage.quality = StageQuality.HIGH; preloader.removeEventListener( Event.ENTER_FRAME, movePosition );

} }

Ancak, bu durumda, Sahne Alanı kalitesinin değiştirilmesi çalışma zamanının geçerli Sahne Alanı kalitesiyle eşleşmesi

için TextField nesnesinin bitmap yüzeyini yeniden oluşturmaya zorlar. Bu sebepten dolayı, bitmap'leri arabelleğe alma

özelliğini kullanırken Sahne Alanı kalitesini değiştirmemek en iyisidir.

Burada bitmap'lerin arabelleğe alınmasının elle yapılması gibi bir yaklaşım denenebilir. opaqueBackground özelliğini

taklit etmek için, film klibi saydam olmayan bir BitmapData nesnesine çizilebilir; bu çalışma zamanını bitmap yüzeyini

yeniden oluşturmaya zorlamaz.

Bu teknik zamanla değişmeyen içerik için kullanışlıdır. Ancak, metin alanının içeriği değişebiliyorsa, farklı bir strateji

kullanmayı deneyin. Örneğin, uygulamanın ne kadarının yüklendiğini temsil eden bir yüzde ile devamlı güncellenen

bir metin alanı düşünün. Metin alanı veya onu içeren görüntüleme nesnesi bir bitmap olarak arabelleğe alınmışsa,

yüzeyi içerik her değiştiğinde yeniden oluşturulmalıdır. Görüntüleme nesnesi içeriği devamlı değiştiği için burada

bitmap'leri el ile önbelleğe alamazsınız. Bu sürekli değişim, sizi BitmapData.draw() yöntemini önbelleğe alınmış

bitmap’i güncellemek için el ile çağırmaya zorlayabilir.

Flash Player 8’den (ve AIR 1.0) itibaren, Sahne Alanı kalitesinin değeri fark etmeksizin, oluşturması Okunabilirlik için

Kenar Yumuşatma’ya ayarlı olan bir metin alanı eksiksiz bir şekilde kenar yumuşatmalı olarak kalır. Bu yaklaşım daha

az bellek tüketir ancak daha fazla CPU işleme gerektirir ve bitmap'leri arabelleğe alma özelliğine kıyasla daha yavaş bir

oluşturma sağlar.

Aşağıdaki kod bu yaklaşımı kullanır:

Page 74: Flashplatform optimizing content türkçe

70FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

wait_mc.addEventListener( Event.ENTER_FRAME, movePosition ); // Switch to low quality stage.quality = StageQuality.LOW; var destX:int = stage.stageWidth >> 1; var destY:int = stage.stageHeight >> 1; var preloader:DisplayObject; function movePosition ( e:Event ):void {

preloader = e.currentTarget as DisplayObject; preloader.x -= ( preloader.x - destX ) * .1; preloader.y -= ( preloader.y - destY ) * .1; if ( Math.abs ( preloader.y - destY ) < 1 ) {

// Switch back to high quality stage.quality = StageQuality.HIGH; preloader.removeEventListener ( Event.ENTER_FRAME, movePosition );

} }

Hareket halinde olan bir metin için bu seçeneği (Okunabilirlik için Kenar Yumuşatma) kullanmanız tavsiye edilmez.

Metin ölçeklendirilirken, bu seçenek metnin hizalı kalmaya çalışmasına sebep olur, bu da bir kayma efekti yaratır.

Ancak, görüntüleme nesnesinin içeriği devamlı değişiyorsa ve ölçeklendirilmiş bir metne ihtiyacınız varsa, kaliteyi LOW

olarak ayarlayarak mobil uygulamalarda performansı artırabilirsiniz. Hareket bittiğinde kaliteyi yeniden HIGH olarak

değiştirin.

GPU

Flash Player uygulamalarında GPU oluşturma

Flash Player 10.1’in önemli yeni bir özelliği de GPU’yu mobil aygıtlarda grafik içeriği oluşturmak için

kullanabilmesidir. Geçmişte grafikler yalnızca işlemci üzerinden oluşturulurdu. GPU'nun kullanılması filtrelerin,

bitmap'lerin, videonun ve metnin oluşturulmasını en iyileştirir. GPU ile oluşturmanın yazılım ile oluşturmak kadar

doğru sonuç vermeyebileceğini unutmayın. Donanım oluşturucusunu kullanırken içerik kesik kesik görünebilir. Buna

ek olarak Flash Player 10.1’de, ekrandaki Pixel Bender efektlerinin oluşturulmasını önleyebilecek bir kısıtlama vardır.

Bu efektler donanım hızlandırma kullanılırken siyah bir kare şeklinde oluşturulabilir.

Flash Player 10 bir GPU hızlandırma özelliğine sahip olsa da, GPU, grafik hesaplamak için kullanılmıyordu. Yalnızca

bütün grafikleri ekrana göndermek için kullanılıyordu. Flash Player 10.1’de GPU, grafikleri hesaplamak için de

kullanılır ve bu da oluşturma hızında çok büyük bir iyileştirme sağlar. Ayrıca işlemci iş yükünü azaltır ve bu durum da

mobil aygıtlar gibi kısıtlı kaynak sahibi aygıtlar için fayda sağlar.

En iyi performans için, mobil aygıtlarda içerik çalıştırılırken GPU modu otomatik olarak ayarlanır. wmode öğesinin

artık gpu değerine ayarlanması gerekmiyorsa, GPU oluşturmasını almak için wmode öğesinin opaque veya

transparent olarak ayarlanması GPU hızlandırmasını devre dışı bırakır.

Not: Masaüstünde Flash Player, yazılım oluşturmayı gerçekleştirmek için işlemciyi kullanır. Sürücüler, masaüstüne göre

büyük çapta farklılık gösterdiği için yazılım oluşturucusu kullanılır ve oluşturma farklarını arttırabilirler. Masaüstü ve

bazı mobil aygıtlar arasında da oluşturma farkları olabilir.

Page 75: Flashplatform optimizing content türkçe

71FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

Mobil AIR uygulamalarında GPU oluşturma

Uygulama tanımlayıcısına <renderMode>gpu</renderMode> ekleyerek AIR uygulamasında donanım grafiği

hızlandırmayı etkinleştirin. Çalışma zamanında oluşturma modlarını değiştiremezsiniz. Masaüstü bilgisayarlarda,

renderMode ayarı yoksayılır; GPU grafik hızlandırma şu anda desteklenmez.

GPU oluşturma modu sınırlamalarıAIR 2.5'te GPU oluşturma modu kullanılırken aşağıdaki sınırlamalar vardır:

• GPU bir nesne oluşturamazsa, görüntülenmez. İşlemci oluşturmaya yönelik bir dezavantaj yoktur.

• Şu karışım modları desteklenmez: katman, alfa, silme, kaplama, sert ışık, açıklaştırma ve koyulaştırma.

• Filtreler desteklenmez.

• PixelBender desteklenmez.

• Birçok GPU birimi, maksimum 1024x1024 doku boyutuna sahiptir. ActionScript'te bu, tüm dönüştürmelerden

sonra bir görüntüleme nesnesinin maksimum son oluşturulmuş boyutuna çevrilir.

• Adobe, video oynatan AIR uygulamalarında GPU oluşturma modunun kullanılmasını önermez.

• GPU oluşturma modunda, sanal klavye açıldığında metin alanları her zaman görünür bir konuma taşınmaz.

Kullanıcı metin girerken metin alanınızın görünür olmasını sağlamak için aşağıdakilerden birini yapın. Ekranın üst

yarısına metin alanını yerleştirin veya odak geldiğinde ekranın üst yarısından metin alanını taşıyın.

• GPU oluşturma modu, modun güvenilir şekilde çalışmadığı bazı aygıtlar için devre dışıdır. En son bilgiler için AIR

geliştiricisinin yayın notlarına bakın.

GPU oluşturma modu en iyi uygulamalarıAşağıdaki yönergeler, GPU oluşturmayı hızlandırabilir:

• Sahne alanında görünen öğelerin sayısını sınırlandırın. Her öğenin görüntülenmesi ve etrafındaki diğer öğelerle

birleştirilmesi biraz zaman alır. Bir görüntüleme nesnesini artık görüntülemek istemediğinizde, visible özelliğini

false olarak ayarlayın. Sahne dışına sürüklemeyin, başka bir nesnenin arkasına gizlemeyin veya alpha özelliğini

0'a ayarlamayın. Görüntüleme nesnesi artık gerekmiyorsa, görüntüleme nesnesini removeChild() öğesiyle sahne

alanından kaldırın.

• Nesneleri oluşturmak ve imha etmek yerine yeniden kullanın.

• Bitmap'leri 2n x 2m bite yakın fakat bundan az olmayacak boyutlarda yapın. Boyutlar 2'nin tam kuvvetleri olmak

zorunda değilse de, daha büyük olmamak koşuluyla 2'nin kuvvetlerine yakın olmalıdır. Örneğin, 31x15 piksellik bir

görüntü 33x17 piksellik bir görüntüden daha hızlı oluşturulur. (31 ve 15, 2'nin kuvvetleri 32 ve 16'dan daha

küçüktür.)

• Mümkünse, Graphic.beginBitmapFill() yöntemini kullanırken repeat parametresini false olarak ayarlayın.

• Fazladan çizim yapmayın. Arka plan olarak arka plan rengini kullanın. Büyük şekilleri birbirinin üstüne

katmanlandırmayın. Çizilen her piksel yük oluşturur.

• Uzun ve ince çivileri, birbirini kesen kenarları veya kenarlarında çok sayıda ince detayı bulunan şekillerden kaçının.

Bu şekillerin görüntülenmesi düz kenarlı ekran nesnelerinden daha uzun sürer.

• Görüntüleme nesnelerinin boyutunu sınırlandırın.

• Grafikleri sık sık güncellenmeyen görüntüleme nesneleri için cacheAsBitMap ve cacheAsBitmapMatrix öğelerini

etkinleştirin.

• Grafik oluşturmak için ActionScript çizim API'sini (Grafik sınıfı) kullanmamaya çalışın. Mümkünse, bu nesneleri

geliştirme zamanında statik olarak oluşturun.

Page 76: Flashplatform optimizing content türkçe

72FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

• Bitmap varlıklarını içe aktarmadan önce son boyutuna ölçeklendirin.

Mobil AIR 2.0.3'te GPU oluşturma moduGPU oluşturma, Packager for iPhone ile oluşturulan mobil AIR uygulamalarında daha kısıtlayıcıdır. GPU yalnızca

cacheAsBitmap özelliği düzgün şekilde ayarlanmış olan bitmap'ler, katı şekiller ve görüntüleme nesneleri için

etkilidir. AyrıcacacheAsBitmap ve cacheAsBitmapMatrix öğeleri ayarlanmış olan nesneler için GPU, döndürülen

veya ölçeklendirilen nesneler oluşturabilir. GPU diğer görüntüleme nesneleri için kademeli kullanılır ve bu genellikle

düşük oluşturma performansıyla sonuçlanır.

GPU ile oluşturma performansını en iyi duruma getirmek için ipuçları

GPU ile oluşturma, SWF içeriğinin performansını büyük ölçüde geliştirse de, içeriğin tasarımı önemli bir role sahiptir.

Geçmişte yazılım ile oluşturmada düzgün bir biçimde çalışan ayarların bazen GPU ile oluşturmada düzgün

çalışmadığını unutmayın. Aşağıdaki ipuçları, yazılım ile oluşturmada performans başarısızlığına maruz kalmadan

GPU ile oluşturmada iyi bir performansa ulaşmanıza yardımcı olabilir.

Not: Donanımla oluşturmayı destekleyen mobil aygıtlar genellikle SWF içeriğine web'den erişir. Bu nedenle, tüm

ekranlarda en iyi deneyimin sağlandığından emin olmak için SWF içeriği oluştururken bu ipuçlarını göz önünde

bulundurmak iyi bir uygulamadır.

• HTML gömme parametrelerinde wmode=transparent veya wmode=opaque kullanmaktan kaçının. Bu modlar

performansın düşmesine neden olabilir. Bunlar ayrıca yazılımla ve donanımla oluşturmada ses-video

senkronizasyonunda küçük bir kayba neden olabilirler. Ayrıca, bu modlar etkin olduğunda birçok platform GPU

ile oluşturmayı desteklemez ve bu performansı önemli derecede düşürür.

• Yalnızca normal ve alfa harmanlama modlarını kullanın. Diğer harmanlama modlarını, özellikle katman

harmanlama modunu kullanmaktan kaçının. Tüm harmanlama modları GPU ile oluşturulduğunda tam olarak

yeniden oluşturulamaz.

• GPU vektör grafikleri oluşturduğunda, bunları çizmeden önce küçük üçgenlerden oluşan ağlara böler. Bu işleme

mozaik oluşturma denir. Mozaik oluşturma işlemi performansın biraz düşmesine neden olur ve bu düşüş şeklin

karmaşıklığı arttıkça fazlalaşır. Performansa olan etkisini azaltmak için GPU ile oluşturmanın her karede mozaik

oluşturduğu biçim şekillerinden kaçının.

• Kendi kendine kesişen eğrilerden, çok ince kavisli alanlardan (ince bir yeni ay gibi) ve bir şeklin kenarlarında

karışık ayrıntılardan kaçının. Bu şekiller, GPU'nun bunları üçgen ağlara mozaik olarak dönüştürmesi için çok

karmaşıktır. Nedenini anlamak için iki vektör düşünün: 500 X 500 kare ve 100 X 10 yeni ay. Bir GPU büyük kareyi

kolaylıkla oluşturabilir çünkü yalnızca iki üçgenden oluşur. Ancak, bir yeni ayın kavisini açıklamak için birçok

üçgen gerekir. Bu nedenle, daha az piksel içerse de bu şekli oluşturmak daha karışık bir işlemdir.

• Ölçekte büyük değişikliklerden kaçının. Bu tür değişiklikler GPU'nun grafikleri tekrar mozaiğe çevirmesine neden

olabilir.

• Mümkün olduğunda fazla çizimden kaçının. Fazla çizim, birbirlerini gizlemelerini sağlamak için birden fazla grafik

öğesini katman olarak kullanmaktır. Yazılımla oluşturma kullanıldığında her piksel yalnızca bir kez çizilir. Bu

nedenle, yazılımla oluşturma için piksel konumunda ne kadar grafik öğenin birbirini kapattığına bakılmaksızın

uygulama, performans düşüklüğüne maruz kalmaz. Aksine, donanım oluşturucu, diğer öğeler o bölgeyi kapatsa da

kapatmasa da her öğe için tüm pikselleri çizer. İki dikdörtgen çakışıyorsa, yazılım oluşturucu bölgeyi yalnızca bir

kere çizerken donanım oluşturucu ise çakışan bölgeyi iki kere çizer.

Bu nedenle, yazılım oluşturucuyu kullanan masaüstünde normal olarak fazla çizimin performans üzerinde

yapacağı etkiyi hissetmezsiniz. Ancak, birçok çakışan şekil, GPU ile oluşturmayı kullanan aygıtlarda performansı

ters bir şekilde etkileyebilir. Nesneleri gizlemek yerine görüntüleme listesinden kaldırmak iyi bir uygulamadır.

Page 77: Flashplatform optimizing content türkçe

73FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

• Arka plan olarak büyük bir doldurulmuş dikdörtgen kullanmaktan kaçının. Bunun yerine Sahne Alanı'nın arka

plan rengini ayarlayın.

• Mümkün olduğunda bitmap yinelemenin varsayılan dolgu modundan kaçının. Daha iyi performans elde etmek

için bunun yerine bitmap kenetleme modunu kullanın.

Eş zamanlı olmayan işlemler

Kullanılabildiğinde, işlemlerin eş zamanlı olanları yerine eş zamanlı olmayan versiyonlarını kullanmayı tercih edin.

Senkronize işlemler, kodunuz tarafından belirtilir belirtilmez çalışır ve kod, devam etmeden önce bu işlemlerin

tamamlanmasını bekler. Sonuç olarak, işlemler kare döngüsünün uygulama kodu aşamasında çalışır. Senkronize

olmayan bir işlem fazla uzun sürerse, kare döngüsünün boyutunu uzatır, böylece potansiyel olarak görüntünün

kilitlenmiş veya kesilmiş gibi görünmesine yol açar.

Kodunuz senkronize olmayan bir işlem çalıştırırken, hemen çalışmayabilir. Geçerli çalıştırma iş parçacığındaki

kodunuz ve diğer uygulama kodları çalıştırılmaya devam eder. Ardından çalışma zamanı, bir yandan oluşturma

sorunlarını önlemeye çalışırken, işlemi mümkün olduğunca çabuk gerçekleştirir. Bazı durumlarda, çalıştırma arka

planda gerçekleşir ve hiç bir şekilde çalışma zamanı kare döngüsünün bir parçası olarak çalışmaz. Son olarak, işlem

bittiğinde çalışma zamanı bir olay gönderir ve kodunuz o olayı daha fazla iş yapmak için dinleyebilir.

Oluşturma sorunlarının önlenmesi için, senkronize olmayan işlemler programlanır ve bölünür. Bundan dolayı,

işlemlerin senkronize olmayan versiyonlarını kullanan ve buna göre yanıt veren bir uygulamaya sahip olmak çok daha

kolaydır. Daha fazla bilgi için bkz. “Algılanan performans ile gerçek performansın karşılaştırılması” sayfa 2.

Ancak, eş zamanlı olarak çalışmayan işlemlerde ek yük vardır. Gerçek yürütme zamanı, eş zamanlı olmayan

işlemlerde, özellikle tamamlanması kısa süren işlemlerde daha uzun olabilir.

Çalışma zamanında, bir çok işlem yapısı gereği senkronizedir veya değildir ve onların çalıştırılma şeklini

belirleyemezsiniz. Ancak, Adobe AIR’de, senkronize olan veya olmayan bir şekilde yapmayı seçebileceğiniz üç işlem

türü vardır.

• File ve FileStream sınıfı işlemleri

File sınıfının bir çok işlemi senkronize olan veya olmayan bir şekilde yapılabilir. Örneğin, bir dosya veya dizinin

kopyalanması veya silinmesi ve bir dizinin içeriğinin listelenmesi gibi işlemlerin senkronize olmayan versiyonları

da vardır. Bu yöntemlerin eş zamanlı olmayan sürümlerinin adında “Async” soneki vardır. Örneğin, bir dosyayı

senkronize olmayan bir şekilde silmek için, File.deleteFile() yöntemi yerine File.deleteFileAsync()

yöntemini çağırın.

Bir dosyadan okumak veya dosyaya yazmak için FileStream nesnesini kullandığınızda, FileStream nesnesini açış

şekliniz işlemlerin senkronize olmayan bir şekilde çalışıp çalışmadığını belirler. Senkronize olmayan işlemler için

FileStream.openAsync() yöntemini kullanın. Veri yazma işlemi senkronize olmayan bir şekilde yapılır. Veri

okuma parçalar halinde yapılır, bu yüzden veri bir seferde bir bölüm olarak mevcut olur. Bunun tersine, senkronize

modda FileStream nesnesi kodun çalışması devam etmeden önce dosyanın tamamını okur.

• Yerel SQL veritabanı işlemleri

Page 78: Flashplatform optimizing content türkçe

74FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

Yerel bir SQL veritabanıyla çalışırken, bir SQLConnection nesnesi üzerinden çalıştırılan tüm işlemler senkronize

olan veya olmayan modda çalışır. İşlemlerin senkronize olmayan şekilde çalışmasını belirlemek için,

SQLConnection.open() yöntemi yerine SQLConnection.openAsync() yöntemini çağırarak veritabanına olan

bağlantıyı açın. Veritabanı işlemleri senkronize olmayan bir şekilde çalıştığında, arka planda çalışır. Veritabanı

motoru asla çalışma zamanı kare döngüsünde çalışmaz, bu nedenle veritabanı işlemlerinin oluşturma sorunlarına

neden olması çok daha düşük bir olasılıktır.

Yerel SQL veritabanıyla performansı iyileştirmeye yönelik ek stratejiler için bkz. “SQL veritabanı performansı”

sayfa 87.

• Ayrı Pixel Bender gölgelendiricileri

ShaderJob sınıfı Pixel Bender gölgelendiricisi üzerinden bir görüntüyü veya veri kümesini çalıştırmanıza ve ortaya

çıkan ham verilere erişmenize olanak tanır. Varsayılan olarak, ShaderJob.start() yöntemini çağırdığınızda,

gölgelendirici senkronize olmayan bir şekilde çalışır. Çalıştırma işlemi arka planda, çalışma zamanı kare

döngüsünü kullanmadan gerçekleşir. ShaderJob nesnesini senkronize bir şekilde çalışmaya zorlamak için

(önerilmez), true değerini start() yönteminin ilk parametresine iletin.

Kodun senkronize olmayan şekilde çalıştırılmasına yönelik bu dahili mekanizmalara ek olarak, kendi kodunuzu

senkronize yerine senkronize olmayan bir biçimde çalışacak şekilde yapılandırabilirsiniz. Uzun çalışabilecek bir görevi

yerine getirecek bir kod yazıyorsanız, kodunuzu parçalar halinde çalışacak şekilde yapılandırabilirsiniz. Kodunuzu

parçalara bölmeniz, çalışma zamanının oluşturma işlemlerini kod çalıştırma bloklarınızın aralarında yapmasını,

böylece oluşturma sorunlarının meydana gelme olasılığının düşmesini sağlayabilir.

Kodunuzu bölmeye yönelik bazı teknikler daha sonraki bölümlerde listelenmiştir. Bu tekniklerin ardında yatan ana

fikir, kodunuzun herhangi bir zamanda işinin yalnızca bir kısmını yapacak şekilde yazılmasıdır. Kodun ne yaptığını

ve nerede çalışmayı kestiğini takip edersiniz. Yapılacak iş kalıp kalmadığını devamlı kontrol etmek için Timer nesnesi

gibi bir mekanizma kullanın ve ek işi, iş tamamlanana kadar parçalar halinde yapın.

Kodu işi bu şekilde bölmek amacıyla yapılandırmak için kurulmuş birkaç yapı vardır. Aşağıdaki makaleler ve kod

kütüphaneleri bu yapıları açıklar ve uygulamalarınıza eklemenize yardımcı olmak için gerekli kodu sağlar.

• Asynchronous ActionScript Execution (ActionScript’in Senkronize Olmayan Şekilde Çalıştırılması) (Trevor

McCauley tarafından bazı uygulama örneklerinin yanı sıra daha fazla arka plan ayrıntısı ile hazırlanmış bir makale)

• Parsing & Rendering Lots of Data in Flash Player (Flash Player’da Bir Çok Verinin Ayrıştırılması & Oluşturulması)

(Jesse Warden tarafından arka plan ayrıntıları ve “oluşturucu deseni” ve “yeşil parçacıklar” adlı iki yaklaşımın

örnekleri ile yazılmış bir makale)

• Green Threads (Yeşil Parçacıklar) (Drew Cummins tarafından yazılmış, örnek kaynak kod ile “yeşil parçacıklar”

tekniğini açıklayan bir makale)

• greenthreads (ActionScript’te “yeşil parçacıklar”ın uygulanması için Charlie Hubbard tarafından hazırlanmış açık

kaynaklı bir kod kütüphanesi. Daha fazla bilgi için bkz. greenthreads Quick Start (yeşil parçacıklar Hızlı

Başlangıç).)

• ActionScript 3'teki İş Parçacıkları: http://www.adobe.com/go/learn_fp_as3_threads_tr (“sahte iş parçacığı

oluşturma” tekniğinin örnek uygulamasını da içeren bir Alex Harui makalesi)

Saydam pencereler

AIR masaüstü uygulamalarında, saydam bir pencere yerine opak ve dikdörtgen bir uygulama penceresi kullanmayı

göz önünde bulundurun.

Page 79: Flashplatform optimizing content türkçe

75FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

AIR masaüstü uygulamasının ilk penceresi için opak bir pencere kullanmak üzere, uygulama açıklayıcı XML

dosyasında aşağıdaki değeri ayarlayın:

<initialWindow> <transparent>false</transparent>

</initialWindow>

Uygulama kodu tarafından oluşturulan pencereler için, transparent özelliği false (varsayılan) olarak ayarlı bir

NativeWindowInitOptions nesnesi oluşturun. Bu öğeyi, NativeWindow nesnesini oluştururken NativeWindow

yapıcısına iletin:

// NativeWindow: flash.display.NativeWindow class

var initOptions:NativeWindowInitOptions = new NativeWindowInitOptions(); initOptions.transparent = false; var win:NativeWindow = new NativeWindow(initOptions);

Bir Flex Window bileşeni için, open() yöntemini çağırmadan önce, bileşenin saydamlık özelliğinin false değerine

(varsayılan) ayarlı olduğundan emin olun.

// Flex window component: spark.components.Window class

var win:Window = new Window(); win.transparent = false; win.open();

Saydam bir pencere kullanıcının masaüstünün bir kısmını veya uygulama penceresinin arkasındaki diğer uygulama

pencerelerini gösterebilecek özelliğe sahiptir. Bu nedenle, çalışma zamanı saydam bir pencereyi oluşturmak için daha

fazla kaynak kullanır. Dikdörtgen olup saydam olmayan bir pencere, işletim sistemi kromu veya özel krom kullanması

fark etmeksizin, aynı oluşturma yüküne sahip olmaz.

Yalnızca dikdörtgen olmayan bir görüntüye sahip olmanızın veya arka plan içeriğinin uygulama pencerenizin içinden

görünür olmasının önemli olması durumunda saydam bir pencere kullanın.

Vektör şekli düzleştirme

Görüntü oluşturma performansını artırmak için şekilleri düzleştirir.

Bitmap'lerin aksine, görüntü oluşturma vektörü içeriği özellikle birçok kontrol noktası içeren degradeler ve karmaşık

yollar için olmak üzere birçok hesaplama gerektirir. Bir tasarımcı veya geliştirici olarak şekillerin yeteri kadar en iyi

hale getirildiğinden emin olun. Aşağıdaki şekilde, birçok kontrol noktasına sahip basitleştirilmemiş yollar

gösterilmektedir:

Page 80: Flashplatform optimizing content türkçe

76FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Performans oluşturma

Son güncelleme 30/3/2011

En iyileştirilmemiş yollar

Flash Professional'daki Düzgünleştirme aracını kullanarak fazladan kontrol noktalarını kaldırabilirsiniz. Buna eşdeğer

bir araç Adobe® Illustrator® uygulamasında da mevcuttur ve toplam nokta ve yol sayısı Belge Bilgisi panelinde

görülebilir.

Düzgünleştirme, fazladan kontrol noktalarını kaldırır, SWF dosyasının son boyutunu azaltır ve görüntü oluşturma

performansını artırır. Sonraki şekil, düzgünleştirme işleminden sonraki aynı yolları göstermektedir:

En iyileştirilmiş yollar

Yolları gereğinden fazla basitleştirmediğiniz sürece, bu en iyileştirme işlemi görsel olarak herhangi bir şeyi

değiştirmez. Ancak, karmaşık yolları basitleştirerek son uygulamanızın ortalama kare hızını büyük ölçüde

artırabilirsiniz.

Page 81: Flashplatform optimizing content türkçe

77

Son güncelleme 30/3/2011

Bölüm 6: Ağ etkileşimini en iyileştirme

Ağ etkileşimi için geliştirmeler

Flash Player 10.1 ve AIR 2.5 tüm platformlarda ağ en iyileştirme için dairesel arabelleğe alma ve akıllı aramanın da

dahil olduğu yeni bir özellikler kümesi sunar.

Dairesel arabelleğe alma

Mobil aygıtlarda medya içeriği yüklerken, bir masaüstü bilgisayardan asla beklemeyeceğiniz sorunlarla

karşılaşabilirsiniz. Örneğin, disk alanı veya belleğiniz dolabilir. Video yüklerken, Flash Player 10.1 ve AIR 2.5'in

masaüstü sürümü FLV dosyasının (veya MP4 dosyasının) tamamını indirir ve önbelleğe alır. Sonra çalışma zamanı,

videoyu o önbellek dosyasından oynatır. Disk alanının dolması olağan değildir. Böyle bir durum gerçekleşirse,

masaüstü çalışma zamanı, videonun oynatılmasını durdurur.

Bir mobil aygıtın disk alanının dolması daha kolaydır. Aygıtın disk alanı dolarsa, çalışma zamanı, masaüstü çalışma

zamanındaki olduğu gibi oynatmayı durdurmaz. Onun yerine çalışma zamanı, önbellek dosyasına dosyanın başından

itibaren yeniden yazarak onu yeniden kullanmaya başlar. Kullanıcı videoyu izlemeye devam edebilir. Kullanıcı

videonun üzerine yazılan kısmında dosyanın başı hariç arama yapamaz. Dairesel arabelleğe alma varsayılan olarak

başlatılmaz. Bu oynatma sırasında ve ayrıca film disk alanından veya RAM'den daha büyükse oynatmanın başından

başlatılabilir. Çalışma zamanının dairesel arabelleğe almayı kullanabilmesi için en az 4 MB RAM veya 20 MB disk

alanına ihtiyacı vardır.

Not: Aygıt yeterli disk alanına sahipse, çalışma zamanının mobil sürümü masaüstü sürümüyle aynı davranışı sergiler.

Şunu aklınızda tutun ki, cihaz bir diske sahip değilse veya disk doluysa RAM'deki arabellek bir geri dönüş olarak

kullanılır. Derleme zamanında arabellek dosyasının ve RAM arabelleğinin boyutu için bir kısıtlama ayarlanabilir. Bazı

MP4 dosyaları oynatmanın başlatılmasından önce dosyanın tümünün indirilmesini gerektiren bir yapıya sahiptir.

Çalışma zamanı bu dosyaları algılar, yeterli disk alanı yoksa indirmeyi önler ve MP4 dosyası oynatılamaz. O dosyaların

indirilmesini istememek en iyisi olabilir.

Bir geliştirici olarak, aramanın yalnızca önbelleğe alınmış akışın sınırları dahilinde çalıştığını aklınızda tutun. Bazen

uzaklık aralığın dışında olduğunda NetStream.seek() başarısız olur ve bu durumda

NetStream.Seek.InvalidTime olayı gönderilir.

Akıllı arama

Not: Akıllı arama özelliği Adobe® Flash® Media Server 3.5.3 gerektirir.

Flash Player 10.1 ve AIR 2.5, kullanıcının duraksız video oynatılırken yaşadığı deneyimi iyileştirilen akıllı arama adlı

yeni bir davranış sunar. Kullanıcı arabellek sınırları dahilinde bir hedefi ararsa, çalışma zamanı anında aramayı

sağlamak için arabelleği yeniden kullanır. Çalışma zamanının önceki sürümlerinde, arabellek yeniden

kullanılmıyordu. Örneğin, kullanıcı bir akış sunucusu üzerinden video oynatıyorsa, arabellek süresi 20 saniyeye

ayarlıysa (NetStream.bufferTime ve kullanıcı 10 saniye ileriyi aratmayı denediyse, çalışma zamanı zaten yüklü olan

10 saniyeyi yeniden kullanmak yerine arabellek verisinin tamamını atmıyordu. Bu davranış çalışma zamanını

sunucudan çok daha sıkça yeni veri istemeye zorluyordu ve yavaş bağlantılarda zayıf oynatma performansına sebep

oluyordu.

Aşağıdaki şekilde, çalışma zamanının eski sürümünde ara belleğin nasıl davrandığı gösterilmektedir. bufferTime

özelliği önceden yüklenecek saniye sayısını belirler, böylece bağlantı kesilirse arabellek, video durdurulmadan

kullanılabilir.

Page 82: Flashplatform optimizing content türkçe

78FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Ağ etkileşimini en iyileştirme

Son güncelleme 30/3/2011

Akıllı arama özelliğinden önce arabellek davranışı

Akıllı arama özelliğiyle çalışma zamanı şimdi kullanıcı videoyu temizlerken anında geri veya ileri arama sağlamak için

arabelleği kullanır. Aşağıdaki şekilde yeni davranış gösterilmektedir:

Akıllı arama özelliği ile ileri arama

Akıllı arama özelliği ile geri arama

Akıllı arama, kullanıcı ileri veya geri arama yaptığında arabelleği yeniden kullanır, böylece oynatma deneyimi daha

hızlı ve düzgün olur. Bu yeni davranışın faydalarından biri video yayıncıları için bant genişliği tasarrufudur. Ancak

arama arabellek sınırlarının dışındaysa, standart davranış gerçekleşir ve çalışma zamanı sunucudan yeni veri ister.

Not: Bu davranış aşamalı video indirmeye uygulanmaz.

Akıllı aramayı kullanmak için, NetStream.inBufferSeek öğesini true değerine ayarlayın.

Harici içerik

Uygulamanızı birden fazla SWF dosyasına bölün.

Mobil cihazların ağa sınırlı erişimi olabilir. İçeriğinizi hızlı yüklemek için, uygulamanızı birden fazla SWF dosyasına

bölün. Uygulamanın tamamında kod mantığını ve varlıkları yeniden kullanmaya çalışın. Örneğin, aşağıdaki şemada

gösterildiği gibi, birden fazla SWF dosyasına bölünmüş bir uygulama düşünün.

Arabellek

Oynatma kafası

Arabellek

Oynatma kafası

Arabellek

Oynatma kafası

Page 83: Flashplatform optimizing content türkçe

79FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Ağ etkileşimini en iyileştirme

Son güncelleme 30/3/2011

Birden çok SWF dosyasına bölünen uygulama

Bu örnekte, her SWF dosyası aynı bitmap için kendi kopyasını içerir. Aşağıdaki şemanın gösterdiği gibi, bu çoğaltılma

bir çalışma zamanı paylaşımlı kütüphane kullanılarak önlenebilir.

Çalışma zamanı paylaşılan kütüphane kullanma

Bu teknik kullanılarak, bitmap’in diğer SWF dosyaları tarafından kullanılabilir hale getirilmesi için bir çalışma zamanı

paylaşımlı kütüphane yüklenir. ApplicationDomain sınıfı yüklenen tüm sınıf tanımlarını saklar ve onları

getDefinition() yöntemi üzerinden çalışma zamanında kullanılabilir hale getirir.

Ayrıca, bir çalışma zamanı paylaşımlı kütüphane kod mantığının tamamını içerebilir. Uygulamanın tamamı yeniden

derlenmeden çalışma zamanında güncellenebilir. Aşağıdaki kod bir çalışma zamanı paylaşımlı kütüphane yükler ve

çalışma zamanında SWF dosyasına dahil edilen tanımı çıkarır. Bu teknik fontlar, bitmap'ler, sesler veya herhangi bir

ActionScript sınıfıyla kullanılabilir.

portfolio.swf

10 KB 10 KB

infos.swf

10 KB

main.swf

Toplam boyut 40 KB

preload.swf

10 KB

contact.swf

portfolio.swf infos.swf

main.swf

Toplam boyut 10KB

preload.swf

10KB

library.swf

contact.swf

Page 84: Flashplatform optimizing content türkçe

80FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Ağ etkileşimini en iyileştirme

Son güncelleme 30/3/2011

// Create a Loader object var loader:Loader = new Loader(); // Listen to the Event.COMPLETE event loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadingComplete ); // Load the SWF file loader.load(new URLRequest("library.swf") ); var classDefinition:String = "Logo"; function loadingComplete(e:Event ):void {

var objectLoaderInfo:LoaderInfo = LoaderInfo ( e.target ); // Get a reference to the loaded SWF file application domain var appDomain:ApplicationDomain = objectLoaderInfo.applicationDomain;

// Check whether the definition is available if ( appDomain.hasDefinition(classDefinition) ) {

// Extract definition var importLogo:Class = Class ( appDomain.getDefinition(classDefinition) );

// Instantiate logo var instanceLogo:BitmapData = new importLogo(0,0);

// Add it to the display list addChild ( new Bitmap ( instanceLogo ) );

} else trace ("The class definition " + classDefinition + " is not available."); }

Tanımın alınması yüklenen SWF dosyasının uygulama etki alanına sınıf tanımlarının yüklenmesiyle daha kolay hale

getirilebilir.

Page 85: Flashplatform optimizing content türkçe

81FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Ağ etkileşimini en iyileştirme

Son güncelleme 30/3/2011

// Create a Loader object var loader:Loader = new Loader(); // Listen to the Event.COMPLETE event loader.contentLoaderInfo.addEventListener ( Event.COMPLETE, loadingComplete ); // Load the SWF file loader.load ( new URLRequest ("rsl.swf"), new LoaderContext ( false, ApplicationDomain.currentDomain) ); var classDefinition:String = "Logo"; function loadingComplete ( e:Event ):void {

var objectLoaderInfo:LoaderInfo = LoaderInfo ( e.target ); // Get a reference to the current SWF file application domain var appDomain:ApplicationDomain = ApplicationDomain.currentDomain;

// Check whether the definition is available if (appDomain.hasDefinition( classDefinition ) ) {

// Extract definition var importLogo:Class = Class ( appDomain.getDefinition(classDefinition) );

// Instantiate it var instanceLogo:BitmapData = new importLogo(0,0);

// Add it to the display list addChild ( new Bitmap ( instanceLogo ) );

} else trace ("The class definition " + classDefinition + " is not available."); }

Yüklü SWF dosyasında mevcut olan sınıflar artık geçerli uygulama etki alanındaki getDefinition() yöntemi

çağrılarak kullanılabilir. Ayrıca, sınıflara getDefinitionByName() yöntemini çağırarak da erişebilirsiniz. Bu teknik

fontları ve büyük varlıkları yalnızca bir kere yükleyerek bant genişliğinden tasarruf sağlar. Varlıklar hiçbir zaman diğer

SWF dosyalarına dışa aktarılmaz. Tek kısıtlama uygulamanın test edilmesinin ve loader.swf dosyası üzerinden

çalıştırılmasının gerekliliğidir. Bu dosya önce varlıkları yükler, sonra da uygulamayı oluşturan farklı SWF dosyalarını

yükler.

Girdi çıktı hataları

G/Ç hataları için olay işleyicileri ve hata mesajları sağlayın.

Bir mobil cihazda, ağ yüksek hızlı İnternete bağlı bir masaüstü bilgisayarına kıyasla daha az güvenilir olabilir. Mobil

cihazlarda harici içeriğe erişmenin iki sınırlaması vardır: kullanılabilirlik ve hız. Bundan dolayı, varlıkların hafif

olmasını sağlayın ve kullanıcıya geri bildirim sağlamak için her IO_ERROR olayı için işleyiciler ekleyin.

Örneğin, bir kullanıcının mobil aygıtında web sitenizi taradığını ve iki metro istasyonu arasında aniden ağ

bağlantısının kesildiğini hayal edin. Bağlantı koptuğunda dinamik bir varlık yükleniyordu. Masaüstünde, bir çalışma

zamanı hatasının ortaya çıkmasını önlemek için böyle bir şey neredeyse hiçbir zaman gerçekleşmeyeceğinden boş bir

olay dinleyicisi kullanabilirsiniz. Ancak, mobil cihazda durumu basit bir boş dinleyiciden daha fazlası ile işlemeniz

gerekir.

Page 86: Flashplatform optimizing content türkçe

82FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Ağ etkileşimini en iyileştirme

Son güncelleme 30/3/2011

Aşağıdaki kod bir IO hatasına yanıt vermez. Onu burada gösterildiği gibi kullanmayın:

var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener( Event.COMPLETE, onComplete ); addChild( loader ); loader.load( new URLRequest ("asset.swf" ) ); function onComplete( e:Event ):void {

var loader:Loader = e.currentTarget.loader; loader.x = ( stage.stageWidth - e.currentTarget.width ) >> 1; loader.y = ( stage.stageHeight - e.currentTarget.height ) >> 1;

}

Böyle bir hatayı işlemek ve kullanıcı için hata mesajı sağlamak daha iyi bir alışkanlıktır. Aşağıdaki örnek bunu düzgün

bir şekilde işler:

var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener ( Event.COMPLETE, onComplete ); loader.contentLoaderInfo.addEventListener ( IOErrorEvent.IO_ERROR, onIOError ); addChild ( loader ); loader.load ( new URLRequest ("asset.swf" ) ); function onComplete ( e:Event ):void { var loader:Loader = e.currentTarget.loader; loader.x = ( stage.stageWidth - e.currentTarget.width ) >> 1; loader.y = ( stage.stageHeight - e.currentTarget.height ) >> 1; } function onIOError ( e:IOErrorEvent ):void { // Show a message explaining the situation and try to reload the asset. // If it fails again, ask the user to retry when the connection will be restored }

Kullanıcını içeriği yeniden yüklemesi için bir yol sunmak iyi bir uygulamadır. Bu davranış onIOError() işleyicisinde

uygulanabilir.

Flash Remoting

En iyileştirilmiş istemci sunucu arası veri iletişiminde Flash Remoting ve AMF kullanın.

SWF dosyalarına uzaktan içerik yüklemek için XML kullanabilirsiniz. Ancak XML, çalışma zamanının yüklediği ve

ayrıştırdığı düz metindir. XML en çok sınırlı bir içerik miktarı yükleyen uygulamalarda işe yarar. Yüksek miktarda

içerik yükleyen bir uygulama geliştiriyorsanız, Flash Remoting teknolojisi ve Action Message Format (AMF)

kullanmayı deneyin.

Page 87: Flashplatform optimizing content türkçe

83FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Ağ etkileşimini en iyileştirme

Son güncelleme 30/3/2011

AMF, sunucu ve çalışma zamanı arasında verileri paylaşmaya yarayan ikili bir formattır. AMF kullanımı verinin

boyutunu düşürürken iletim hızını iyileştirir. AMF, çalışma zamanının yerel biçimi olduğundan çalışma zamanına

AMF verilerinin gönderilmesi, istemci tarafında yoğun bellek gerektiren serileştirme ve serileştirmeyi geri alma

işlemlerinden kaçınmanızı sağlar. Uzaktan çağırma ağ geçidi bu görevleri işler. Bir ActionScript veri türünü sunucuya

gönderirken, uzaktan çağırma ağ geçidi, serileştirmeyi sunucu tarafında sizin yerinize işler. Ağ geçidi ayrıca karşılık

gelen veri türünü de size gönderir. Bu veri türü çalışma zamanından çağrılabilecek bir yöntemler kümesini açık

bırakan sunucuda oluşturulan bir sınıftır. Flash Remoting ağ geçitleri; ZendAMF, FluorineFX, WebORB ve Adobe’nin

resmi bir açık kaynak Java Flash Remoting ağ geçidi olan BlazeDS’i içerir.

Aşağıdaki resimde Flash Remoting kavramı gösterilmektedir:

Flash Remoting

Aşağıdaki örnekte bir Flash Remoting ağ geçidine bağlanmak için NetConnection sınıfı kullanılmaktadır:

// Create the NetConnection object var connection:NetConnection = new NetConnection (); // Connect to a Flash Remoting gateway connection.connect ("http://www.yourserver.com/remotingservice/gateway.php"); // Asynchronous handlers for incoming data and errors function success ( incomingData:* ):void {

trace( incomingData ); } function error ( error:* ):void {

trace( "Error occured" ); } // Create an object that handles the mapping to success and error handlers var serverResult:Responder = new Responder (success, error); // Call the remote method connection.call ("org.yourserver.HelloWorld.sayHello", serverResult, "Hello there ?");

Bir uzaktan çağırma ağ geçidine bağlanmak kolaydır. Ancak, Flash Remoting'i kullanmak Adobe® Flex® SDK'ye dahil

edilen RemoteObject sınıfının kullanımıyla daha da basit bir hale getirilebilir.

Not: Flex çerçevesindekiler gibi harici SWC dosyaları bir Adobe® Flash® Professional projesinin içinde kullanılabilir.

SWC dosyalarının kullanımı Flex SDK'nin geri kalanını kullanmadan RemoteObject sınıfını ve ona bağlı olan öğeleri

kullanmanıza olanak verir. Gelişmiş geliştiriciler gerektiğinde doğrudan ham Socket sınıfı üzerinden de bir uzaktan

çağırma ağ geçidi ile iletişim kurabilir.

HTTP

ZendAMF

Web ORB

RubyAMF

FluorineFX

BlazeDS

Hizmet(PHP Sınıfı,Java, C# ...)

AMF

Page 88: Flashplatform optimizing content türkçe

84FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Ağ etkileşimini en iyileştirme

Son güncelleme 30/3/2011

Gereksiz ağ işlemleri

Varlıkları yükledikten sonra, onları her ihtiyaç duyduğunuzda ağdan yüklemek yerine yerel olarak önbelleğe alın.

Uygulamanız medya veya veri gibi varlıklar yüklerse, varlıkları yerel aygıta kaydederek önbelleğe alın. Seyrek değişen

varlıklar için, önbelleği belirli aralıklarla güncellemeyi göz önünde bulundurun. Örneğin, uygulamanız bir görüntü

dosyasının yeni bir versiyonu olup olmadığını günde bir defa kontrol edebilir veya iki saatte bir yeni veri olup

olmadığını kontrol edebilir.

Varlıkları tür ve yapılarına bağlı olarak çeşitli yollardan önbelleğe alabilirsiniz.

• Görüntüler ve video gibi medya varlıkları: Dosyaları File ve FileStream sınıflarını kullanarak dosya sistemine

kaydedin

• Bağımsız veri değerleri veya küçük veri kümeleri: değerleri SharedObject sınıfını kullanarak yerel paylaşılan

nesneler olarak kaydedin

• Daha büyük veri kümeleri: verileri yerel bir veritabanına kaydedin veya serileştirip bir dosyaya kaydedin

Veri değerlerinin önbelleğe alınması için, açık kaynaklı AS3CoreLib projesi adresinde yükleme ve önbelleğe almayı

sizin için yapan bir ResourceCache sınıfı mevcuttur.

Page 89: Flashplatform optimizing content türkçe

85

Son güncelleme 30/3/2011

Bölüm 7: Medya ile çalışma

Video

Mobil cihazlarda video performansını en iyileştirme hakkında bilgi için Adobe Developer Connection (Adobe

Geliştirici Bağlantısı) web sitesinde Mobil aygıta teslim için web içeriğini en iyileştirme bölümüne bakın.

Özellikle şu bölümlere bakın:

• Mobil aygıtlarda video oynatma

• Kod örnekleri

Bu bölümler mobil aygıtlara yönelik video oynatıcıları geliştirmek için aşağıdakiler gibi bilgileri içerir:

• Video kodlama yönergeleri

• En iyi uygulamalar

• Video oynatıcının performans profili nasıl çıkarılır?

• Referans video oynatıcısı uygulaması

StageVideo

Video oluşturmak üzere donanım hızlandırma avantajından yararlanmak için StageVideo sınıfını kullanın.

StageVideo nesnesinin kullanımıyla ilgili bilgi için ActionScript 3.0 Geliştirici Kılavuzu içinde Donanım hızlandırmalı

oluşturma için StageVideo sınıfını kullanma bölümüne bakın.

Ses

Flash Player 9.0.115.0 ve AIR 1.0'dan itibaren çalışma zamanı, AAC dosyalarını (AAC Ana, AAC LC ve SBR)

oynatabilir. Mp3 dosyaları yerine AAC dosyaları kullanılarak basit bir en iyileştirme yapılabilir. AAC formatı, eşit bit

hızında mp3 formatından daha yüksek kalite ve daha küçük dosya boyutu sunar. Dosya boyutunu küçültmek bant

genişliğini korur; bu da yüksek hızlı İnternet bağlantısı sağlayamayan mobil aygıtlarda önemli bir etmendir.

Donanım Ses Kod Çözme

Video kodu çözülmesine benzer olarak ses kodu çözülmesi de yüksek işlemci döngüleri gerektirir ve aygıttaki uygun

donanıma güç aktararak en iyileştirilebilir. Flash Player 10.1 ve AIR 2.5, AAC dosyalarının (LC, HE/SBR profilleri)

veya mp3 dosyalarının (PCM desteklenmez) kodları çözülürken performansı artırmak için donanım ses sürücülerini

algılayıp kullanabilir. İşlemci kullanımı büyük ölçüde azaltılır ve bu da daha az pil kullanımı ve işlemcinin diğer

işlemler için kullanılabilmesini sağlar.

Not: ACC biçimini kullanırken, ACC Ana profili çoğu aygıtta donanım desteğinin olmaması nedeniyle desteklenmez.

Page 90: Flashplatform optimizing content türkçe

86FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Medya ile çalışma

Son güncelleme 30/3/2011

Donanımda ses kodu çözme işlevi kullanıcı ve geliştirici açısından saydamdır. Çalışma zamanı ses akışı oynatmaya

başladığında, videoda yaptığı gibi, ilk olarak donanımı denetler. Bir donanım sürücüsü mevcutsa ve ses formatı

destekleniyorsa, donanım ses kodu çözme işlevi çalışır. Ancak gelen ACC veya mp3 akışının kod çözümü donanım

üzerinden işlenebilse bile bazen donanım tüm efektleri işleyemez. Örneğin donanımın kısıtlamalarına bağlı olarak

bazen donanım ses karışımını ve yeniden örneklemeyi işlemez.

Page 91: Flashplatform optimizing content türkçe

87

Son güncelleme 30/3/2011

Bölüm 8: SQL veritabanı performansı

Veritabanı performansı için uygulama tasarımı

Bir SQLStatement nesnesini çalıştırdıktan sonra onun text özelliğini değiştirmeyin. Bunun yerine, her SQL ifadesi

için bir SQLStatement örneği ve farklı değerler sağlamak için ifade parametreleri kullanın.

Bir SQL ifadesi yürütülmeden önce, çalışma zamanı ifadenin yürütülmesi için dahili olarak gerçekleştirilecek adımları

belirlemek üzere ifadeyi hazırlar (derler). Daha önce yürütülmemiş olan bir SQLStatement örneğinde

SQLStatement.execute() yöntemini çağırdığınızda, ifade yürütülmeden önce otomatik olarak hazırlanır. Daha

sonraki execute() yöntemi çağrılarında, SQLStatement.text özelliği değişmediği sürece, ifade hala hazır

durumdadır. Sonuç olarak, ifade daha hızlı yürütülür.

İfadelerin yürütülmesi arasındaki değerler değişiyorsa, ifadeleri yeniden kullanmaktan en iyi şekilde fayda sağlamak

üzere ifadenizi özelleştirmek için ifade parametrelerini kullanın. (İfade parametreleri, SQLStatement.parameters

ilişkilendirici dizi özelliği kullanılarak belirtilir.) SQLStatement örneğinin text özelliğinin aksine, ifade

parametrelerinin değerlerini değiştirdiğinizde, çalışma zamanının ifadeyi yeniden hazırlaması gerekmez.

Bir SQLStatement örneğini bir kez hazırlandıktan sonra yeniden kullandığınızda, uygulamanız bu SQLStatement

örneğine giden bir başvuruyu saklamalıdır. Örneğe giden bir başvuruyu tutmak için, değişkeni işlem kapsamlı değil,

sınıf kapsamlı bir değişken olarak belirtin. SQLStatement öğesini sınıf kapsamlı bir değişken haline getirmenin iyi bir

yolu, uygulamanızı SQL ifadesinin tek bir sınıfta sarılacağı biçimde yapılandırmaktır. Bileşim halinde yürütülen bir

ifade grubu da tek bir sınıfta sarılabilir. (Bu teknik Komut tasarım yapısını kullanma olarak da bilinir.) Örnekler bu

sınıfın üye değişkenleri olarak tanımlandığında, sarma sınıfı örneği uygulamada bulunduğu sürece, bu örnekler de

kalıcı olur. Minimum düzeyde, örneğin bellekte kalması için işlevin dışında yer alan bir SQLStatement örneği içeren

bir değişken tanımlayabilirsiniz. Örneğin, SQLStatement örneğini ActionScript sınıfında yer alan bir üye değişkeni

veya bir JavaScript dosyasında yer alan, işlev olmayan bir değişken olarak belirleyin. Daha sonra, sorguyu gerçekten

yürütmek istediğinizde ifadenin parametre değerlerini ayarlayabilir ve execute() yöntemini çağırabilirsiniz.

Veri karşılaştırma ve sıralama için çalıştırma hızını artırmak amacıyla veritabanı dizinlerini kullanın.

Bir sütun için dizin oluşturduğunuzda, veritabanı o sütunun verilerinin bir kopyasını saklar. Kopya sayısal veya

alfabetik sırada saklanır. Bu sıralama, veri tabanının değerleri hızla eşleştirmesine (örneğin eşitlik operatörünü

kullanırken) ve ortaya çıkan verileri ORDER BY deyimini kullanarak sıralamasına olanak tanır.

Veritabanı dizinleri sürekli olarak güncel tutulur ve bu o tablodaki veri değiştirme işlemlerinin (EKLE veya

GÜNCELLE) biraz daha yavaş olmasına neden olur. Ancak, veri alma hızında önemli ölçüde artış olabilir. Bu

performans dengelemesinden dolayı, her tablonun her sütununu dizinlemeyin. Bunun yerine, dizinlerinizi

tanımlamak için bir strateji kullanın. Dizinleme stratejinizi planlamak için aşağıdaki kılavuzları kullanın:

• WHERE veya ORDER BY deyimlerinde tabloları birleştirmek için kullanılan dizin sütunları

• Sütunlar sıkça birlikte kullanılıyorsa, onları tek bir dizinde olacak şekilde birlikte dizinleyin

• Alfabetik olarak sıralanmış biçimde aldığınız ve metin verileri içeren bir sütunda, dizin için COLLATE NOCASE

karşılaştırmasını belirtin

Uygulamanın boşta kaldığı zamanlarda SQL ifadelerini önceden derlemeyi göz önünde bulundurun.

Page 92: Flashplatform optimizing content türkçe

88FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

SQL veritabanı performansı

Son güncelleme 30/3/2011

Bir SQL ifadesi ilk defa çalıştığında, SQL metni, veritabanı motoru tarafından hazırlandığı (derlendiği) için daha yavaş

olur. Bir ifadenin hazırlanması ve yürütülmesi çaba gerektiren bir işlem olduğundan, bu işleme yönelik bir strateji

başlangıç verilerini önceden yüklemek ve daha sonra diğer ifadeleri arka planda yürütmektir:

1 Önce uygulamanın gerektirdiği verileri yükleyin..

2 Uygulamanızın ilk başlangıç işlemleri tamamlandığında veya uygulamadaki başka bir “boş” zamanda diğer

ifadeleri yürütün.

Örneğin, uygulamanızın birinci ekranını görüntülemek için veritabanına hiç erişmediğini varsayın. Bu durumda,

veritabanı bağlantısının açılmasından önce ekranın görüntülenmesini bekleyin. Son olarak, SQLStatement örneklerini

oluşturun ve çalıştırabildiklerinizi çalıştırın.

Alternatif olarak, uygulamanızın başlar başlamaz belirli bir sorgunun sonucu gibi bazı verileri görüntülediğini

varsayın. Bu durumda, devam edin ve bu sorguya ilişkin SQLStatement örneğini yürütün. Başlangıç verileri

yüklendikten ve görüntülendikten sonra, diğer veritabanı işlemleri için SQLStatement örneklerini oluşturun ve

mümkünse diğer gerekli ifadeleri daha sonra yürütün.

Pratikte, SQLStatement örneklerini yeniden kullanıyorsanız, ifadenin hazırlanması için gereken ek süre yalnızca tek

seferlik bir süreçtir. Büyük olasılıkla, bunun genel performans üzerinde büyük bir etkisi olmaz.

Çoklu SQL veri değişimi işlemlerini bir işlemin içinde gruplayın.

Veri ekleme ve değiştirmeyi içeren çok sayıda SQL ifadesi yürüttüğünüzü varsayın (INSERT veya UPDATE ifadeleri).

Tüm ifadeleri açık bir işlem içinde yürüterek performansta önemli bir artış sağlayabilirsiniz. Açık olarak bir işlem

başlatmazsanız, ifadelerden her biri kendisine ait otomatik olarak oluşturulmuş işlemlerde çalışır. Her işlemin (her

ifadenin) yürütülmesi tamamlandığında, çalışma zamanı elde edilen verileri diskteki veritabanı dosyasına yazar.

Diğer taraftan, açık olarak bir işlem oluşturur ve ifadeleri bu işlem bağlamında yürütürseniz ne olacağını düşünün.

Çalışma zamanı bellekteki tüm değişiklikleri yapar, daha sonra işlem gerçekleştiğinde tüm değişiklikleri bir defada

veritabanı dosyasına yazar. Verilerin diske yazılması genellikle işlemin en zaman yoğunluklu bölümüdür. Sonuç

olarak, her SQL ifadesi için bir kez diske yazmak yerine bir defada yazmak, performansı önemli ölçüde artırabilir.

Büyük SELECT sorgu sonuçlarını SQLStatement sınıfının execute() (prefetch parametresi ile) ve next()

yöntemlerini kullanarak parçalar halinde işleyin..

Büyük bir sonuç kümesi alan bir SWL ifadesi çalıştırdığınızı varsayın. Ardından, uygulama her veri satırını bir döngü

halinde işler. Örneğin, verileri biçimlendirir veya ondan nesneler oluşturur. Verilerin işlenmesi uzun zaman alabilir

ve bu kilitlenen veya yanıt vermeyen bir ekran gibi oluşturma sorunlarına neden olabilir. “Eş zamanlı olmayan

işlemler” sayfa 73 bölümünde açıklandığı gibi, işi parçalara bölmek de bir çözümdür. SQL veritabanı API’si, veri işleme

sürecini bölmeyi kolaylaştırır.

SQLStatement sınıfının execute() yönteminde isteğe bağlı bir prefetch parametresi vardır (ilk parametre). Bir

değer sağlarsanız, bu değer veritabanının çalıştırma tamamlandığı zaman döndürdüğü sonuç satırlarının maksimum

sayısını belirtir.

dbStatement.addEventListener(SQLEvent.RESULT, resultHandler); dbStatement.execute(100); // 100 rows maximum returned in the first set

Sonuç verinin birinci kümesi döndürüldüğünde, ifadeyi çalıştırmaya devam etmek ve başka bir sonuç satırlar kümesi

almak için next() yöntemini çağırabilirsiniz. execute() yöntemi gibi, next() yöntemi de döndürülecek maksimum

satır sayısı belirten prefetch parametresini kabul eder:

Page 93: Flashplatform optimizing content türkçe

89FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

SQL veritabanı performansı

Son güncelleme 30/3/2011

// This method is called when the execute() or next() method completes function resultHandler(event:SQLEvent):void {

var result:SQLResult = dbStatement.getResult(); if (result != null) {

var numRows:int = result.data.length; for (var i:int = 0; i < numRows; i++) {

// Process the result data } if (!result.complete) {

dbStatement.next(100); }

} }

Verilerin tamamı yüklenene kadar next() yöntemini çağırmaya devam edebilirsiniz. Önceki listede gösterildiği gibi,

verilerin tamamının ne zaman yüklendiğini anlayabilirsiniz. execute() veya next() yöntemlerinin her bitişinde

oluşturulan SQLResult nesnesinin complete özelliğini kontrol edin.

Not: Sonuç verilerini işleme sürecini bölmek için prefetch parametresini ve next() yöntemini kullanın. Bir sorgunun

sonuçlarını, sonuç kümesinin bir bölümüne sınırlandırmak için bu parametreyi kullanmayın. Bir ifadenin sonuç

kümesinden yalnızca sütunların bir alt kümesini almak istiyorsanız SELECT deyiminin LIMIT ifadesini kullanın. Sonuç

büyükse, yine de sonuçların işlenme sürecini bölmek için prefetch parametresini ve next() yöntemini

kullanabilirsiniz.

Çoklu ifadeleri eşzamanlı olarak çalıştırmak için senkronize olmayan çoklu SQLConnection nesnelerini tek bir veri

tabanıyla kullanmayı deneyin.

Bir SQLConnection nesnesi openAsync() yöntemini kullanarak bir veritabanına bağlandığında, ana çalışma zamanı

çalıştırma parçacığı yerine arka planda çalışır. Ek olarak, her SQLConnection kendi arka plan iş parçacığında çalışır.

Çoklu SQLConnection nesnelerini kullanarak çoklu SQL ifadelerini eşzamanlı olarak etkili bir biçimde

çalıştırabilirsiniz.

Bu yaklaşımın aynı zamanda olası dezavantajları da vardır. En önemlisi, her ek SQLStatement nesnesi ek bellek

gerektirir. Ek olarak, eşzamanlı çalıştırmalar da özellikle tek bir CPU veya CPU çekirdeği olan makinelerde işlemcinin

daha çok çalışmasına neden olur. Bu sıkıntılardan dolayı, bu yaklaşım mobil aygıtlarda kullanım için tavsiye edilmez.

Başka bir sıkıntı ise, SQLStatement nesnelerinin yeniden kullanımından sağlanabilecek faydanın bir SQLStatement

nesnesinin tek bir SQLConnection nesnesine bağlı olmasından dolayı kaybolabilmesidir. Bu yüzden, SQLStatement

nesnesi, ilişkili SQLConnection nesnesinin zaten kullanımda olması durumunda yeniden kullanılamaz.

Tek bir veritabanına bağlı çoklu SQLConnection nesneleri kullanmak istiyorsanız, her birinin ifadelerini kendi

işleminde çalıştırdığını aklınızda tutun. Bu ayrı işlemleri, ekleme, değiştirme veya veri silme gibi verileri değiştiren

herhangi bir kodda hesaba kattığınızdan emin olun.

Paul Robertson çoklu SQLConnection nesneleri kullanmanın olası dezavantajlarını minimuma indirirken faydalarını

birleştirmenize yardımcı olacak açık kaynaklı bir kod kütüphanesi oluşturdu. Kütüphane SQLConnection

nesnelerinden oluşan bir havuz kullanır ve ilişkili SQLStatement nesnelerini yönetir. Böylece, SQLStatement

nesnelerinin yeniden kullanılmasını ve çoklu ifadeleri eşzamanlı olarak çalıştırmak için çoklu SQLConnection

nesnelerinin mevcut olmasını sağlar. Daha fazla bilgi ve kütüphaneyi indirmek için bkz.

http://probertson.com/projects/air-sqlite/.

Page 94: Flashplatform optimizing content türkçe

90FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

SQL veritabanı performansı

Son güncelleme 30/3/2011

Veritabanı dosyası en iyileştirmesi

Veritabanında şema değişikliklerinden kaçının.

Veritabanı tablolarına veri ekledikten sonra mümkünse veritabanı şemasını (tablo yapısını) değiştirmekten kaçının.

Bir veritabanı dosyası, normalde dosya başlangıcında bulunan tablo tanımlarıyla yapılandırılır. Bir veritabanına

bağlantı açtığınızda, çalışma zamanı bu tanımları yükler. Veritabanı tablolarına veri eklediğinizde, bu veriler dosyaya

tablo tanım verilerinin ardından eklenir. Ancak, şema değişiklikleri yaparsanız, yeni tablo tanımı verisi, veritabanı

dosyasındaki tablo verisiyle birleştirilir. Örneğin, bir tabloya sütun eklemek veya yeni bir tablo eklemek veri türlerinin

karışmasına neden olabilir. Tablo tanımı verileri veritabanı dosyasının başında konumlandırılmazsa, veritabanına bir

bağlantı açmak daha uzun sürer. Çalışma zamanının dosyanın farklı bölümlerinden tablo tanımı verilerini okuması

daha uzun sürdüğünden, bağlantının açılması da yavaştır.

Bir veri tabanını şema değiştikten sonra en iyileştirmek için SQLConnection.compact() yöntemini kullanın.

Şema değişiklikleri yapmanız gerekiyorsa, değişiklikleri tamamladıktan sonra SQLConnection.compact() yöntemini

çağırabilirsiniz. Bu işlem veritabanı dosyasını tablo tanım bilgilerinin bütün olarak dosyanın başlangıcında yer alacağı

biçimde yeniden yapılandırır. Ancak, compact() işlemi, veritabanı büyüdükçe daha çok zaman alabilir.

Gereksiz veritabanı çalışma zamanı işleme

SQL ifadenizde tamamen uygun bir tablo adı (veritabanı adını da dahil ederek) kullanın.

Her zaman her tablo adının yanı sıra bir ifadedeki veritabanı adını da açıkça belirtin. (Ana veritabanıysa “ana”

sözcüğünü kullanın.) Örneğin, aşağıdaki kod main olarak belirtilmiş açık bir veritabanı adı içerir:

SELECT employeeId FROM main.employees

Veritabanı adının açıkça belirtilmesi, çalışma zamanının eşleşen tabloyu bulmak için bağlı olan her veritabanını

kontrol etmesini önler. Ayrıca çalışma zamanının yanlış veritabanını seçme olasılığını da engeller. Bir SQLConnection

yalnızca tek bir veritabanına bağlandığında bile bu kuralı izleyin. SQLConnection arka planda, SQL ifadeleri

aracılığıyla erişilebilen geçici bir veritabanına daha bağlıdır.

SQL INSERT ve SELECT ifadelerinde açık sütun adları kullanın.

Aşağıdaki örnekler açık sütun adlarının kullanımını gösterir:

INSERT INTO main.employees (firstName, lastName, salary) VALUES ("Bob", "Jones", 2000)

SELECT employeeId, lastName, firstName, salary FROM main.employees

Önceki örnekleri aşağıdakilerle karşılaştırın. Bu kod stilinden kaçının:

Page 95: Flashplatform optimizing content türkçe

91FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

SQL veritabanı performansı

Son güncelleme 30/3/2011

-- bad because column names aren't specified INSERT INTO main.employees VALUES ("Bob", "Jones", 2000)

-- bad because it uses a wildcard SELECT * FROM main.employees

Sütun adlarının açıkça belirtilmemesi durumunda, çalışma zamanının sütun adlarını çözmek için ek iş yapması

gerekir. Bir SELECT ifadesi açık sütunlar yerine joker kullanıyorsa, çalışma zamanının ekstra veri almasına neden olur.

Bu ek veriler ek işleme gerektirir ve gerekmeyen ek nesne örnekleri oluşturur.

Bir ifadede tabloyu kendisiyle karşılaştırmadığınız sürece aynı tabloyu birden fazla defa birleştirmekten kaçının.

SQL ifadeleri büyüdükçe, farkında olmadan bir veritabanı tablosunu sorguya birden çok defa katabilirsiniz. Genellikle,

aynı sonuç tabloyu yalnızca bir kere kullanarak da elde edilebilir. Bir sorguda bir veya daha fazla görünüm

kullanıyorsanız, aynı tabloya bir kereden fazla katmanız mümkündür. Örneğin, sorguya bir tablo ve aynı zamanda o

tablodan veri içeren bir görünüm katıyor olabilirsiniz. İki işlem bir katılma işleminden fazlasına neden olabilir.

Etkili SQL sözdizimi

WHERE deyimindeki bir alt sorgu yerine bir sorguya tablo eklemek için JOIN (FROM deyimindeki) öğesini kullanın. Bu

ipucu, yalnızca filtreleme için bir sonuç kümesi yerine bir tablonun verilerine ihtiyacınız olsa da geçerlidir.

FROM deyiminde birden fazla tabloyu birleştirmek WHERE deyimindeki bir alt sorguyu kullanmaktan daha iyi

performans sağlar.

Dizinlerden faydalanmayan SQL ifadelerini kullanmayın. Bu ifadeler bir alt sorguda toplama işlevlerinin

kullanımını, alt sorguda UNION ifadesini veya UNION ifadesine sahip ORDER BY deyimini bulundurur.

Bir dizinin kullanımı, SELECT sorgusunun işlenme hızını büyük oranda artırabilir. Ancak, belirli SQL sözdizimleri

veritabanının dizin kullanmasını önler ve onu arama ve sıralama işlemleri için asıl veriyi kullanmaya zorlar.

Özellikle LIKE('%XXXX%') öğesindeki gibi bir satır aralığı joker karakteriyle LIKE operatörünü kullanmaktan

kaçınmayı unutmayın.

LIKE işlemi joker aramalarının kullanımını desteklediğinden, tam eşleşme karşılaştırmalarını kullanmaktan daha

yavaş performans sağlar. Özellikle, arama dizesine bir joker karakterle başlarsanız, veritabanı aramada dizinleri

kullanamaz. Bunun yerine, veritabanı tablonun her satırındaki metni aramalıdır.

IN operatörünü kullanmaktan kaçının. Olası değerler önceden biliniyorsa, IN işlemi daha hızlı çalıştırma için AND

veya OR öğeleri kullanılarak yazılabilir.

Aşağıdaki iki ifadenin saniyesi daha hızlı çalışır. IN() veya NOT IN() ifadelerinin kullanımı yerine basit eşitlik

ifadelerini OR ile birlikte kullandığı için daha hızlıdır:

Page 96: Flashplatform optimizing content türkçe

92FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

SQL veritabanı performansı

Son güncelleme 30/3/2011

-- Slower SELECT lastName, firstName, salary FROM main.employees WHERE salary IN (2000, 2500)

-- Faster SELECT lastName, firstName, salary FROM main.employees WHERE salary = 2000

OR salary = 2500

Performansı iyileştirmek için, bir SQL ifadesinin alternatif formlarını deneyin.

Önceki örneklerle gösterildiği gibi, bir SQL ifadesinin yazılış biçimi veritabanı performansını da etkileyebilir. Belirli

bir sonuç kümesi elde etmek amacıyla bir SQL SELECT ifadesi yazmanın genellikle birden çok yolu vardır. Bazı

durumlarda, bir yaklaşım diğerinden fark edilir ölçüde daha hızlı çalışır. Önceki önerilere ek olarak, farklı SQL

ifadeleri ve onların performansıyla ilgili daha fazla bilgiyi SQL diliyle ilgili kaynaklardan edinebilirsiniz.

SQL ifadesinin performansı

Alternatif SQL ifadelerini hangisinin daha hızlı olduğunu belirlemek için doğrudan karşılaştırın.

Bir SQL ifadesinin çeşitli versiyonlarının performansını karşılaştırmanın en iyi yolu onları doğrudan veritabanınız ve

veriler ile test etmektir.

Aşağıdaki geliştirme araçları SQL ifadelerini çalıştırırken çalıştırma zamanları sağlar. Bunları ifadelerin alternatif

versiyonlarının hızını karşılaştırmak için kullanın:

• Run! (Paul Robertson tarafından hazırlanan AIR SQL sorgu yazma ve test etme aracı)

• Lita (David Deraedt tarafından hazırlanan SQLite Yönetim Aracı)

Page 97: Flashplatform optimizing content türkçe

93

Son güncelleme 30/3/2011

Bölüm 9: Kıyaslama ve konuşlandırma

Kıyaslama

Uygulamaları karşılaştırmak için bir çok araç bulunmaktadır. Flash topluluğu üyeleri tarafından geliştirilen Stats sınıfı

ve PerformanceTest sınıfını kullanabilirsiniz. Ayrıca Adobe® Flash® Builder™ uygulamasındaki profil oluşturucuyu ve

FlexPMD aracını kullanabilirsiniz.

Stats sınıfı

Çalışma zamanının yayınlama sürümünü kullanarak kodunuzun çalışma zamanında profilini oluşturmak için harici

bir araç kullanmadan Stats sınıfını kullanabilirsiniz. Stats sınıfı Flash topluluğundan mr. Doob tarafından

geliştirilmiştir. Stats sınıfını şu adresten indirebilirsiniz: https://github.com/mrdoob/Hi-ReS-Stats.

Stats sınıfı aşağıdaki öğeleri izlemenizi sağlar:

• Saniyede oluşturulan kareler (sayı ne kadar büyükse o kadar iyidir).

• Bir kareyi oluşturmak için kullanılan milisaniyeler (sayı ne kadar küçükse o kadar iyidir).

• Kodun kullanmakta olduğu bellek miktarı. Her karede artıyorsa uygulamanızda bellek sızıntısı olabilir. Olası bellek

sızıntısını araştırmanız önemlidir.

• Uygulamanın kullandığı maksimum bellek miktarı.

İndirildiğinde Stats sınıfı aşağıdaki sıkışık kodla beraber kullanılabilir:

import net.hires.debug.*; addChild( new Stats() );

Adobe® Flash® Professional veya Flash Builder’daki koşullu derlemeyi kullanarak Stats nesnesini etkinleştirebilirsiniz:

CONFIG::DEBUG {

import net.hires.debug.*; addChild( new Stats() );

}

DEBUG sabitinin değerini değiştirerek Stats nesnesinin derlemesini etkinleştirebilir veya devre dışı bırakabilirsiniz.

Aynı yaklaşım uygulamanızda derlenmemesini istediğiniz herhangi bir kodu değiştirmek için kullanılabilir.

PerformanceTest sınıfı

ActionScript kod yürütme işleminin profilini oluşturmak için Grank Skinner birim testi iş akışı ile tümleştirilebilen

bir araç geliştirdi. PerformanceTest sınıfına özel bir sınıf iletirsiniz, o da kodunuzda bir dizi test uygular.

PerformanceTest sınıfı farklı yaklaşımları kolayca karşılaştırmanıza olanak tanır. PerformanceTest sınıfı şu adresten

indirilebilir: http://www.gskinner.com/blog/archives/2009/04/as3_performance.html.

Flash Builder profil oluşturucu

Flash Builder kodunuzu yüksek ayrıntı düzeyiyle karşılaştırmanızı sağlayan bir profil oluşturucuyla birlikte gelir.

Not: Profil oluşturucuya erişmek için Flash Player’ın hata ayıklama sürümünü kullanın. Aksi halde, hata mesajıyla

karşılaşırsınız.

Page 98: Flashplatform optimizing content türkçe

94FLASH PLATFORM IÇIN PERFORMANSI EN İYILEŞTIRME

Kıyaslama ve konuşlandırma

Son güncelleme 30/3/2011

Profil oluşturucu, ayrıca Adobe Flash Professional’da üretilen içerikle birlikte kullanılabilir. Bunu yapmak için

derlenmiş SWF dosyasını ActionScript’ten veya Flex projesinden Flash Builder’a yükleyin ve profil oluşturucuyu bu

programda çalıştırın. Profil oluşturucu hakkında daha fazla bilgi için Flash Builder 4'ü Kullanma bölümüne “Flex

uygulamalarının profilini oluşturma” başlıklı makaleye bakın.

FlexPMD

Adobe Teknik Servisi, ActionScript 3.0 kodunun kalitesini denetleyen FlexPMD adında bir araç üretti. FlexPMD,

JavaPMD’ye benzeyen bir ActionScript aracıdır. FlexPMD bir ActionScript 3.0 veya Flex kaynak dizinini denetleyerek

kod kalitesini iyileştirir. Kullanılmayan kodlar, fazla uzun kod veya Flex bileşeni yaşam ömrünün yanlış kullanımı gibi

zayıf kodlama işlemlerini algılar.

FlexPMD, şu adreste bulunan bir Adobe açık kaynaklı projesidir:

http://opensource.adobe.com/wiki/display/flexpmd/FlexPMD. Şu adreste bir Eclipse eklentisi de mevcuttur:

http://opensource.adobe.com/wiki/display/flexpmd/FlexPMD+Eclipse+plugin.

FlexPMD kod denetimini kolaylaştırır ve kodunuzun temiz ve en iyileştirilmiş olmasını sağlar. FlexPMD’nin gerçek

gücü genişletilebilirliğinde yatar. Geliştirici olarak herhangi bir kodu denetlemek için kendi kural kümelerinizi

oluşturabilirsiniz. Örneğin filtrelerin fazla kullanılması veya bunun gibi yakalamak istediğiniz başka zayıf kodlama

işlemlerini algılayan bir kural kümesi yaratabilirsiniz.

Dağıtma

Flash Builder’da uygulamanızın son sürümünü dışa aktarırken yayınlama sürümünü dışa aktardığınızdan emin olun.

Yayınlama sürümünün dışa aktarılması SWF dosyasının içerisindeki hata ayıklama bilgilerini kaldırır. Hata ayıklama

bilgilerinin kaldırılması SWF dosyasını küçültür ve uygulamanın daha hızlı çalışmasını sağlar.

Projenizin yayınlama sürümünü dışa aktarmak için Flash Builder’daki Proje panelini ve Sürüm Yapısını Dışa Aktar

seçeneğini kullanın.

Not: Projenizi Flash Professional’da derlerken sürüm ve hata ayıklama sürümleri arasında seçme seçeneğiniz yoktur.

Derlenmiş SWF dosyası varsayılan olarak yayınlama sürümdür.