Bu sayfadaki yazılar
Sayfanın metni
Sayfa 23
Tamam diyelim ilk frame'de bunlar oluyor. Gerçek zaman.. Gerçekten ilerledi ve bu tip işlemlerin olacağını gördü. Ve bunlar bir şekil queue'da toplandı. Sonra real-timer bakıyor ki.. 25.ms oldu.. Hah işte bu noktada artık frame update olması gerekiyor. Çünkü bu frame için yapılması gereken iş listesi belirlendi ve artık frame update gerekiyor. Ama geldik frame'in sonuna henüz bir şey yapılmış değil evet... Bu işlemlerin yapılışına aslında bu frame de başlayacağız... Pekiiiii... Ne zaman göstereceğiz... Cevap: bir sonraki frame.. Yani tamamen bir frame delay yiyoruz. (halbuki bu frame'de göstermemiz gerekirdi) ama sağladığı avantaj: o frame'i çizmeye başladığımız andan itibaren bir frame oluşturulması gereken işleri aslında bir nevi sort ettik. Ve 25.ci ms'de şu an cpu biliyor nelerin yapılmasını 1.frame'i çizerken.. Arka arkaya onları execute ediyor. (hiç bir stop yok cpu'da.. Hali ile gpu'da da (zati farklı thread'lerde çalışıyor ekran update gibi olaylar.. Buna da değineceğim şu an kurcalamasın ortalığı)..) Cpu direkt olarak full güç execute ediyor ve hiç bir wait yemiyor. Ve aynı anda gpu'da full güç tüm drawing olaylarına başlıyor ve hiç bir wait yemiyor taaaaaaaaaa ki.. İşleri bitene kadar.. Yani gerçek ikinci frame'in (yani bizim aslında birinci frame) başlangıç ve bitiş grafiğine bakacak olursak eğer:
2. Frame total usage Time 25------------30------------35--------------40------------45-----------50
______________________________ Cpu | |__________________________________________
__________________________________________________ Gpu ___| |__________________
Şekline uygun bir yapı çıkar. Cpu başladı çalışmaya. Biraz yaptı işini (öncelikle gpu için gerekenleri falan..) Sonradan gpu'da başladı çizmeye yapılanları... Ve aynı anda biri hazırlananları çizerken diğeri de gereken diğer işlemleri yapmaya devam ediyor. Ve %90 ihtimalle cpu işini daha önce bitiriyor. Ve gpu azıcık daha çizmeye devam ediyor. Eee. Hani boşluk kalmayacaktı... Hah işte kalmayacak.. Demek ki kötü bir şey yapmışız. Yani bizim program şu an haaaaaaaala resource kaldırabilecek durumda.. (tabi bu arada.. Bu 2.frame'deyken.. Bizim 2.ci frame için gereken task'lar da bir yandan demo flow tarafında queue'ya push'lanmaya devam.. diyelim bu frame'de hodo hodo noise hesaplanması gerekiyor. Execution yok.. Sadece basit bir push işlemi olduğu için sistemi zati kullanmıyor. O hodo hodo noise aslında 3.cü frame'de execute edilecek. Yukarıdaki örneğimizde aslında belki de o hodo hodo noise'u bu frame'e taşıyabilirdik.. Gördüğümüz gibi haaaaaala imkanımız var o işlemleri yapacak gpu ve cpu belli bir kısımda boş.. Ama artık o boşluğun nerede olacağı ne zaman olacağı tamamen kontrolümüz altında. Yükü ağırlaştırıp hafifletmek elimizde. Örneğin belki bir rotation işlemi (varsayalım 40000,40000,40000'lik bir volume texture'u böyle sinus hodo cosinus bir şey yapıyoruz... Ama dönmesi biraz yavaş olması bizim için çok da problem değil. O zaman bunu biz 2 frame'de bir döndürelim. Ve gene aynı şekilde buna benzer gene çok zaman yiyebilecek bir başka process'de var diyelim o da gene aynı şekilde 2 frame'de bir çalışsa problem olmayacak. O zaman bunları hesaplayacak tasklarımızı bu tip frame'lere bölersek kesinlikle çok daha performanslı sonuçlar alabiliriz.. Bunlara sırası ile task a ...ve task b diyelim.
Time 0------------25------------50--------------75------------100----------125 1.frame 2.frame 3.frame 4.frame 5.frame push task-a process task-a process task-b process task-a process task-a push task-b push task-a push task-b
Klavyeyle gezinmek için ← ve → tuşları.
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.