Önbellekleme geniş bir kavram olsa da tuşlar ile ilgili hususa değinirsek, hepimizin az/çok bildiği meselelerden olmalı...
Sanırım BIOS'un yönettiği ve donanım tarafında duran bir önbellek (buffer) var. Ama bu klavye içinde mi (zannetmiyorum) yoksa anakart üzerinde mi (ayarlarını yapabildiğimize göre öyle) emin değilim. Gerçi eskilerden bildiğimiz bir şey var: IBM AT olsun, PS/2 olsun her iki 'connector'un yanında bir tümdedevre(integrated) vardır. Muhtemelen de donanımsal önbellek bunun içinde olmalı. Çünkü bozulduğunda onu veya çevresindeki pasif elemanları değiştirirdik.
Tabi iş USB'ye kaydığında, dış katmandaki Tx/Rx'lerin donanımsal olarak önbelleklemesi hariç 'emulation' gibi bir yazılımsal önbellekleme vardır diye düşünüyorum. Çünkü USB klavyeler artık gelen veriyi değerlendiren sanal birimlerden (yazılımlardan) ibaretler. İşte ben de farklı katmanda (belki de en son katmanda) böyle bir şey yapıyorum...:)
Önce şu soruyu soralım: Buna niye ihtiyaç duyuyoruz?
Eskiden olsaydı bilgisayarların hızı sizin tuşlara basma hızına yetişemediği için diyebilirdik. Belki çoğu genç arkadaşımız bilmez; klavyenin önbelleği dolduğunda (donanım tarafında) yazılımın geçici olarak durmasıyla beraber, BIOS'un bize ses yoluyla (beep signal) hata verdiği olmuştur. MS-DOS gibi 16 bit işletim sisteminin klavyeden dolayı durabildiğine inanabiliyor musunuz! Neyse, durma ve olumsuz kavramları şimdilik bir kenara bırakalım...
'Şimdi ise yazılımlar o kadar hızlı ki klavyenizin üzerinde, yanlışlıkla bir kitap dursa ve özel bir elektronik devre (arabirim) ile sonsuz bant genişliğinde yani hiç bir sınırlamaya gidilmeden gelen verileri alsaydık, herhalde en az USB 1.1'in kapasitesinde veri depolayabilirdik. Artık o an hangi tuş basılıysa...:)'
İlginç değil mi? Gerçi elektronik devreye gerek yok sanırım. Çünkü SDL kütüphanesi, işletim sisteminin sınırlamalarına takılmadan, donanımsal tarafın verdiği bilgileri değerlendirdiğini sezinledim. İşte o yüzden bir BufferStack sınıfı yapma ihtiyacı hissettim. Çünkü yazılımınız gerçekten hızlı ve siz "type rate" gibi bir sınırlama getirmezseniz işler karışabilir. Örneğin TextBox içinde her tuşa bastığınızda tek harf değil bir sürü karakterler ile dolardı.
Bakınız, işletim sisteminin ayarlarında (sanırım Windows'da bölgesel dil seçenekleri ve ayarlar'da olması lazım) bile klavyenin ne kadar sıklıkta basacağı hatta "key sticky" durumunda yazılımın bir uyarı penceresi getirebileceği vardır. İşte bütün bu yazdıklarımdan konunun ne kadar önemli olduğunu ve normal bir kullanıcının hissetmeyeceği bir incelikte işlendiğini/örneklendiğini çıkarabilirsiniz. Gerçi biz yığın konusundan farkında olmadan uzaklaştık, çünkü bir kavram daha var:
- Örnekleme (numune): Sanırım yabancılar buna Type Rate diyorlar ve bir oranı/hızı temsil ediyor. Yukarıda bahsettiğim ayarlar içerisinde değeri değiştirilebiliyor. Yani BufferStack'den bağımsız bir şekilde gelen veriye sınırlama getiriliyor. Bunu önceki sayfada, osiloskop ile ölçülen bir kare dalga fotoğrafı çerçevesinde anlatmaya çalıştım...
Ben buna "sondage" diyorum, hani petrol firmaları bir kuyu açmadan önce sayısız delik (sonda) açar da yer altından numune toplar ya, işte o hesap. Bunu neden yapar? Çünkü daha ekonomik (hızlı) olacağı için. Emin olmadığı bir petrol yatağına tüm sondaj donanımını yığmak istemez. Klavyelerimiz ise (elbette parmaklarımızın kontrolünde) sınırsız bir petrol yatağı gibi. Ama işin güzelliği de bizim günlerce petrol pompalamaya ihtiyacımız yok...:)
İşte tıpkı bu alınan numuneler gibi, biz de aralıklı (ayarlanabilir) bir şekilde klavyenin son durumunu örneklemeliyiz. Yoksa önbellek yetmez. Gerçi siz BufferStack sınıfını gerçekten çok büyül bir değer kurabilirsiniz, burada sıkıntı yok. Ama bu sefer pop() yapıldığı sırada ekrana bir sürü harfi 'render' etmesi gerekecek. O yüzden bu konu içindeki ara konu örnekleme de çok önemlidir...
- Özet: Uzun bir yazı oldu, farkındayım. Belki de önbelleklemeden (1) çok örneklemeden (2) bahsetmiş olabilirim...
-
(1) Aslında bu bir araçtı ve her an gelebilecek veriyi kaçırmadan depolamamız gerekiyordu. Çünkü sahneye yansımaları (render) belirsiz bir zamanda olacaktı. Neyse ki hızları farklı ve bunu diğer konu (2) ile sınırlandırdık.
-
(2) Bu ise bizim hedefimizdi ve zaten başlarda basit kod ile buna ulaşmıştık. Aslında "örnekleme sıklığı" (a) ve "örnekleme oranı" (b) diye 2 alt başlığımız da var. Belki terimleri karıştırıyor olabilirim ama herkesin anlayacağı dilden anlatırsak:
** (a) Parmaklarınız her tuşa değdiğinde en az 1 adet örnek (hangi tuşa basıldığını öğrenmek) alınmalı. Eğer bu çok seyrek olursa bazen tuşların basmadığı gibi bir izlenip doğabilir.
** (b) Buna rağmen tuşlara birden fazla kezzzzzzzzzzz (<--- burada olduğu gibi) basmanız gerekebilir. Bu oran küçükse "bu ne yavaş bilgisayarmış canım" dersiniz...:)
Aslında hepsi bir ayardır ve yoksa bilgisayar çok hızlıdır! Yavaşlatma işin doğasındadır; biz insanlar içindir...
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]