Canvas üzerinde bir kitle kaynaklı proje yapma - sayfa 19

 

.

İşte yayınlamaya söz verdiğim video. Görüntü kalitesi düşük ancak tepki gecikmelerini görmenizi engellemiyor.

Aslında terminaldeki gecikme daha azdır. Kayıt programı açıkken her şey iki kat daha yavaş gerçekleşir. İşlemci ayrıca önemli ölçüde daha fazla yüklenir.

Bu nedenle, bu videodan reaksiyon hızı hakkında tamamen objektif bir fikir elde etmek imkansızdır, ancak pencere güncelleme hızı ile boyutu arasındaki kalıp açıkça görülmektedir.

(Bu yüzden farklı boyutlarda birkaç pencere yaptım.)

Bana öyle geliyor ki, görüntü reaksiyonunun engellenmesinin nedenini tam olarak anladım. Buradaki nokta, ColorToARGB () işlevinin sabitçağrısıdır . Her olayda ve her pikselde bu işlevi çağırırım. Renkleri bir kez hesaplayıp sonra hazır kullanmak yerine sürekli yeniden hesaplıyorum.

Bence mesele bu.

Not Tüm pencerelerin toplam nesne sayısının 35 olduğunu eklemeyi unuttum.

 
Реter Konow :

.

İşte yayınlamaya söz verdiğim video. Görüntü kalitesi düşük ancak tepki gecikmelerini görmenizi engellemiyor.

Aslında terminaldeki gecikme daha azdır. Kayıt programı açıkken her şey iki kat daha yavaş gerçekleşir. İşlemci ayrıca önemli ölçüde daha fazla yüklenir.

Bu nedenle, bu videodan reaksiyon hızı hakkında tamamen objektif bir fikir elde etmek imkansızdır, ancak pencere güncelleme hızı ile boyutu arasındaki kalıp açıkça görülmektedir.

(Bu yüzden farklı boyutlarda birkaç pencere yaptım.)

Bana öyle geliyor ki, görüntü reaksiyonunun engellenmesinin nedenini tam olarak anladım. Buradaki nokta, ColorToARGB () işlevinin sabitçağrısıdır . Her olayda ve her pikselde bu işlevi çağırırım. Renkleri bir kez hesaplayıp sonra hazır kullanmak yerine sürekli yeniden hesaplıyorum.

Bence mesele bu.

Not Tüm pencerelerin toplam nesne sayısının 35 olduğunu eklemeyi unuttum.

Kaynağına bakmanız mümkün mü? Ben kendim için, deneyim için.
 
Vladimir Pastushak :
Kaynağına bakmanız mümkün mü? Ben kendim için, deneyim için.
Evet, bu sayfada tüm bu pencereleri birlikte çizen bir fonksiyon bloğu yayınladım. https://www.mql5.com/ru/forum/92113/page16
Делаем краудсорсовый проект по Canvas
Делаем краудсорсовый проект по Canvas
  • www.mql5.com
Приветстсвую кодеров. Есть интересная задача сделать действительно что-то полезное, и думаю что краудсорс будет хорошим вариантом...
 
Reaksiyon gecikmesi sorunu çözüldü. Çözüm şuydu:

Görüntü bir kez oluşturulur. Görüntü çok sayıda ayrıntıdan oluştuğundan ve her ayrıntının çizilmesi, her biri ayrıntıda dolanan ve içindeki değerleri başlatan çizim işlevlerine bir çağrı olduğundan, çizim ilk kez en fazla zaman alır. sıralamak.

Sorunun ne olduğunu açıklayayım:

Geçmişte, bir görüntünün ayrıntılarını boyarken, görüntünün tüm alanı üzerinde döngü yapardım ve gecikmeyi yaratan da bu. 500 * 500 piksellik bir pencere alanıyla, her yeniden çizimde yaklaşık 300 görüntü detayını yeniden çizmek gerekiyordu ve bu ortaya çıktı: (500 × 500 × 300 × çizim fonksiyonu sayısı) her yeniden çizimde döngülerde yinelemeler. Bu, ortaya çıktığı gibi, bir bilgisayarda bile zaman alıyor.
Çözüm şuydu: yeniden çizilmesi için görüntü içinde belirli bir ayrıntı gerektiren her olayda görüntüyü yeniden çizmek yerine, görüntüyü bir kez çiziyorum ve sonraki yeniden çizimlerde onu ResourceReadImage() kullanarak bir diziye döndürüyorum.

Daha sonra, tüm görüntünün üzerinde bir döngü yapmadan detayı yeniden çiziyorum, ancak görüntü detayına göre dizideki görüntü detayının piksellerinin konumunu özel olarak hesaplıyorum. formül ve yalnızca yeniden çizin. Böylece gereksiz yineleme yapılmaz. Ayrıca çizim fonksiyonlarını tek bir fonksiyonda birleştirdim, bu da mekanizmayı daha verimli hale getirdi.





 
OpenCL ile tuval oluşturmayı hızlandırmak mümkün mü?
 
Timur Gatin :
OpenCL ile tuval oluşturmayı hızlandırmak mümkün mü?


Evet. OCL, işlemeyi paralelleştirme yeteneğine + vektörler üzerinde çalışma yeteneğine sahiptir - bu, oluşturma/bindirme sürecini hızlandırır.

Mathemat'ın makalesinde vektörleri kullanma hakkında daha fazla bilgi https://www.mql5.com/ru/articles/407

OpenCL: от наивного кодирования - к более осмысленному
OpenCL: от наивного кодирования - к более осмысленному
  • 2012.06.05
  • Sceptic Philozoff
  • www.mql5.com
В данной статье продемонстрированы некоторые возможности оптимизации, открывающиеся при хотя бы поверхностном учете особенностей "железа", на котором исполняется кернел. Полученные цифры весьма далеки от предельных, но даже они показывают, что при том наборе возможностей, который имеется здесь и сейчас (OpenCL API в реализации разработчиков терминала не позволяет контролировать некоторые важные для оптимизации параметры - - в частности, размер локальной группы), выигрыш в производительности в сравнении с исполнением хостовой программы очень существенен.
 
Igor Volodin :


Evet. OCL, işlemeyi paralelleştirme yeteneğine + vektörler üzerinde çalışma yeteneğine sahiptir - bu, oluşturma/bindirme sürecini hızlandırır.

Mathemat'ın makalesinde vektörleri kullanma hakkında daha fazla bilgi https://www.mql5.com/ru/articles/407

CCanvas'tan Erase()'in hızını ve OpenCl'de yapılan PixelSet() döngüsünü karşılaştırdınız mı? Teoride, iyi bir ivme ile, ara sonuçları ve diğer zorlukları önbelleğe almadan aptal çizim kodu oluşturabilirsiniz.

Bu arada katmanları bu formüle göre mi karıştırıyorsunuz?


 

Evet, her renk bileşeni için wikipedia'daki formül: Sonuç = Arka Plan + (Ön Plan - Arka Plan) * Alfa;

Ve bu arada, Sil ile, OCL'de bir pusu. Memset analogu yoktur (CUDA'nın aksine). Bu nedenle, şimdi ana bilgisayarda Erase yapmamız ve soyulmuş diziyi kesinlikle basit Erase'den daha hızlı olmayan CLBufferWrite aracılığıyla kopyalamamız gerekiyor.
Diziye 1 puan yazan iş birimleri için bir dizi görev yapmaya çalıştım, ancak hızı hatırlamıyorum - önceki yöntemden daha yavaş görünüyordu.

Ve OCL 1.2'de   Bunu yapan clEnqueueFillBuffer() => MQL sözdizimi CL Buffer Fill () olmalıdır   

Ancak bu sarmalayıcı uygulanmadı (sürüm 1.1 taşındığından beri).

 
Igor Volodin :

Evet, her renk bileşeni için wikipedia'daki formül: Sonuç = Arka Plan + (Ön Plan - Arka Plan) * Alfa;

Ve bu arada, Sil ile, OCL'de bir pusu. Memset analogu yoktur (CUDA'nın aksine). Bu nedenle, şimdi ana bilgisayarda Erase yapmamız ve soyulmuş diziyi kesinlikle basit Erase'den daha hızlı olmayan CLBufferWrite aracılığıyla kopyalamamız gerekiyor.
Diziye 1 puan yazan iş birimleri için bir dizi görev yapmaya çalıştım, ancak hızı hatırlamıyorum - önceki yöntemden daha yavaş görünüyordu.

Ve OCL 1.2'de   Bunu yapan clEnqueueFillBuffer() => MQL sözdizimi CL Buffer Fill () olmalıdır   

Ancak bu sarmalayıcı uygulanmadı (sürüm 1.1 taşındığından beri).

İngilizce wiki'de formül daha ilginç, iki yarı saydam katmanı karıştırabilirsiniz. Bu, yarı saydam bir arayüz ve diğer güzelliklerle yapılabilir.
 
Timur Gatin :
İngilizce wiki'de formül daha ilginç, iki yarı saydam katmanı karıştırabilirsiniz. Bu, yarı saydam bir arayüz ve diğer güzelliklerle yapılabilir.

Ve bu benim durumumda gerekli değildi, her şey doğru bir şekilde karışıyor. Alt tabakanın içinden geçtiği B tabakası olsa bile, A katmanının altındaki her şey bir alt tabaka olarak kabul edilebilir.
Neden: