19 Haziran 2012 Salı

Css Sprite tekniği ile Web projelerinde performans artışı sağlama.

Css Sprite tekniği ile Web projelerinde performans artışı sağlama.


Web  projelerin'de  HTTP  istek sayısını  azaltarak  performans artışı sağlamak için uygulanacak yöntemlerden biride CSS Sprite tekniğidir.
Bir web sayfası tasarladığınızı düşünelim ve bu sayfada'ki bir çok alanda ufaklı büyüklü resim ler gösterdiğinizi düşenelim. Böyle bir durumda her bir resim'i bu objelere tek tek linklemeniz gerekecektir.Kullanıcılarınızda bu sayfayı görüntülemek istediğinde sayfanızda ki her resim için sunucuya tek tek istek gönderilecektir. Sayfanızdaki istek sayısı ne kadar fazla olursa sayfanız normalden daha yavaş ve daha geç yüklenecektir.

Bu durumun önüne geçip ,sayfanızın daha hızlı yüklenmesini istiyorsanız sunucudaki istek sayısını azaltmanız gerekmektedir.



 CSS Sprite tekniğide sunucuya giden istek sayısını azaltmak için tasarlanan bir yöntemdir.Neyse konuyu fazla dağıtmadan örneğimiz üzerinden ilerleyelim.Sayfadaki parça parça olan resimlerin tek bir resimde birleştirildiğini düşünürsek.Sunucuya giden istek sayısı otomatikmen sayfadaki resim sayısı kadar azalacaktır.Bunun bize ne kadar bir etksi , faydası olur diye düşünmek gerekirse kullanıcı sayısı az olan sistemlerde kullanılması durumunda gözle görülebilecek bir performans artışı sağlamayacaktır fakat kulanıcı sayısı onbinler , yüzbinler veya daha fazla aktif kullanıcısı bulunan sistemlerde gerçekten çok büyük bir performans artışı sağlayacaktır.

 CSS Sprite kullanan firmaların başında Facebook , Google , Amazon gibi büyük ve çok kullanıcılı şirketler yer almaktadır.
 Peki tek bir resmi sayfamdaki resim gösterilen objelere nasıl dağıtıcam ?
 Bunun için sayfadaki resim gösterilen objelere tek bir resim üzerinden koordinat vererek bu işlemi gerçekleştirebiliriz.



Yandaki resimdeki ikonlar muhtemelen hepinize tanıdık gelecektir.Bunlar facebook'a her girdiğimizde gördüğümüz facebook ikonları.Facebook gibi milyonlarca kullanıcısı olan bir sistem için bu yöntem çok büyük bir performans artışı sağlayacaktır.

Şimdi yandaki resmi kullanarak kendimiz için ufak bir uygulama yapalım.Yandaki resimde bulunanan simgeleri ekrana atacağımız 5 farklı "div" elementi üzerinde pozisyon bilgisi vererek yan yana gösterelim.Bunun ince resimdeki pozisyonları ,resimlerin width , height bilgilerini ayarlayan CSS Class lar yazalım

Aşağıdaki koordinat bilgileri hesaplanırken eğer gösterilmek istenen resim resim bütünün 25 piksel solunda ve 19 piksel aşağısında ise CSS cssSpriteStyleImage2 class ında gösterildiği gibi ayarlanır.


    <style type="text/css">
        #tableCssSprite div
        {
            background-image: url('../Images/image.jpg');
            width: 25px;
            height: 20px;
        }
        .cssSpriteStyleImage1    /*1. Resim Koodinat vb Bilgileri*/
        {
            background-position: 25px 0px;
        }
       
        .cssSpriteStyleImage2   /*2. Resim Koordinat vb Bilgileri*/
        {
            background-position: 25px -19px;
        }
       
        .cssSpriteStyleImage3   /*3. Resim Koordinat vb Bilgileri*/
        {
            background-position: 25px -35px;
        }
       
        .cssSpriteStyleImage4   /*4. Resim Koordinat vb Bilgileri*/
        {
            background-position: 25px -51px;
        }
        .cssSpriteStyleImage5   /*5. Resim Koordinat vb Bilgileri*/
        {
            background-position: 25px -69px;
        }
    </style>


Web tasarımımızıda aşağıda gösterildiği gibi ayarlarsak yan yana 5 tane div ve her bir div'de büyük resimde gösterilen ufak resimler görülecektir.


    <html>
    <head>
        <title></title>
    </head>
    <body>
        <table id="tableCssSprite">
            <tr>
                <td>
                    <div id="dvImage1" class="cssSpriteStyleImage1">
                    </div>
                </td>
                <td>
                    <div id="dvImage2" class="cssSpriteStyleImage2">
                    </div>
                </td>
                <td>
                    <div id="dvImage3" class="cssSpriteStyleImage3">
                    </div>
                </td>
                <td>
                    <div id="dvImage4" class="cssSpriteStyleImage4">
                    </div>
                </td>
                <td>
                    <div id="dvImage5" class="cssSpriteStyleImage5">
                    </div>
                </td>
            </tr>
        </table>
    </body>
    </html>


Uygulama Ekran Çıktısı aşağıdaki gibi olacaktır.




















Eğer her bir resim için tek tek yol verecek olsaydık bu her bir resim için sunucuya iste gönderilecekti.Ancak bir resim üzerinden koordinat yöntemiyle birden fazla resme yol verdiğimiz için, sunucuya sadece tek bir istek gidecektir.Sunucuya giden her istek sunucun cevap süresinin uzamasına dolayısıyla kullanıcının beklemesine sebep olacaktır.Koordinat yöntemiyle sunucuya giden istek sayısını azaltarak en kolay performans artışını sağlayabiliriz.


HTML
Diğer
Yahoo!
%10
%90
Google
%25
%75
MySpace
%9
%91
MSN
%5
%95
eBay
%5
%95
Amazon
%38
%62
Youtube
%9
%91
CNN
%15
%85
Yahoo! User Interface Blog sitesinin, "Performance Research, Part 1: What the 80/20 Rule Tells Us about Reducing HTTP Requests" adlı makalesinden alıntıdır. Not : Yukarıdaki değerler, cache varsayılmadan ve ortalama 2.5 Mbps internet bağlantı hızının test sonuçlarıdır

Yukarıdaki tablo popüler bir kaç web sitesinin sayfaları oluştururken harcadıkları zamanı gösteriyor.HTML belgesinin indirilme süresi %5 ile %38 arasında zaman alırken diğer parçaları(resimler, script ve style dosyaları) yüklemek %62 ile %95 arasında zaman alıyor.Yani HTTP istek sayısını azaltarak,gözle görülür seviyede performans artışı sağlayabiliriz.
(İstatistiki bilgiler kullanıcının tarayıcı modeli ve gönderilen isteğin tipine göre değişebilir.)

Not : Bu yöntemin en sıkıntılı yanlarından birisi büyük resimdeki koordinat bilgilerini doğru hesaplayabilmekte resimlerin koordinatlarını hesaplarken sağda solda yer alan piksel'leri de hesaba katmayı unutmamak lazım.

Bunun için yardımcı bir bilgi verelim.
CSS Sprite işlemi için özel olarak tasarlanmış Web Siteleri mevcut bu siteler aracılığıyla yüklediğiniz resim içerisindeki ufak resimlerin koordinatları , genişlik yükseklik değerlerini alabilirsiniz.(Google'da CSS Sprite Generator tarzında bir anahtar kelimeyle bu sitelere rahatlıkla ulaşabilirsiniz.)

Hiç yorum yok:

Yorum Gönder