Bu sayfadaki yazılar
Sayfanın metni
Sayfa 83
// Saymıyorsak else
// Süreyi saniyeye çevirip dön.
return double(pimpl_->zero_.QuadPart) / double(pimpl_->frequency_) ;
Kapanış
Gördüğümüz derleme süresi azaltma yöntemlerini özetleyelim…
Compiler firewall yönteminde header'larımızın başına özel satırlar ekleyip bir kaynak dosyası için iki kez okunmamasını sağlıyoruz. Her ne kadar ufak kazançlar sağlasa da alışkanlık edinmemiz gereken bir yöntem.
SubAPI yönteminde büyük kütüphanelerin sadece kullandığımız kısımlarını sunan ufak kütüphaneler hazırlıyoruz. Bu sayede devasa header'lar sadece tek kaynak dosyası tarafından görülmüş oluyor. Bu yöntemle portability'mizi de artırmış oluyoruz. Ve çok daha iyisi, aynı işi yapan farklı alternatifler arasında geçişimiz çok rahat oluyor. Örneğin:
#ifdef OPENGL
/* Burada OpenGL kullanan SubAPI */
#endif
#ifdef DIRECTX9
/* Burada da DirectX kullanan */
#endif
Bu ayrımı kodumuzun çizim yapan her satırına da uygulayabilirdik. Ama bu kadar temiz olmayacaktı tabii ki.
Opak Pointer (ya da pimpl idiom) ile SubAPI'lerde elde ettiğimiz gücü sınıflarda buluyorduk. Bu yöntem derleme sürelerini oldukça düşürmesinin yanında, arayüz ve implementasyon ayrıntılarını istisnasız şekilde birbirinden ayırdığı için de projenin tamamının yönetimini kolaylaştıracaktır.
Örnek vermek gerekirse, ana işlemleri tamamen GPU üzerinde çalışan bir matris kütüphanesi hazırlamıştım. Ama bu kütüphaneyi kullanmak için hiçbir grafik kütüphanesi header'ı eklemeye gerek yoktu!
Bir başka örnek olarak da şu anda tam olarak API bağımsız (OpenGL, DirectX) bir doku sınıfı kullandığımı ve sonuçlardan çok memnun olduğumu söylemeliyim. Tam olarak'tan kastım ise, iki API arasındaki farklara bakmak için geçiş yaptığımda, sadece linkleme yapılıyor olması.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 82
return ;
void Timer::Stop()
if(pimpl_->counting_)
// Şimdiki saati al.
LARGE_INTEGER now ;
QueryPerformanceCounter(&now) ;
// Başlama saatinden çıkar.
pimpl_->zero_.QuadPart = now.QuadPart - pimpl_->zero_.QuadPart ;
pimpl_->counting_ = false ;
return ;
Son olarak da saatimizin okunması…
double Timer::GetTime() const
// Sayıyorsak if(pimpl_->counting_)
// Şimdiki saati al.
LARGE_INTEGER now ;
QueryPerformanceCounter(&now) ;
// Başlama saatinden çıkar.
now_.QuadPart = now.QuadPart - pimpl_->zero_.QuadPart ;
// Süreyi saniyeye çevirip dön.
return double(now.QuadPart) / double(pimpl_->frequency_) ;