Aracılığıyla paylaş


Blok sıkıştırma

Windows 8.1'den başlayarak, Direct2D çeşitli blok sıkıştırılmış piksel biçimlerini destekler. Buna ek olarak, Windows 8.1 blok sıkıştırılmış görüntüleri DDS dosya biçiminde yüklemeyi ve depolamayı etkinleştirmek için yeni bir Windows Imaging Bileşeni (WIC) DDS codec bileşeni içerir. Blok sıkıştırma, bit eşlem içeriği tarafından kullanılan grafik belleği miktarını azaltmaya yönelik bir tekniktir. Uygulamanız, blok sıkıştırmayı kullanarak aynı çözünürlükteki görüntüler için bellek tüketimini ve yükleme sürelerini azaltabilir. Veya uygulamanız aynı GPU bellek ayak izini kullanmaya devam ederken daha fazla veya daha yüksek çözünürlüklü görüntüler kullanabilir.

Blok sıkıştırma, Direct3D uygulamaları tarafından uzun süredir kullanılır ve Windows 8.1 ile temel ve Direct2D uygulama geliştiricileri de kullanılabilir.

Bu konuda blok sıkıştırmanın nasıl çalıştığı ve WIC ve Direct2D'de nasıl kullanılacağı açıklanmaktadır.

Blok Sıkıştırma hakkında

Blok Sıkıştırma (BC), doku boyutlarını küçültmeye yönelik bir sıkıştırma teknikleri sınıfını ifade eder. Direct3D 11, özellik düzeyine bağlı olarak en fazla 7 farklı BC biçimi destekler. Windows 8.1'de Direct2D, tüm özellik düzeylerinde kullanılabilen BC1, BC2 ve BC3 biçimleri için destek sağlar.

Blok Sıkıştırma nasıl çalışır?

Blok sıkıştırılmış biçimlerinin tümü, renk verileri tarafından kullanılan alanı azaltmak için aynı temel tekniği kullanır. Bu bölümde en basit algoritma olan BC1 özetlemektedir. Daha ayrıntılı bir açıklama için bkz. Sıkıştırmayı Engelleme.

İlk olarak, görüntü 4 x 4 piksellik bloklara ayrılır. Her blok ayrı ayrı sıkıştırılır.

Not

Bu, bloğun sıkıştırılması için görüntünün genişliğinin ve yüksekliğinin her birinin 4 pikselin katı olması gerektiği anlamına gelir.

 

Bu örnek görüntüde, bir görüntü içinde 4x4 piksellik bir blok gösterilmektedir.

bir görüntüde 4x4 piksellik bir blok gösterilir.

Ardından, 4'e 4 blok içinde iki "başvuru" rengi seçilir ve iki 16 bit değer olarak kodlanır (5 bit kırmızı, 6 bit yeşil, 5 bit mavi). Bu renklerin seçimi görüntü kalitesini önemli ölçüde etkiler ve önemsizdir. RGB renk alanında iki başvuru rengi arasında doğrusal ilişkilendirme yaparak iki ara renk hesaplanır. Bu toplam 4 farklı olası renk üretir; her renge iki bit dizin değeri atanır. Ancak, ilişkilendirme sabit olduğundan yalnızca iki uç nokta renginin depolanması gerektiğini unutmayın.

Bu şekilde, 0 ve 3 renkleri blok için "başvuru" renkleri olarak seçilirken, 1 ve 2 renkleri doğrusal ilişkilendirme kullanılarak hesaplanır.

Bloğu temsil eden 4 renk değeri hesaplamasını gösteren diyagram.

Son olarak, bloktaki her piksel önceden hesaplanmış dört renkten birine eşlenir ve her piksel iki bit dizin değeri kullanılarak kodlanır.

Bu 16 pikseli temsil etmek için kullanılan toplam veri miktarı:

16 bits [to define a reference color] * 2 + 2 bits * 16 [number of pixels] = 64 bits

Bu, piksel başına ortalama 4 bit yoğunluğuna neden olur. Karşılaştırma için yaygın DXGI_FORMAT_B8G8R8A8_UNORM piksel biçimi piksel başına 32 bit tüketir.

Bu diyagram, her pikselin 2 bit dizin olarak kodlandığını gösterir. Bloğun tamamı 64 bit olarak kodlanmıştır.

bloğu temsil etmek için 4 renk değeri hesaplama.

Alfa verilerini ve çeşitli renk kanallarını desteklemeye yönelik çeşitlemeler vardır. BC6H ve BC7, sırasıyla yüksek dinamik aralık (HDR) içeriğini desteklemek ve görüntü kalitesini artırmak için önemli ölçüde farklı algoritmalar kullanır.

DirectDraw Surface (DDS) dosya biçimi

Blok sıkıştırılmış verileri genellikle DirectDraw Surface (DDS) dosyalarında depolanır. Direct3D geliştiricisiyseniz DDS dosyaları hakkında bilgi sahibi olabilirsiniz. Direct2D'nin yalnızca belirli DDS özelliklerini desteklediğini unutmayın; daha fazla bilgi için bkz. DDS Gereksinimleri.

Blok sıkıştırmanın avantajları

Blok sıkıştırılmış biçimleri, BC biçimlerinin modern GPU'lar tarafından yerel olarak desteklendiği için JPEG gibi yaygın sektör görüntüsü sıkıştırma biçimlerinden farklıdır. Bu, blok sıkıştırılmış bir görüntüyü herhangi bir kod çözme veya sıkıştırmayı açmadan doğrudan GPU'ya yükleyebileceğiniz anlamına gelir. BC biçimleri ortalama olarak piksel başına 4 ila 8 bit tüketir; piksel başına sıkıştırılmamış tipik bir 32 bit BGRA bit eşlem ile karşılaştırıldığında bu, 75% ile 87,5%bellek tasarrufu sağlar. Ayrıca, kod çözme adımı olmadığından, BC görüntüsünü yükleme süresi JPEG gibi biçimlerle karşılaştırıldığında önemli ölçüde azalır.

Blok Sıkıştırma ne zaman kullanılır?

Bit eşlemlerin bellek tüketimini azaltmak veya kod çözme ve yükleme sürelerini azaltmak istiyorsanız, uygulamanızda JPEG gibi diğer biçimler yerine blok sıkıştırılmış görüntüleri kullanmayı düşünmelisiniz.

Ancak, blok sıkıştırması tüm durumlar için uygun değildir ve bazı dezavantajlar gerektirir. İlk olarak, blok sıkıştırma algoritmaları kayıplı. Blok sıkıştırma doğal fotoğraf içeriğiyle iyi çalışır, ancak bilgisayar tarafından oluşturulan ekran görüntüleri gibi keskin, yüksek karşıtlık sınırlarına sahip görüntülere istenmeyen görsel yapıtlar ekleyebilir. Blok sıkıştırılmış görüntü varlıklarınızı kullanmadan önce kabul edilebilir görüntü kalitesine sahip olduğundan emin olmalısınız.

İkincisi, blok sıkıştırılmış DDS dosyaları genellikle diskte karşılaştırılabilir JPEG görüntülerine göre daha fazla alan tüketir. Bu da uygulamanızın paket boyutunu ve ağ bant genişliği gereksinimlerini artırır.

Blok Sıkıştırmayı Kullanma

Bu bölümde, Direct2D uygulamasında blok sıkıştırılmış varlıkların nasıl oluşturulacağı ve kullanılacağı açıklanmaktadır.

Genel bakış

Blok sıkıştırılmış DDS dosyaları çalışma zamanı için iyileştirilmiş bir biçimdir, yani uygulama çalışma zamanında iyi performans için özel olarak iyileştirilmiştir. Mevcut varlık oluşturma ve düzenleme işlem hattınızı kullanmaya devam edip bunları yalnızca uygulama projenize veya derleme zamanında içeri aktardığınızda blok sıkıştırılmış biçimine dönüştürmenizi öneririz.

DDS gereksinimleri

DDS dosya biçimi, Direct3D'de kullanılan çok çeşitli özellikleri destekleyecek şekilde tasarlanmıştır. Direct2D bu özelliklerin yalnızca bir alt kümesini kullanır. Bu nedenle, Direct2D ile kullanmak üzere DDS görüntüleri oluştururken aşağıdaki kısıtlamaları göz önünde bulundurmanız gerekir:

  • Yalnızca aşağıdaki DXGI_FORMAT değerlerine izin verilir:
    • DXGI_FORMAT_BC1_UNORM
    • DXGI_FORMAT_BC2_UNORM
    • DXGI_FORMAT_BC3_UNORM
  • Önceden yüklenmiş alfa verileri kullanılmalıdır. Bu, önceden yüklenmiş alfayı (DXT1, DXT2, DXT4) açıkça tanımlayan biçimleri kullanan eski DDS dosyalarının yanı sıra DDS_ALPHA_MODE_OPAQUE ve DDS_ALPHA_MODE_PREMULTIPLIED değerleriyle DDS_HEADER_DX10 yapısını kullanan DDS dosyalarını içerir.
  • X ve Y boyutları 4 pikselin katları olmalıdır.
  • Birim dokularına, küp haritalarına, mipmap'lere veya doku dizilerine izin verilmez. Yalnızca tek çerçeve kaynak görüntüleri kullanmanız gerekir.

Blok Sıkıştırılmış varlıkları oluşturma

Blok sıkıştırılmış DDS dosyalarını oluşturmak veya dönüştürmek için kullanılabilecek çeşitli DDS yazma araçları vardır. Önceki bölümde açıklandığı gibi tüm araçların Direct2D ile DDS dosyalarını kullanma gereksinimlerini desteklemediğini unutmayın.

Visual Studio 2013'le başlayarak, Visual Studio'nun JPEG ve PNG gibi mevcut görsel varlıklarını derleme işleminizin otomatik bir parçası olarak doğru DDS bloğu sıkıştırılmış biçimine dönüştürmesini sağlayabilirsiniz. Bu, Görüntü İçeriği Görevi özel derleme adımı kullanılarak gerçekleştirilir.

Bunu projeniz için ayarlama hakkında bilgi için bkz. : Nasıl yapılır: Direct2D veya Javascipt Uygulamalarıile Kullanılacak Dokuyu Dışarı Aktarma.

Direct2D API'leri

Direct2D, Windows 8.1'de aşağıdaki piksel biçimlerini destekleyecek şekilde güncelleştirilir:

  • DXGI_FORMAT_BC1_UNORM
  • DXGI_FORMAT_BC2_UNORM
  • DXGI_FORMAT_BC3_UNORM

Önceki biçimler için önceden yüklenmiş alfa kullanmanız gerekir. Buna ek olarak, bu biçimler hedef olarak değil yalnızca kaynak olarak kullanım için geçerlidir. Örneğin, bu, BC1 kullanarak bir Direct2D bit eşlem oluşturabileceğiniz ancak cihaz bağlamı oluşturabileceğiniz anlamına gelir.

Aşağıdaki yöntemler, İBH biçimlerini desteklemek için Windows 8.1'de güncelleştirilir:

CreateBitmapFromWicBitmapIWICBitmapSource arabirim olarak aldığını unutmayın; ancak Windows 8.1'de WIC, IWICBitmapSource'dan blok sıkıştırılmış verileri almayı desteklemez ve DXGI_FORMAT_BC1_UNORM vb.'ye karşılık gelen WIC piksel biçimi yoktur. Bunun yerine CreateBitmapFromWicBitmapIWICBitmapSource geçerli bir DDS IWICBitmapFrameDecode olup olmadığını belirler ve blok sıkıştırılmış verilerini doğrudan yükler. D2D1_BITMAP_PROPERTIES1 yapısında piksel biçimini açıkça belirtebilir veya Direct2D'nin doğru biçimi otomatik olarak belirlemesine izin vekleyebilirsiniz.

Windows Imaging Bileşeni API'leri

Windows Görüntüleme Bileşeni (WIC), Windows 8.1'de yeni bir DDS codec bileşeni ekler. Ayrıca, blok sıkıştırılmış piksel verileri de dahil olmak üzere DDS'ye özgü verilere erişimi destekleyen yeni arabirimler ekler:

Sıkıştırılmış WIC piksel biçimlerini engelleme

Windows 8.1'de yeni WIC bloğu sıkıştırılmış piksel biçimi yoktur. Bunun yerine, DDS kod çözücüden bir IWICBitmapFrameDecode alır ve CopyPixelsçağırırsanız, WICPixelFormat32bppPBGRA gibi standart sıkıştırılmamış pikseller alırsınız. IWICDdsFrameDecode::CopyBlocks kullanarak bir DDS dosyasından bellek arabelleği biçiminde ham blok sıkıştırılmış verileri alabilirsiniz.

Çok çerçeveli DDS erişimi

DDS dosya biçimi, birden çok ilgili görüntünün tek bir dosyada depolanmasını sağlar. Örneğin, bir DDS dosyası bir küp haritası, birim dokusu veya doku dizisi içerebilir ve bunların tümü yanlış eşlenebilir. Direct3D'de bu birden çok görüntü alt kaynak olarak kullanıma sunulur. WIC'de birden çok görüntü çerçeve olarak sunulur (IWICBitmapFrameDecode ve IWICBitmapFrameEncode).

WIC yalnızca tek boyutlu bir çerçeve dizisinin, DDS ise üç bağımsız boyutu destekler (ancak tek bir dosyada yalnızca iki tane kullanılabilir). WIC, DDS alt kaynağı ile WIC çerçevesi arasında eşlemeye yardımcı olmak için kolaylık yöntemleri sağlar. Kodu çözmek için IWICDdsDecoder::GetFrame, alt kaynağın dizi dizinini, mip düzeyini ve dilim dizinini belirtmenize olanak tanır ve doğru WIC çerçevesini döndürür.

Kodlama için IWICDdsEncoder::CreateNewFrame, yeni bir çerçeve oluşturduğunuzda sonuçta elde edilen dizi dizinini, mip düzeyini ve dilim dizinini hesaplar. DDS'ye özgü dosya parametrelerini tanımlamak için önce IWICDdsEncoder::SetParameters çağırmış olmanız gerekir.

Nasıl yapılır: Direct2D veya Javascipt Uygulamaları ile Kullanmak için Doku Dışarı Aktarma

DDS için Başvurusu

Blok Sıkıştırma