Plazma sayı 1, sayfa 22

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 22

Şimdi izleyeceğimiz yöntem şu şekilde: Bizim bir timeline'imiz var di mi ? Yani sıfırıncı ms'de başlayıp öyle giden...

0-------------25------------50-----------75---------100----------125----------- 1.frame 2.frame 3.frame 4.frame 5.frame ....

Hah aynen böyle.. Programımız başlar (demo!) Ve biz normal bir şekilde yapıyor olsaydık, timer'dan her 25 ms'de bir 'update' event'i yaratıp ekranımızı update ediyor olurduk. Yani.. 0.cı ms'deyiz. Hesaplayacaklarımızı hesaplıyoruz, o sırada tabii ki time akıyor durmuyor time.. Oluyor diyelim 15ms.. Sonra cpu'ya diyoruz ki "alo hadi yaptık biz yapacağımızı sen iyisi mi çiz!". Cpu hali ile gpu'ya signal yolluyor "bak insanlar bekliyor çizim gerekiyor şu an hadi göster kendini" diye. Gpu'da haşırt çizmeye başlıyor. Ancak! Biz eğer monitör taraması ile kendimizi sync etmek istiyorsak, şöyle durumlar olabiliyor.. (1.frame'i zoomluyorum.)

1. Frame total usage Time 0------------5-------------10---------------15------------20-----------25

_____________________________________________ Cpu | cpuwork |_______cpuidle____________

__________________ Gpu _____________gpuidle_________________________| gpuwork |_waitvbl

Burada gösterdiğim standart bir cpu ve gpu graph'i. Biraz kötü dizayn edilmiş bir oyunun veya demonun çalışma şekli. Cpu ve gpu'ya farklı zamanlarda erişilerek, birbirlerinin paralel çalışması engellenmiş ve olabilecek minimum performans alınmış. İşte bütün bunları engellemek için insanlar çeşitli yöntemler bulmuş. Çünkü hedef grafik:

1. Frame total usage Time 0------------5-------------10---------------15------------20-----------25

________________________________________________________________________ Cpu |

_____________________________________________________________ Gpu ___________|

Buna yakın bir şey olmalı. Bu tabii imkansız. Yani kimse bu kadar iyi sync yapamaz. Ama elimizden geleni ardına koymamalıyız ve ona göre düşünmeliyiz.

Şimdi bunun için nasıl bir timing tekniği kullanacağımıza bakalım öncelikle... Bu teknik için 2 adet timer varmış gibi düşünüyoruz. Birincisi gerçek timer, ki bu sistemden gidip gerçek time value'sunu alan birim. İkincisine sanal timer diyebiliriz. Bu da aslında sistemin kullanacağı timer. Şimdi bütün programımızı bu noktada azıcık task oriented düşünüyoruz. Sistem standard'ın birazcık dışına çıkıyor. Buna daha sonradan şu task/thread manager kısmında bayağı bir değineceğim.

Şimdi.. Programımız aslında bir nevi iki timer'ı da kullanıyor. Ana olan bütün olaylar gerçek timer'ı kullanıyor.. Ancak hesaplama çizme gibi kısımlar virtual timeri. Şöyle oluyor. Hep beraber time'la birlikte ilerleyerek bakalım. 0.ms -> başlıyoruzzzzzzzzzzzzzzzzzzzzz... 4.ms -> diyelim aha bu noktada ekrana bir cube gelmesi gerekiyor. Hemen o kübü getiren task'i (dikkat!!!!!! - execute etmiyoruz).. Gereken task'i bir queue'ya atıyoruz. Daha çalışmadı kodumuz 13.ms -> aha burada da diyelim o sırada bir texture hesaplanması gerekiyor diyelim (tamamen uyduruyorum bunları) o texture'u da hesaplamıyoruz. Ve direkt queue'ya atılıyor.

Klavyeyle gezinmek için ← ve → tuşları.