2008-09-11 13 views
4

DirectX 9'u saran ve 2B piksel düzeyi çizimini gerçekleştirmek için basitleştirilmiş bir arabirim sağlayan bir C# denetimi yazıyorum. .NET, bu kodu güvenli olmayan bir kod bloğuna sarmam ve güvenli olmayan kod seçeneğine izin ver ile derlememi gerektirir.Güvenli olmayan C# ve 2B oluşturma için işaretçiler iyi mi, kötü mü?

Tüm yüzeyi kilitledikten sonra kilitli bellek alanına bir işaretçi döndürüyor. Daha sonra "basit" işaret aritmetiğini kullanarak doğrudan piksel verileri yazabilirim. Performansı test ettim ve bildiğim diğer "güvenli" yöntemlere göre önemli bir hız artışı sağladım.

Bu, C# .NET uygulamasında tek tek pikselleri işlemek için en hızlı yol mu? Daha iyi, daha güvenli bir yol var mı? İşaretçi manipülasyon gerektirmeyen, eşit derecede hızlı bir yaklaşım varsa, bunu kullanmak benim tercihim olacaktır.

(ancak bu kontrol 2B piksel çiziminin için özel olarak kullanılacak ve sadece 3D render gerektirmez, ben bu 2008 olduğunu biliyorum ve hepimiz vb DirectX 3D, OpenGL kullanarak olmalıdır.)

cevap

4

C# doğrudan bellek manipülasyon yapmanın en hızlı yolu (kesinlikle daha hızlı Mareşal sarıcı işlevleri kullanmaktan daha) 'dir.

Sadece meraktan ne tür 2D çizim işlemleri yapmaya çalışıyorsunuz?

Eğer DirectX kullanarak kazanacakları umut ediyorum donanım hızlandırma faydaların en yenecek piksel seviyeli işlemlerini yapmak için bir DirectX yüzeyine kilitleme Soruyorum çünkü. Ayrıca, DirectX aygıtı terminal hizmetleri (uzak masaüstü) üzerinden kullanıldığında başlatılamayacaktır, bu nedenle kontrol bu senaryoda kullanılamaz olacaktır (bu sizin için önemli olmayabilir). Büyük üçgenler çizim ve görüntüleri (a dörtlü üzerine eşleştirilmiş doku) dönüştürürken

DirectX büyük bir kazançtır olacak, ama gerçekten tek piksel manipülasyon ile bu büyük gerçekleştirmez.

.NET arazisinde kalmanın bir alternatifi, bir Bitmap nesnesinin yüzeyiniz olarak hareket etmesi, LockBits kullanımı ve döndürülmüş BitmapData nesnesindeki güvenli olmayan işaretçi aracılığıyla doğrudan piksellere erişmesidir.

1

I son zamanlarda, ince istemci uygulamalarımızdan (C#) biri için basit bir histogram kontrolü oluşturmakla görevlendirildi. İncelediğim görüntüler 1200x1200 civarındaydı ve aynı rotaya gitmem gerekiyordu. Bir şeyi problemsiz bir şekilde bir kez çizebilirim, ancak kontrolün yeniden boyutlandırılması gerekiyordu. Bunu engellemeye çalıştım ama ham belleğe kendim gelmeliydim.

Ben standart .NET sınıfları kullanarak imkansız demiyorum, ama çok sonunda işe alamadı. güvensiz işaretçiler kullanarak

2

Evet, bu muhtemelen en hızlı yoldur.

Birkaç yıl önce iki 1024x1024 resmi piksel seviyesinde karşılaştırmak zorunda kaldım; get-piksel yöntemleri 2 dakika sürdü ve güvensiz tarama 0.01 saniye sürdü.

3

Ayrıca bu tür şeyleri hızlandırmak için güvensiz kullanıyorum. Performans iyileştirmeleri, en az söylemek için dramatik. Buradaki nokta, güvensizliğin, ne yaptığınızı bildiğiniz sürece ihtiyacınız olmayan bir sürü şeyi kapattığıdır. Ayrıca, DirectDraw numaralı telefonu da inceleyebilirsiniz. DirectX'in 2D grafik bileşenidir. Bu gerçekten hızlı.

İlgili konular