30 Mart 2015 Pazartesi

Bilgisayar Grafikleri ve Rendering

İlk bilgisayarlardan günümüze şüphesiz gözle görülebilen en büyük değişim bilgisayar grafiklerinde yaşanmıştır. Görüntülerin, ilk yıllarda sadece hesap yapma ve veri yönetimi gibi görevler için geliştirilen basit metin tabanlı grafiklerden zamanla göz dolduran ve çoğu zaman gerçekle ayırt edilemeyen 3 boyutlu grafiklere evrilmesi benim gibi çoğu kişinin de merakını cezbetmiş bir süreçtir. Bu sürecin arkasında her yıl giderek artan bilgisayar hızları ve işlemci kabiliyetleri yanında görüntü motorlarının beyni olan matematik modellerinin de büyük payı vardır. Gerçekçi, kaliteli ve ayrıntılı görüntülerin hızlı bir şekilde üretilmesi (bilgisayar oyunları, animasyonlar ve görsel efektler) için bu modellere ait denklemlerin hızlı bir şekilde çözülmesi ve uygun verilerle işlenmesi gerekir. Sanıldığının aksine bir tek görüntü için bile birçok hesap (ışık kaynağına göre parlaklık, gölgeleme, yansıma, iz düşüm vs) yapılır ki bu da birçok görüntünün iç içe girdiği ve anlık üretilmesi gereken uygulamalarda çok yüksek bir işlem gücüne ihtiyaç olduğunun kanıtıdır.



Peki nedir bu grafik işlemleri ? Tabi ki hepsinden bahsetmek imkansız (eğer ilginiz varsa "Bilgisayar Grafikleri" ile ilgili dersler almanızı veya "Fundamentals of Computer Graphics - P. Shirley, S. Marschner" kitabını okumanızı tavsiye ederim), bu yüzden bu yazıda sadece rendering'den bahsedeceğim.

Rendering, bilgisayar litaretüründe 3D bir modelin 2D görüntüsünün (resminin) elde edilmesine denir. 3D bir modeli niye 2D'ye çeviriyoruz diyebilirsiniz, dikkat edin 3D bir görüntüyü değil bir modeli görüntüye çeviriyoruz. Bunu bir ressamın veya sanatçının gördüğü bir nesneyi tuvaline resmetmesi gibi düşünebilirsiniz. Nesneler 3 boyutludurlar ama görüntüleri her zaman (hologramlar istisna) 2 boyutlu düzlemlerde veya yüzeylerde görüntülenir. Aynı şey bilgisayarlarda da gerçekleşir. Nesneler 3 boyutlu uzayda matematik vektörleri ve yüzeyleri ile ifade edilerek modellenir. Pekala bu nesnenin herhangi bir gözlem noktasından bakıldığında gözde oluşacak 2 boyutlu görüntüsü nasıl oluşur ? İşte rendering böyle bir soruya cevap veren bilgisayar algoritmasıdır.



Eğer rendering'i bir fonksiyon gibi düşünürsek belki de şu şekilde tasvir edebiliriz;

"Uzaydaki herhangi bir nokta ve o noktadan çıkan bir yön vektörünü, bir görüntü matrisine (resim) götüren işleme denir."

Bu tanım benim tamamen kendi kafamda basitleştirdiğim bir anlama karşılık gelir. Gerçekte böyle bir işlem için yukarıda da bahsettiğim gibi ışık, yansıma, konum, hareket gibi bir çok parametrenin de dahil olduğu daha karmaşık fonksiyonlarla icra edilir.



Uzayda kırmızı renkli bir küp düşünün. Tabi bu küpü görebilmek için ise bir ışık kaynağı hayal edin, bu kaynağı dilediğiniz yere yerleştirebilirsiniz. Bu küpü zihniniz hemen iki boyutlu bir görüntüye çevirecektir. Çünkü tüm yönlerini bir anda görmeniz imkansızdır. Şimdi küpe farklı açılardan, yerlerden ve uzaklıklardan bakın. Her hareketinizde görüntünün değiştiğini görürsünüz. Bazı yerlerde tek kenarını, bazen iki, bezense üç kenarını birden göreceksiniz. Yine bulunduğunuz yere ve küpün ışık kaynağına göre konumundan dolayı farklı kenarlar farklı derecelerde gölgeli görünecektir. Ayrıca radyal hareketlerde görüntünün boyutu sabit kalırken küpten uzaklaşırken veya ona yaklaşırken yapacağınız doğrusal hareketler gözünüzde oluşan küpün boyutunu da değiştirecektir. Şimdi aynı uzaya bir de küre ekleyelim. Kürenin kendine has geometrisi, yüzeyi, ışık tepkisi gibi bir çok farklı parametresinden dolayı tüm bu hareketlerde farklı görüntüler elde edeceksiniz. Mesela kenarları olmadığı için uzaydan hep daire şeklinde görülecek veya ışığa maruz kaldığında bir yarı küresi karanlıkta kalacaktır. İşin zor tarafı ise bundan sonra başlayacaktır. Uzaya koyduğunuz her nesne diğer tüm nesnelerin görüntülerini etkileyecek, bazen yansımalarla bir ışık kaynağı gibi davranırken bazen de ışığı önleyen bir engel görevi görecektir. Ayrıca bu nesnelerin olası hareketleri de yine tüm değer kümesinin elemanlarını değiştirecek, görüntülerin tekrar hesaplanıp üretilmesine neden olacaktır. Zihninizin anlık yaptığı tüm bu işlemleri bilgisayarlara yaptırmak ise azim, tecrübe, akıl ve kurursuz bir mühendislik gerektirir.



Gördüğünüz gibi sadece iki nesneli ve bir ışık kaynağı olan uzay modelinin farklı noktalardan 2 boyutlu resmedilmesinin altında bile çok ince, hassas ve ileri seviyede hesaplama ve işlem gücü yatar. Bu durum bilgisayar oyunları gibi (ki bu oyunlarda değişen, hareket eden, ortaya çıkan/kaybolan binlerce nesne vardır), bu türden işlemlerin her saniye başına 30-40 (fps) kere yapılması gereken uygulamalarda özelleşmiş grafik işlemcilerin (ekran kartları) kullanılmasını gerektirmiştir. Böylece tüm bu işlemler merkezi işlem birimini meşgul etmeden, bu iş için özel tasarlanıp üretilmiş, çok çekirdekli matematik işlemcilerinde paralel bir biçimde icra edilirler.



Rendering, 3 boyutlu modellemelerin kullanıldığı hemen hemen her program tarafından yapılan bir işlemdir. Bilgisayar oyunları ve bilgisayar destekli çizim programları, özel film efektleri, animasyon filmler ve daha nice uygulamarlarda tasarlanan her 3D model ekrana bir takım rendering işlemlerinden geçirilerek (bkz:perspektif) 2 boyutlu olarak yansıtılır. Yani her zaman dediğim gibi işin mutfağında büyük bir emek vardır.

Bu konuda araştırma yaparsanız özellikle animasyon şirketlerinin, oyun ve film üreticilerinin oldukça keyif alarak izleyebileceğiniz videolarına rastlayabilirsiniz. Çoğu film için "sahne arkası" çekimleri, oyun motoru tasarımları, animasyon hazırlama kursları ilginizi çekebilir. Ayrıca bu iş için matematik bilginizi de canlı tutmanız ve doğrusal cebir ve analitik geometri gibi konulardan da keyif almanız gerekebilir.




Eğer programlama kısmına kendinizi yakın hissediyorsanız, OpenGL öğrenmeniz ve kendi 2 boyutlu oyunlarınızı kodlamanız oldukça eğleneceğiniz ve tecrübe kazanacağınız aktiviteler olacaktır.

Aşağıda fikir edinmek ve motivasyon kazanmak için izleyebileceğiniz videoları paylaşıyorum.

Hepinize iyi eğlenceler ve iyi çalışmalar.

@Emin_Ucer












22 Mart 2015 Pazar

Bilgisayar Ağlarında Latency Nedir ?

Latency, bilgisayar ağlarında bir mesajın bir bağlantı üzerinden iletilmesinde oluşan toplam gecikme anlamına gelir. Siz tarayıcınızda bir linke dokunduğunuzda yada tıkladığınızda bir takım veri transferi gerçekleşir. Sonuçta verilerin bir noktadan diğerine fiziksel olarak gitmesi ve geri gelmesi gerekir. Bu geliş ve gidişler belli süreler içerisinde olurlar ve buda anlık cevaplar yerine gecikmeli cevaplar demektir. Verinin iletimini tamamlayıp istenildiği yere ulaşma süresi internet bağlantınızın hızını belirleyen önemli bir değişkendir. Bir internet sayfasının yüklenme süresinin bir kaç saniye alması çok büyük bir sorun olmazken online bir oyundaki bir kaç yüz mili saniyelik bir gecikme keyfinizi kaçırabilir. Peki bu gecikmeye neden olan şey nedir ? Nasıl tanımlanır ve hesaplanır ? 


 Latency'i belirleyen iki temel gecikme vardır. Bunlar;

1) İletim Gecikmesi (Transmisson Delay)
2) Yayılma Gecikmesi (Propagation Delay)

İletim gecikmesi M bitlik verinin iletim kanalına konulmasında geçen süredir. 

T = M (bits) / R (bits / saniye)

bu denklemde R veri transfer (data rate) hızını temsil eder ve iletimin bant genişliğini gösterir. Basitçe 1 Mbps'lık bir bağlantı 56 kbps'lık bir bağlantıdan aynı miktar veri için çok daha az bir gecikme oluşturacaktır.

Yayılma gecikmesi ise iletim kanalındaki verilerin hedef noktasına ulaşması için geçen süredir. Aradaki mesafenin, elektromanyetik dalganın hızına bölünmesiyle bulunur.

D = Uzunluk (m) / sinyalin kanaldaki hızı (m/saniye)

bu gecikme iletim ortamının fiziksel özelliklerince belirlenir. Örneğin kablosuz yada fiber optik bir iletimde, iletim hızı ışık hızındayken kablolu bir bağlantıda bu hız ışık hızının yarısı kadardır. Böyle olunca kablosuz ve fiber optik iletimlerde gecikme daha az gerçekleşir. Yalnız özellikle kablosuz iletimde hata olasılığı oldukça yüksek olduğunda hata algılama ve düzeltme işlemleride gecikmelere neden olacaktır.

Bu iki gecikme toplam Latency'i verecektir.

L = T + D



Örnek olarak bir dial-up bağlantıyı düşünelim. Bu tür bir bağlantının veri hızı R = 56 kbps'dır. Eğer M=1250 Byte'lık bir mesajı yayılma gecikmesi D=5 ms olan bir kanal üzerinden yollarsak;

L = 5 ms + 1250 x 8 bits / 56 x 1000 bits / saniye
L = 5 ms + 179 ms = 184 ms

184 ms'lik bir gecikme sonunda hedefine ulaşacaktır. 

Görüldüğü gibi gecikmenin önemli bir kısmı iletim gecikmesinden kaynaklanmaktadır. Bunu azaltmak için iletim hızı yüksek bir bağlantı deneyelim.

Örneğin bu kez geniş bant bir bağlantı düşünün. Veri hızı R = 10 Mbps olan bu bağlantının yayılma süresi ise D = 50 ms olsun. Yine aynı mesajı (M=1250 Byte) göndönderdiğimizi varsayarsak;

L = 50 ms + 1250 x 8 bits / 10 x 10e6
L = 50 ms + 1 ms = 51 ms

51 ms'lik bir gecikme ile iletim gerçekleşecektir.

Bu kez de gecikmenin büyük bir kısmı yayılma gecikmesinden kaynaklanmıştır.

Sonuç olarak gecikmenin başlıca nedenleri uzun bağlantılar ve düşük veri hızı olarak söylenebilir.

Bunlarla birlikte kullanılan diğer bir kavram da Bant Genişliği - Gecikme çarpımıdır. Bu kavram iletim hattının depoladığı yada taşıdığı veri miktarını gösterir.

BD = R x D

olarak hesaplanır. R yine veri hızını (data rate), D ise yayılma gecikmesini temsil eder.

Örnek olarak, R = 40 Mbps ve D = 50 ms olduğu bir iletimin taşıma kapasitesi;

BD = (40x10e6 Bits /saniye) x (50x10e-3 /saniye) =  250 KByte'tır. 

Yani bu kanal, iletim yaparken içerisinden 250 KB'lik bir veriyi fiziksel olarak tıpkı bir depolama aygıtı gibi saklayabilmektedir.

Latency'nin, internet bağlantınızın hızını nasıl etkilediğini öğrenmiş oldunuz :)

Hepinize İyi Çalışmalar

@Emin_Ucer