Forum: SDL RSS
Tuş Önbellekleme Algoritması
Key Buffer Stack
Sayfa:  önceki  1  2 
Avatar
Salih Dinçer #16
Üye Ock 2012 tarihinden beri · 1913 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 9351
Tekrar Merhaba,

Sınıfın unittest'ini icra ediyorken, aklıma index'leri 2. aşamada (aralıklarda 3.) değiştirmek geldi. Böylece aralık kuralını ihlal etmemiş olacaktık. Test örneklerim de hazır olduğuna göre 1-2 değişiklik (yer değiştirme ve okuma/yazma kafasını 0'dan başlatma) yapıp hemen deneyebilirdim. Denedim ve çalışıyor...:)

Test etmek isterseniz:
class BufferStack(T) {
  int rIndex; // read index
  int wIndex; // write index
  T[] data;
  
  this(size_t length) {
    this.data.length = length;
  }
  
  @property
  int length() {
    return rIndex > wIndex ?
           rIndex - wIndex - 2 :
           wIndex - rIndex;
  }
 
  @property 
  bool empty() const {
    return rIndex == wIndex;
  }
 
  @property
  auto size() {
    return cast(int)data.length - 1;
  }
 
  void popFront() {
    if( rIndex < this.size() ) rIndex++;
    else rIndex = 0;
  }
 
  T front() {
    return data[rIndex];
  } 
  
  @property
  T pop() {
    scope (exit) popFront();
    
    return data[rIndex];
  }
  
  @property
  void push(T value) {
    data[wIndex] = value;
    
    if( wIndex < this.size() ) wIndex++;
    else wIndex = 0;
  }
   
} unittest {
 
  string str = "Stack Testing!";
  // STACK --> [----------------]
  auto stack = new BufferStack!char(str.length + 2);
 
  assert(stack.empty == true);
  assert(stack.length == 0);
 
  foreach(s; str) stack.push(s);
  /* STACK --> [Stack Testing!--]
                   wIndex ---^ */{
    string pop;
    foreach(c; stack) pop ~= c;
    assert(str == pop);
  }
   
  str = "Partial";
  foreach(s; str) stack.push(s);
  /* STACK --> [rtial Testing!Pa]
          wIndex ---^ */{
    string pop;
    foreach(c; stack) pop ~= c;
    assert(str == pop);
  }
  
  stack.push(' ');  
  assert(stack.empty == false);
  assert(stack.length == 1);  
  
  stack.pop();
  assert(stack.empty == true);  
  assert(stack.length == 0);
}
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
huseyin #17
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bu önbelleklemeyi işletim sistemleri kendileri yapmıyorlar mı ? Hep merak ettiğim bir konu bu
Huseyin
Avatar
Salih Dinçer #18
Üye Ock 2012 tarihinden beri · 1913 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ö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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
huseyin #19
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
kesinlikle yineleme hızı artık işletim sistemine kaldı ben bu dediğiniz sistemleri kullandım. Bende şuan Commodore 64 var ve qbasic yorumlayıcısı ile çalışıyor. Yavaş olmasına rağmen güzel ancak kullanmasını çok bildiğimi söyleyemem bu cihazdaki önbellekleme donanıma dayalı olsa gerek ?
Huseyin
Avatar
Salih Dinçer #20
Üye Ock 2012 tarihinden beri · 1913 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ben de kısa bir dönem C64 kullanmıştım ama o zamanlar programlamadan çok oyunlarla ilgileniyordum. Sonra PC'lerdeki olanaklar bana daha sempatik gelmeye başladı. Ama her şeye rağmen, gerek üretim hakkını alıp yepyeni bir şekilde tekrar satışa sunma, gerekse 7Dx Scene gibi 'demo party'lerde yaşamımızda tutma faaliyetleri devam ediyor. Elinde çalışan bir tane olması ve bazı şeyleri deneyebilmen çok hoş...:)

Hatırladığım kadarıyla C64'ler, klavyesi ile bütünleşiktiler. Sanırım örnekleme hızı gibi ayarları yok. Hiç denedin mi; tüm satırı doldurman (sürekli herhangi bir harfe basılı tutman) ne kadar süre alıyor? Hatta çalışması zaman alan büyük bir yazılımı RUN komutu verdikten hemen sonra tuşlara rasgele bassan ekrana herhangi bir şey yansıyor mu ya da bir süre sonra önbelleğin dolduğuna dair ses falan duyuyor musun?

C64'ler zamanına göre çok güzel bilgisayarlar. Çevremizde halen yaşamakta olan fanatikleri bile var. Hatırladığım kadarıyla bir bellek bölgesi çok hızlı adreslendiği için çok değerliydi. Hız gerektiren alt yordamları oraya yüklediklerini biliyorum. Muhtemelen C64'ün de bir donanımsal önbelleği vardır. Hatta bazı modifiye olanları flash bellekler ile çalıştırdıklarını gördüm. Sanırım artık disketler ile uğraşmıyorlar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
huseyin #21
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hiç denedin mi; tüm satırı doldurman (sürekli herhangi bir harfe basılı tutman) ne kadar süre alıyor?
Daha deneyemedim ama bir ara deneyip size sonucu söyleyebilirim


Hatta bazı modifiye olanları flash bellekler ile çalıştırdıklarını gördüm. Sanırım artık disketler ile uğraşmıyorlar...

Bu nasıl yapılıyor ya :) ben hala o kocaman disketle uğraşıyorum

C64 de mon64 aracılığı ile asm yazılabiliyormuş duyduğuma göre ama ben onu nereden edinicem bu devirde nerde kalmıştır ki :D
Huseyin
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  önceki  1  2 
Forum: SDL RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-12-16, 10:51:57 (UTC -08:00)