BitBlt API Hakkında Soru

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

BitBlt API Hakkında Soru

Mesaj gönderen anonymousdelphicoder »

Merhabalar,

BitBlt API'si Source DC'i (Device Context) Dest DC ye kopyalamak için kullandığımız bir GDI apisi,

size göstereceğim iki farklı kod örneğim var, göstermiş olacağım iki görüntününü boyutları her ikisi içinde 1920 * 1080 24 bit tir, görüntü kaynağı olarak,

ilk kaynak, GetDC(GetDesktopWindow) dan dönen DC Handle'ı ikinci kaynak ise formda yer alan TImage nesnesine assign edilmiş Bitmap görüntüsünün DC Handle'ı dır.

Buradaki sorun şu, her iki görüntü aynı boyutlara ve bit'e sahip olmasına rağmen GetDC(GetDesktopWindow) dan dönen değeri BitBlt Api'sinin SourceDC parametresine geçtiğim de kopyala işlemi 35..40 ms sürüyor, fakat BitBlt Api'sinin Source DC parametresine geçtiğim DC Handle'ı

Kod: Tümünü seç

Image1.Picture.Bitmap.Canvas.Handle
olduğunda aynı görüntü özelliklerine(hatta ekranın görüntüsü nü çekip diske kaydedip TImage'ye atadım) sahip olduğu halde Image nesnesinden dönen DC Handle ile kopyalama yapıldığında 4..7 ms sürüyor.

Burada neden bu kadar bariz zaman farkı var ? tam emin olmamakla birlikte TImage den alınan DC Handle ı bir Memory DC yani CreateCompatibleBitmap API'si tarafından oluşturulan bir DC olduğu için bu kadar hızlı kopyalıyor olabilir mi ? GetDC(GetDesktopWindow) ile dönen DC Handle ise bir Memory DC olmadığı için yani Display DC olduğu için yavaş oluyor olabilir mi ?

Kodlar şu şekilde,

Hızlı Kopyalayan Kod Örneği:

Kod: Tümünü seç

var
DC:HDC;
B:TBitmap;
F,L,FQ:Int64;
begin
    try
      QueryPerformanceFrequency(FQ);
      QueryPerformanceCounter(F);
      B := TBitmap.Create;
      B.SetSize(1920,1080);
      DC := Image1.Picture.Bitmap.Canvas.Handle; //burada görüldüğü gibi Image nesnesinden DC Handle alınıyor ve BitBlt Api'si kopyalamayı 4 ile 7 ms saniye arasında gerçekleştiriyor..
      BitBlt(B.Canvas.Handle,0,0,1920,1080,DC,0,0,SRCCOPY);

      QueryPerformanceCounter(L);
      Caption := FloatToStr((L - F) / FQ * 1000);
    finally
      FreeAndNil(B);
    end;
end;

Yavaş Kopyalayan Kod Örneği:

Kod: Tümünü seç

var
DC:HDC;
B:TBitmap;
F,L,FQ:Int64;
begin
    try
      QueryPerformanceFrequency(FQ);
      QueryPerformanceCounter(F);
      B := TBitmap.Create;
      B.SetSize(1920,1080);
      DC := GetDC(GetDesktopWindow); //burada görüldüğü gibi GetDC ile Desktop'ın DC Handle alınıyor ve BitBlt Api'si kopyalamayı 35 ile 40 ms saniye arasında gerçekleştiriyor..
      BitBlt(B.Canvas.Handle,0,0,1920,1080,DC,0,0,SRCCOPY);

      QueryPerformanceCounter(L);
      Caption := FloatToStr((L - F) / FQ * 1000);
    finally
      FreeAndNil(B);
    end;
end;
Teşekkürler.

Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: BitBlt API Hakkında Soru

Mesaj gönderen SimaWB »

Bence ikisi arasında oluşan 30-35 ms'lik fark DC'nin elde edilmesinden kaynaklanıyordur.
There's no place like 127.0.0.1

anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: BitBlt API Hakkında Soru

Mesaj gönderen anonymousdelphicoder »

SimaWB yorumun için teşekkür ederim fakat bahsettiğiniz gibi GetDC ve GetDesktopWindow çağrılarının dönüşü buna neden olmuyor, isterseniz deneyebilirsiniz.

Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: BitBlt API Hakkında Soru

Mesaj gönderen Kuri_YJ »

Selamlar,
Kesin emin olmamakla birlikte (yani API'nin yapısını bilmemekle birlikte) yaptığın yorumun doğru olduğu kanaatindeyim. Yani ekran bilgisini, ekranın olduğu yerden almak ile Memeory'den almak arasında ben daha fazla fark bekliyordum ama daha az imiş. Çünkü ekrandan alınacak bilgi bir takım senkronizasyonlara tabi tutulmaktadır. Bu nedenle bilgiyi okurken muhtemelen LOCK'lanıyordur ve sen de o LOCK'ın çzöülmesini bekliyorsundur.
Raster Interrupt'ı yada Scan Line işlemi vardır. Bu ve buna benzer sebeplerden dolayı senin ekrandan okuduğun bilgi doğrudan RAM'den değil çok büyük ihtimalle Ekran Kartının RAM'inden gelmektedir.

Sadece bu LOCK dediğim şeylerden kaynaklı olması dışında, bir de ekran kartının belleğinden de okuyor olmak CPU için ayrıca bir Veri Yolu trafiği oluşturacaktır. Bence bu denemeni donanım özellikleri başka bir makinede yap. Bak bakalım fark ne kadar oluyor. Ayrıca, aynı bilgisayarda ekran tarama hızını da değiştir bakalım fark oluşacak mı? Yani atıyorum 60 herzden 30 herze indir bakalım.

Ama tespitinde doğruluk payı var.

Kolay Gelsin
Adnan
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/

Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2129
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: BitBlt API Hakkında Soru

Mesaj gönderen sadettinpolat »

getDC , bitblt , slow kelimeleriyle arama yapinca bu durumdan sikayetci olan epey bir kisi varmis.

bunlar belki ise yarayabilir.

https://groups.google.com/forum/#!topic ... oW_QN3q9hk
http://www.gamedev.net/topic/267492-is-getdc-slow/
https://forum.powerbasic.com/forum/user ... eally-slow
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/

ertank
Üye
Mesajlar: 1339
Kayıt: 12 Eyl 2015 12:45

Re: BitBlt API Hakkında Soru

Mesaj gönderen ertank »

anonymousdelphicoder yazdı:Merhabalar,

BitBlt API'si Source DC'i (Device Context) Dest DC ye kopyalamak için kullandığımız bir GDI apisi,

size göstereceğim iki farklı kod örneğim var, göstermiş olacağım iki görüntününü boyutları her ikisi içinde 1920 * 1080 24 bit tir, görüntü kaynağı olarak,

ilk kaynak, GetDC(GetDesktopWindow) dan dönen DC Handle'ı ikinci kaynak ise formda yer alan TImage nesnesine assign edilmiş Bitmap görüntüsünün DC Handle'ı dır.

Buradaki sorun şu, her iki görüntü aynı boyutlara ve bit'e sahip olmasına rağmen GetDC(GetDesktopWindow) dan dönen değeri BitBlt Api'sinin SourceDC parametresine geçtiğim de kopyala işlemi 35..40 ms sürüyor, fakat BitBlt Api'sinin Source DC parametresine geçtiğim DC Handle'ı

Kod: Tümünü seç

Image1.Picture.Bitmap.Canvas.Handle
olduğunda aynı görüntü özelliklerine(hatta ekranın görüntüsü nü çekip diske kaydedip TImage'ye atadım) sahip olduğu halde Image nesnesinden dönen DC Handle ile kopyalama yapıldığında 4..7 ms sürüyor.

Burada neden bu kadar bariz zaman farkı var ? tam emin olmamakla birlikte TImage den alınan DC Handle ı bir Memory DC yani CreateCompatibleBitmap API'si tarafından oluşturulan bir DC olduğu için bu kadar hızlı kopyalıyor olabilir mi ? GetDC(GetDesktopWindow) ile dönen DC Handle ise bir Memory DC olmadığı için yani Display DC olduğu için yavaş oluyor olabilir mi ?

Kodlar şu şekilde,

Hızlı Kopyalayan Kod Örneği:

Kod: Tümünü seç

var
DC:HDC;
B:TBitmap;
F,L,FQ:Int64;
begin
    try
      QueryPerformanceFrequency(FQ);
      QueryPerformanceCounter(F);
      B := TBitmap.Create;
      B.SetSize(1920,1080);
      DC := Image1.Picture.Bitmap.Canvas.Handle; //burada görüldüğü gibi Image nesnesinden DC Handle alınıyor ve BitBlt Api'si kopyalamayı 4 ile 7 ms saniye arasında gerçekleştiriyor..
      BitBlt(B.Canvas.Handle,0,0,1920,1080,DC,0,0,SRCCOPY);

      QueryPerformanceCounter(L);
      Caption := FloatToStr((L - F) / FQ * 1000);
    finally
      FreeAndNil(B);
    end;
end;

Yavaş Kopyalayan Kod Örneği:

Kod: Tümünü seç

var
DC:HDC;
B:TBitmap;
F,L,FQ:Int64;
begin
    try
      QueryPerformanceFrequency(FQ);
      QueryPerformanceCounter(F);
      B := TBitmap.Create;
      B.SetSize(1920,1080);
      DC := GetDC(GetDesktopWindow); //burada görüldüğü gibi GetDC ile Desktop'ın DC Handle alınıyor ve BitBlt Api'si kopyalamayı 35 ile 40 ms saniye arasında gerçekleştiriyor..
      BitBlt(B.Canvas.Handle,0,0,1920,1080,DC,0,0,SRCCOPY);

      QueryPerformanceCounter(L);
      Caption := FloatToStr((L - F) / FQ * 1000);
    finally
      FreeAndNil(B);
    end;
end;
Teşekkürler.
Merhaba,

Öncelikle örnek kodlar ile ilgili bir iki noktaya dikkat çekmek istiyorum.
1- B := TBitmap.Create() satırı try bloğunun dışına alınmalı. Kodun bu hali ile ilgili satırda oluşacak bir "exception" finally kısmındaki FreeAndNil(B) satırında da "exception" oluşturur çünkü B nesnesi oluşturulamamıştır.
2- DC := GetDC() ile atama yapılan değişken ReleaseDC() ile boşa çıkarılmalıdır.
3- B değişkeni bize gönderilen kod dışında bir yerde kullanılmayacak ise "FreeAndNil(B)" yerine sadece "B.Free()" kullanılması daha yerinde olacaktır.

Sorunuza gelince.
A- Gelen kısmi kodlardan alaşılmadığı için; eğer Image1 içinde bir bilgi yok ise (resim yüklenmiş durumda olsa dahi) bu kodun hızlı çalışması çok doğaldır. Tek bir görüntü nesnesinin içeriğini okur.
B- BitBlt() çalıştırıldığı anda ekrandaki bütün görüntü kilitlenerek anlık görüntü bilgisi okunur. Bu kilitleme işlemi hızlı olsada tüm çalışan uygulamaların ekranda görüntüsü olup olmadığı kontrol edilerek ekranda penrece alanı kaplayanlar kilitlenerek görüntü oluşturulur. Ekranda ilgilenmesi gereken birçok bölge vardır. TaskBar, yeni sürüm işletim sistemlerinde ekranda gözükmese dahi notification center bunlardan bazılarıdır.

Ek not olarak; BitBlt() esasen ekran kartı sürücüsü üzerindeki bir işlemdir. Windows kendisi bir işlem yapmaz. Ekran kartı sürücüsüne komutu iletir. Dolayısı ile ekran kartınızın sürücüsü ile ilgili ekstra bir yavaşlık söz konusu olabilir. Bununla birlikte uygulamanızın çalışacağı herhangi bir bilgisayarda da bu tarz bir sorun ile karşılaşmanız olasıdır.

anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: BitBlt API Hakkında Soru

Mesaj gönderen anonymousdelphicoder »

Kuri_YJ yazdı:Selamlar,
Kesin emin olmamakla birlikte (yani API'nin yapısını bilmemekle birlikte) yaptığın yorumun doğru olduğu kanaatindeyim. Yani ekran bilgisini, ekranın olduğu yerden almak ile Memeory'den almak arasında ben daha fazla fark bekliyordum ama daha az imiş. Çünkü ekrandan alınacak bilgi bir takım senkronizasyonlara tabi tutulmaktadır. Bu nedenle bilgiyi okurken muhtemelen LOCK'lanıyordur ve sen de o LOCK'ın çzöülmesini bekliyorsundur.
Raster Interrupt'ı yada Scan Line işlemi vardır. Bu ve buna benzer sebeplerden dolayı senin ekrandan okuduğun bilgi doğrudan RAM'den değil çok büyük ihtimalle Ekran Kartının RAM'inden gelmektedir.

Sadece bu LOCK dediğim şeylerden kaynaklı olması dışında, bir de ekran kartının belleğinden de okuyor olmak CPU için ayrıca bir Veri Yolu trafiği oluşturacaktır. Bence bu denemeni donanım özellikleri başka bir makinede yap. Bak bakalım fark ne kadar oluyor. Ayrıca, aynı bilgisayarda ekran tarama hızını da değiştir bakalım fark oluşacak mı? Yani atıyorum 60 herzden 30 herze indir bakalım.

Ama tespitinde doğruluk payı var.

Kolay Gelsin
Adnan
Yorumunuz için teşekkür ederim,

dediğiniz gibi 25 ve 30 hertz e aldım fakat response time süresi malesef aynı.

anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: BitBlt API Hakkında Soru

Mesaj gönderen anonymousdelphicoder »

ertank yazdı:
Merhaba,

Öncelikle örnek kodlar ile ilgili bir iki noktaya dikkat çekmek istiyorum.
1- B := TBitmap.Create() satırı try bloğunun dışına alınmalı. Kodun bu hali ile ilgili satırda oluşacak bir "exception" finally kısmındaki FreeAndNil(B) satırında da "exception" oluşturur çünkü B nesnesi oluşturulamamıştır.
2- DC := GetDC() ile atama yapılan değişken ReleaseDC() ile boşa çıkarılmalıdır.
3- B değişkeni bize gönderilen kod dışında bir yerde kullanılmayacak ise "FreeAndNil(B)" yerine sadece "B.Free()" kullanılması daha yerinde olacaktır.

Sorunuza gelince.
A- Gelen kısmi kodlardan alaşılmadığı için; eğer Image1 içinde bir bilgi yok ise (resim yüklenmiş durumda olsa dahi) bu kodun hızlı çalışması çok doğaldır. Tek bir görüntü nesnesinin içeriğini okur.
B- BitBlt() çalıştırıldığı anda ekrandaki bütün görüntü kilitlenerek anlık görüntü bilgisi okunur. Bu kilitleme işlemi hızlı olsada tüm çalışan uygulamaların ekranda görüntüsü olup olmadığı kontrol edilerek ekranda penrece alanı kaplayanlar kilitlenerek görüntü oluşturulur. Ekranda ilgilenmesi gereken birçok bölge vardır. TaskBar, yeni sürüm işletim sistemlerinde ekranda gözükmese dahi notification center bunlardan bazılarıdır.

Ek not olarak; BitBlt() esasen ekran kartı sürücüsü üzerindeki bir işlemdir. Windows kendisi bir işlem yapmaz. Ekran kartı sürücüsüne komutu iletir. Dolayısı ile ekran kartınızın sürücüsü ile ilgili ekstra bir yavaşlık söz konusu olabilir. Bununla birlikte uygulamanızın çalışacağı herhangi bir bilgisayarda da bu tarz bir sorun ile karşılaşmanız olasıdır.
Yorumunuz ve kodsal bilgilendirme için teşekkür ederim,
Taskbar ve notification kısmında tam olarak neden bahsettiğinizi anlayamadım rica etsem biraz daha açabilir misiniz ?

diğer bir husus ise BitBlt apisi bir GDI Apisi ve GDI'ın meşhur hız yavaşlığı söz konusu CPU üzerinde koşmasından dolayı olarak biliyorum, bununla birlikte dediğiniz gibi ekran üzerinde bir çok kontrol kilitleme vs işlemi yapılarak ekran görüntüsü alıyoruz peki burada sormak istediğim ÖNEMLİ bir husus ise örneğin BitBlt ile ben non stop 2000 kare yakalıyorum ve görüntü yakalanırken ekran kilitleniyor ise biz bu ekrandaki kilitleme olayını neden veya nasıl fark edemiyoruz, çünkü aralıksız olarak 2000 kare yakaladığımda ekran locklandığından değişken görüntülerin de durması gerekmiyor mu ? en azından az da olsa bir fark etmemiz gerekmiyor mu?

****Diğer önemli bir nokta ise BitBlt locklama ve ekranda ki pencereleri denetliyorsa ekran kartının belleğinden bu görüntüyü almıyordur, çünkü ekran kartının belleğinden almış olsaydı neden ekranda ki penceler ekrandamı değil mi diye kontrol etsin ki ? zaten penceler doğal olarak ekranda iken bunlar zaten ekran kartında bir görüntü datası olarak duruyor DOĞRUDAN ekran kartından çekseydi çok daha hızlı olabilirdi diye düşünüyorum, ki BitBlt apisi bir GDI apisi ve CPU üzerinde koşan bir api olduğundan dediğiniz gibi ekranları kontrol edip ekranların her ekranın görüntüsünü çekip bunları concat ediyor olabilir mi acaba.

Birde bu ekrandan görüntü alma olayını diğer programlar en hızlı şekilde nasıl yapıyor ? native win apileriyle bunun yapmanın yolu nedir acaba,

örneğin taskbarda açık olan Google Chrome'da bir youtube videosu açık olsun pencereyi minimize edelim ve taskbardaki Google Chrome ikonunun üzerine mouse ile gelip bekleyelim ilgili ikonun üzerinde ufak bir pencere açılıyor ve Google Chrome'da o anda ki görüntü çok hızlı bir şekilde (sanki ekran açıkmış gibi) o ufak pencerede çiziliyor Windows bunu nasıl yapıyor ?


İlginiz için çok teşekkür ediyorum.

ertank
Üye
Mesajlar: 1339
Kayıt: 12 Eyl 2015 12:45

Re: BitBlt API Hakkında Soru

Mesaj gönderen ertank »

anonymousdelphicoder yazdı: Yorumunuz ve kodsal bilgilendirme için teşekkür ederim,
Taskbar ve notification kısmında tam olarak neden bahsettiğinizi anlayamadım rica etsem biraz daha açabilir misiniz ?
- Ekranda Başlat butonunun bulunduğu, Çalışan uygulamaların listelendiği, Hızlı çalıştırma linklerini üzerine koyabildiğimiz Standart olarak ekranın altında gözüken kısımdan bahsediyorum.
Resim

- Notification Center ise Windows 8.0 ve sonrasında standart olarak ekranın sağ tarafından sola doğru kayarak açılan, Virüs Tanımları Eski, Güncelleştirmeler yüklendi gibi bilgilerin içinde listelendiği kısım.
Resim
anonymousdelphicoder yazdı: diğer bir husus ise BitBlt apisi bir GDI Apisi ve GDI'ın meşhur hız yavaşlığı söz konusu CPU üzerinde koşmasından dolayı olarak biliyorum, bununla birlikte dediğiniz gibi ekran üzerinde bir çok kontrol kilitleme vs işlemi yapılarak ekran görüntüsü alıyoruz peki burada sormak istediğim ÖNEMLİ bir husus ise örneğin BitBlt ile ben non stop 2000 kare yakalıyorum ve görüntü yakalanırken ekran kilitleniyor ise biz bu ekrandaki kilitleme olayını neden veya nasıl fark edemiyoruz, çünkü aralıksız olarak 2000 kare yakaladığımda ekran locklandığından değişken görüntülerin de durması gerekmiyor mu ? en azından az da olsa bir fark etmemiz gerekmiyor mu?
- Yanlış bilmiyor isem Windows 7 ile birlikte Ekran görüntülerini GPU gücünden faydalanarak oluşturmaya başladı.
- Kilitleme ile kastım ekrandaki nesnenin anlık görüntüsünü alma işlemi. Bahsettiğiniz gibi, Siz BitBlt() ile 2000 kare yakalar iken ekran donanımı maksimum 110 kare gösterebiliyor. Nereden baksanız BitBlt() 18 kat daha hızlı. Donanımın hız yavaşlığı sebebi ile sizin kilitlemeleri farketmeniz mümkün değil.
anonymousdelphicoder yazdı: ****Diğer önemli bir nokta ise BitBlt locklama ve ekranda ki pencereleri denetliyorsa ekran kartının belleğinden bu görüntüyü almıyordur, çünkü ekran kartının belleğinden almış olsaydı neden ekranda ki penceler ekrandamı değil mi diye kontrol etsin ki ? zaten penceler doğal olarak ekranda iken bunlar zaten ekran kartında bir görüntü datası olarak duruyor DOĞRUDAN ekran kartından çekseydi çok daha hızlı olabilirdi diye düşünüyorum, ki BitBlt apisi bir GDI apisi ve CPU üzerinde koşan bir api olduğundan dediğiniz gibi ekranları kontrol edip ekranların her ekranın görüntüsünü çekip bunları concat ediyor olabilir mi acaba.
Benim kendi bilgisayarımdaki Windows 10 Anniversary Update işletim sistemi, i7 işlemci, NVIDIA 580 GTX ekran kartı ve 372.54 sürüm sürücüler ile 23-25 milisaniye civarında BitBlt() ile görüntüyü alıyorum. Ancak açık uygulamaları kapattığım zaman 16 milisaniye gibi değerlere düşüyor. Windows işletim sistemi kapalı kaynak kodlu olduğu ve her alanı ile ilgili detaylı dökümantasyona sahip olmadığı için tüm detayları ve sebeplerini maalesef bilemiyoruz. Muhtemelen BitBlt() önce kendi içinde bazı kontroller yaptıktan sonra işi GPU'ya aktarıyor.

Aşağıdaki kod ile birkaç milisaniye daha hızlı ekran yakalamak mümkün olabildi. Ancak ciddi bir artış söz konusu değil.

Kod: Tümünü seç

 
 procedure TForm1.Button4Click(Sender: TObject);
var
  Scr: HDC;
  Bmp: TBitmap;
  Time: TStopwatch;
begin
  Scr := GetWindowDC(0);
  try
    Bmp := TBitmap.Create;
    try
      Bmp.Handle := CreateCompatibleBitmap(Scr, 1920, 1080);

      Time := TStopwatch.StartNew();
      BitBlt(Bmp.Canvas.Handle, 0, 0, 1920, 1080, Scr, 0, 0, SRCCOPY);
      Time.Stop();
      Label4.Caption := Time.ElapsedMilliseconds.ToString();
    finally
      Bmp.Free();
    end;
  finally
    ReleaseDC(0, Scr);
  end;
end;
anonymousdelphicoder yazdı: Birde bu ekrandan görüntü alma olayını diğer programlar en hızlı şekilde nasıl yapıyor ? native win apileriyle bunun yapmanın yolu nedir acaba,

örneğin taskbarda açık olan Google Chrome'da bir youtube videosu açık olsun pencereyi minimize edelim ve taskbardaki Google Chrome ikonunun üzerine mouse ile gelip bekleyelim ilgili ikonun üzerinde ufak bir pencere açılıyor ve Google Chrome'da o anda ki görüntü çok hızlı bir şekilde (sanki ekran açıkmış gibi) o ufak pencerede çiziliyor Windows bunu nasıl yapıyor ?

İlginiz için çok teşekkür ediyorum.
BitBlt() donanım kısmına çok yakın bir fonksiyondur. Daha hızlı ve işletim sistemi tabanlı olan birşey bulmanız çok olası gelmiyor bana. Diğer taraftan yapmak istediğiniz TeamViewer gibi bir uygulama ise kendinize sanal "kopya" ekran sürcüsü geliştirip bu video sürücüsünden gelen görüntüleri kullanmanız gerekli. Bu durumda ekran görüntüleri size gelecek, siz okumaya çalışmayacaksınız.

Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: BitBlt API Hakkında Soru

Mesaj gönderen kimimben »

Gerçekte fonksiyonun iç yapısı %100 linkte ki gibi midir bilemiyorum.
Fakat fikir verebilir belki maksadıyla...

anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: BitBlt API Hakkında Soru

Mesaj gönderen anonymousdelphicoder »

ertank yazdı: BitBlt() donanım kısmına çok yakın bir fonksiyondur. Daha hızlı ve işletim sistemi tabanlı olan birşey bulmanız çok olası gelmiyor bana. Diğer taraftan yapmak istediğiniz TeamViewer gibi bir uygulama ise kendinize sanal "kopya" ekran sürcüsü geliştirip bu video sürücüsünden gelen görüntüleri kullanmanız gerekli. Bu durumda ekran görüntüleri size gelecek, siz okumaya çalışmayacaksınız.
Yorumlarınız için teşekkür ederim,

Taskbardan ve Notification ı sorarken ne gibi bir etkisi olduğunu merak etmiştim fakat şuan anladım, bunun birlikte Kopya ekran sürücüsü oluşturma kısmı oldukça mantıklı ama tuhaf gelen her ekran görüntü yakalama aracının böyle kopya sürücü oluşturduğuna pek ihtimal veremiyor gibiyiyim, acaba onlarda mı BitBlt apisi ile ilgili ekranı alıyor ? Örneğin Bandicam gibi (ki bandicam iyi fps veriyor)? ayrıca Kopya sürücü yüklenmiş olsa Bandicam kurulurken Windows sürücünün kurulmasına ilişkin izin veya bildirim sunması gerekmez miydi ? BitBlt ve Kopya sürücü dışında bu işi yapacak başka teknik yok mudur ?


***Sanırım bu kopya sürücü olayı Driver programcılığına girdiğinden Delphi ile yapamayız ?

Teşekkürler.

anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: BitBlt API Hakkında Soru

Mesaj gönderen anonymousdelphicoder »

kimimben yazdı:Gerçekte fonksiyonun iç yapısı %100 linkte ki gibi midir bilemiyorum.
Fakat fikir verebilir belki maksadıyla...
Link için çok teşekkür ederim bu tanımlamalar ve ilgili kodlar React OS un apileri mi ? Windows Apileriyle niçin isimdeler acaba bu kodların kaynağı neye dayanıyor ? bilginiz var mıdır

Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2129
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: BitBlt API Hakkında Soru

Mesaj gönderen sadettinpolat »

anonymousdelphicoder yazdı:
kimimben yazdı:Gerçekte fonksiyonun iç yapısı %100 linkte ki gibi midir bilemiyorum.
Fakat fikir verebilir belki maksadıyla...
Link için çok teşekkür ederim bu tanımlamalar ve ilgili kodlar React OS un apileri mi ? Windows Apileriyle niçin isimdeler acaba bu kodların kaynağı neye dayanıyor ? bilginiz var mıdır
ReactOS, Windows işletim sisteminin çalıştırdığı bütün yazılımları ve bütün sürücüleri çalıştırmayı, ücretsiz bir Windows işletim sistemi seçeneği olmayı amaçlamış açık kaynak ve özgür bir işletim sistemidir.
https://tr.wikipedia.org/wiki/ReactOS
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/

Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: BitBlt API Hakkında Soru

Mesaj gönderen kimimben »

anonymousdelphicoder yazdı:
kimimben yazdı:Gerçekte fonksiyonun iç yapısı %100 linkte ki gibi midir bilemiyorum.
Fakat fikir verebilir belki maksadıyla...
Link için çok teşekkür ederim bu tanımlamalar ve ilgili kodlar React OS un apileri mi ? Windows Apileriyle niçin isimdeler acaba bu kodların kaynağı neye dayanıyor ? bilginiz var mıdır
Bende Tuğrul bey sayesinde öğrenmiştim.
http://delphiturkiye.com/forum/viewtopi ... 91#p195232

ertank
Üye
Mesajlar: 1339
Kayıt: 12 Eyl 2015 12:45

Re: BitBlt API Hakkında Soru

Mesaj gönderen ertank »

anonymousdelphicoder yazdı:
ertank yazdı: BitBlt() donanım kısmına çok yakın bir fonksiyondur. Daha hızlı ve işletim sistemi tabanlı olan birşey bulmanız çok olası gelmiyor bana. Diğer taraftan yapmak istediğiniz TeamViewer gibi bir uygulama ise kendinize sanal "kopya" ekran sürcüsü geliştirip bu video sürücüsünden gelen görüntüleri kullanmanız gerekli. Bu durumda ekran görüntüleri size gelecek, siz okumaya çalışmayacaksınız.
Yorumlarınız için teşekkür ederim,

Taskbardan ve Notification ı sorarken ne gibi bir etkisi olduğunu merak etmiştim fakat şuan anladım, bunun birlikte Kopya ekran sürücüsü oluşturma kısmı oldukça mantıklı ama tuhaf gelen her ekran görüntü yakalama aracının böyle kopya sürücü oluşturduğuna pek ihtimal veremiyor gibiyiyim, acaba onlarda mı BitBlt apisi ile ilgili ekranı alıyor ? Örneğin Bandicam gibi (ki bandicam iyi fps veriyor)? ayrıca Kopya sürücü yüklenmiş olsa Bandicam kurulurken Windows sürücünün kurulmasına ilişkin izin veya bildirim sunması gerekmez miydi ? BitBlt ve Kopya sürücü dışında bu işi yapacak başka teknik yok mudur ?


***Sanırım bu kopya sürücü olayı Driver programcılığına girdiğinden Delphi ile yapamayız ?

Teşekkürler.
Eğer sürücüler "Onaylı Üreticiler" tarafından imzalanıyor ise size onay sorulmadan yüklenir. Eğer 64bit platform için geliştirilen bir sürücü ise "Onaylı Üretici" tarafından imzalanma zorunluluğu vardır. Ayrıca Microsoft'a gönderip WHQL şeklinde imzalanmış sürücüler içinde onay sorulmadan sisteme yüklenilmesine izin verilir.

Her uygulama kopya sürücü kullanmalı diye bir zorunluluk yok tabi. VNC bildiğim kadarı ile tüm ekran bilgisini okuyarak bu işlemi gerçekleştiriyor. Yine yüksek ihtimalle BitBlt() kullanıyordur. Bir ihtimal ProcessPriority değerini uygulama çalıştıktan sonra yükselterek bir miktar FPS artışı sağlıyor olabilirler.

Özünde grafik kartları yazma optimizasyonlu oluyorlar. Grafik kartının frame buffer bilgisi anlık okuma için pek sık kullanılmaz. Video hafızasını okuma işleminin kendisi yavaştır. Aralıklar ile bunu yapmaya çalıştığınızda yavaş ile çok yavas arasında bir performans elde edersiniz. 1280x1024 ekran boyutu gerçek renkler ile 5 MB'ın biraz üzerinde bir veri oluşturur. Çok iyi grafik kartları "çift port" hafıza kullanırlar. Bu tür ekran kartları yazma sırasında okumaya izin verir ve performans kaybı yaşamazlar.

Delphi ile sürücü yazılmaz diye bir kural yok. C/C++'a göre biraz daha uğraştırır.
http://stackoverflow.com/questions/2263 ... elphi-2010
http://www.delphibasics.info/home/delph ... lopmentkit
http://w-shadow.com/blog/2006/10/12/wri ... in-delphi/

Cevapla