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

 
Алексей Барбашин :

Aynen öyle kurdum. Prensip olarak, standart kitaplığı temel aldım, çünkü olay iletimi anları ve diğer bazı noktalar içinde çok iyi işlendi. Anatoly, her farklı öğe sınıfı için bir gruplama oluştururken, standart olanda her şey tek bir temel nesneye indirgenir.

...

Nikolai örneklerinde prensipte yerel alan verilerini depolamakla uğraşmamanız gerektiğini gösteriyor, çünkü tüm tuvali yeniden çizmek o kadar hızlı çalışıyor ki aşağılara ve ayrıntılara gerek yok, her zaman her şeyi bir kerede yeniden çizmek yeterli.
O kadar basit değil. Hücrelerden birinin saniyede 20 kez değerini değiştirdiği büyük (tüm grafik için) bir tablo çizdiğinizi hayal edin. Tüm tuvali yeniden çizerseniz, işlemci yükü %40 veya daha fazla artacaktır. Tuval ile kesinlikle yanlış çalışma. Tek tek öğeleri yeniden çizmeniz gerekir, aksi takdirde tablolar, cam ve çeşitli yerel animasyonlar işlemciyi aşırı yükleyecek ve diğer işlevlerin (ortak bir iş parçacığındaysa) yürütülmesini yavaşlatacaktır.
 
Реter Konow :
O kadar basit değil. Hücrelerden birinin saniyede 20 kez değerini değiştirdiği büyük (tüm grafik için) bir tablo çizdiğinizi hayal edin. Tüm tuvali yeniden çizerseniz, işlemci yükü %40 veya daha fazla artacaktır. Tuval ile kesinlikle yanlış çalışma. Tek tek öğeleri yeniden çizmeniz gerekir, aksi takdirde tablolar, cam ve çeşitli yerel animasyonlar işlemciyi aşırı yükleyecek ve diğer işlevlerin (ortak bir iş parçacığındaysa) yürütülmesini yavaşlatacaktır.

Nikolai'nin şimdiye kadar yaptığı deneyler bunun tam tersini kanıtlıyor. Tuvalin tüm içeriğini tek geçişte yeniden çizer ve bu kodda açıkça görülebilir.

Ama yine de yerel değişikliklerin destekçisiyim. Ancak bu yaklaşımla ilgili henüz çözemediğim bazı zorluklar var.

 
Алексей Барбашин :

Nikolai'nin şimdiye kadar yaptığı deneyler bunun tam tersini kanıtlıyor. Tuvalin tüm içeriğini tek geçişte yeniden çizer ve bu kodda açıkça görülebilir.

Ama yine de yerel değişikliklerin destekçisiyim. Ancak bu yaklaşımla ilgili henüz çözemediğim bazı zorluklar var.

Nikolay'ı arkadaşım olarak görüyorum ve tuvalle çalışırken büyük başarılar elde etti, ancak yine de kontrollerle tam teşekküllü deneyler yapmadı. Özellikle masalar ve bir bardak ile. Her neyse, onları bilmiyorum.

Sonuç olarak şudur: Kanvas bir veri dizisidir. Değişiklik olaylarında veriler değiştirilir ve tekrar kaydedilir. Dizi, grafik uzayının tüm piksellerini içeriyorsa, boyutu = yükseklik* grafiğin genişliği . Dizi içindeki piksel değerlerinde lokal bir değişiklik varsa o zaman tüm dizi boyunca tam bir döngü yapıp tüm değerleri sıfırlamaya gerek yoktur. Değiştirilen alan üzerinden döngü yapmanız, değerleri ayarlamanız ve döngüden çıkmanız gerekir. Aksi takdirde, ne söylenirse söylensin, kaynak ve zaman kaybıdır.

Ve bu yaklaşımla ilgili birçok zorluk var. Ana şey, kendi tam teşekküllü nesnelerinizi yaratmak, onları tuvalinizde bulmak ve işlemek. Normal CCanvas bunun için uygun değildir. Öğelerinizi "görmeyecek" ve onlara onun aracılığıyla erişemeyeceksiniz. Böyle bir işlevsellik yoktur.

 
Реter Konow :

Nikolay'ı arkadaşım olarak görüyorum ve tuvalle çalışırken büyük başarılar elde etti, ancak yine de kontrollerle tam teşekküllü deneyler yapmadı. Özellikle masalar ve bir bardak ile. Her neyse, onları bilmiyorum.

Sonuç olarak şudur: Kanvas bir veri dizisidir. Değişiklik olaylarında veriler değiştirilir ve tekrar kaydedilir. Dizi, grafik uzayının tüm piksellerini içeriyorsa, boyutu = yükseklik* grafiğin genişliği . Dizi içindeki piksel değerlerinde lokal bir değişiklik varsa o zaman tüm dizi boyunca tam bir döngü yapıp tüm değerleri sıfırlamaya gerek yoktur. Değiştirilen alan üzerinden döngü yapmanız, değerleri ayarlamanız ve döngüden çıkmanız gerekir. Aksi takdirde, ne söylenirse söylensin, kaynak ve zaman kaybıdır.

Ve bu yaklaşımla ilgili birçok zorluk var. Ana şey, kendi tam teşekküllü nesnelerinizi yaratmak, onları tuvalinizde bulmak ve işlemek. Normal CCanvas bunun için uygun değildir. Öğelerinizi "görmeyecek" ve onlara onun aracılığıyla erişemeyeceksiniz. Böyle bir işlevsellik yoktur.

Bütün bunları çok iyi anlıyorum ve anlıyorum. Kendi nesne sınıflarımı oluşturdum ve hepsi harika çalışıyor.

 
Алексей Барбашин :

Bütün bunları çok iyi anlıyorum ve anlıyorum. Kendi nesne sınıflarımı oluşturdum ve hepsi harika çalışıyor.

Bu durumda, bir tablo oluşturarak ve onu iki şekilde güncelleyerek kontrol edebilirsiniz - yerel olarak (her hücre ayrı ayrı) ve tüm tablo bir kerede.

 

Nikolay'ın animasyonları genellikle düşük bir yenileme hızına sahiptir ve bu nedenle tüm tuvali aynı anda yeniden çizmek kaplamaya girmez. Ancak frekansı saniyede 5 katına çıkarırsanız, işlemci kaynaklarının tüketiminde bir artış görebilirsiniz. Tüm animasyonu yeniden çizmeniz gerekiyorsa - çıkış yolu yoktur, ancak içeride ayrı, küçük bir alan varsa - sadece daha iyidir.

Frekansın kendisi - saniyede 5 kez, değerlerin eşzamansız olarak değiştiği bir tabloda oluşabilir. Bu durum MT4'te kaynaklar aracılığıyla tabloyu test cihazına bağladığımda başıma geldi. Orada, 31 hızında, tüm parametreler o kadar hızlı değişiyor ki, tablonun yanlış yeniden çizilmesi, %50 veya daha fazla işlemci yüküne yol açtı. Öğelerin yerel olarak yeniden çizilmesi bile tamamen tasarruf etmedi. Değerlerin türetilme hızını yavaşlatma fikrini buldum. Değerlerin kendileri doğal bir oranda değişti, ancak hücrelerde birkaç kez daha az sıklıkta görüntülendi. Bu sorunu çözdü.

İşte bir örnek. 1000 hücre, değerleri 25ms'lik bir frekansta değiştirmelidir. Aslında hücreler yaklaşık olarak her 500 ms'de bir değer değiştirir ve işlemci yükü yaklaşık %50'dir. (Bu MT4'tür ve tablo çizilmiştir).

https://www.mql5.com/ru/forum/293630/page160


İşte bir test cihazı ile bir örnek. Tablo çizilir, ancak bu işlemciyi aşırı yüklenmeden kurtarmaz. :) (test cihazı hızı 31, hücre güncellemesi tamamlandı (çıktıları atlamadan)).

https://www.mql5.com/ru/forum/293630/page148

 
Реter Konow :
O kadar basit değil. Hücrelerden birinin saniyede 20 kez değerini değiştirdiği büyük (tüm grafik için) bir tablo çizdiğinizi hayal edin. Tüm tuvali yeniden çizerseniz, işlemci yükü %40 veya daha fazla artacaktır. Tuval ile kesinlikle yanlış çalışma. Tek tek öğeleri yeniden çizmeniz gerekir, aksi takdirde tablolar, cam ve çeşitli yerel animasyonlar işlemciyi aşırı yükleyecek ve diğer işlevlerin (ortak bir iş parçacığındaysa) yürütülmesini yavaşlatacaktır.

Bu sayıları nereden aldığını tam olarak anlamadım. Tamamen basit bir Nikolai örneğine bakın https://www.mql5.com/en/forum/227736/page44#comment_13445909. Grafik boyutundaki bir tuvalde, grafiğin etrafında (tuvalde) sürüklenebilecek birkaç nesne oluşturulur. Bu, tüm tuvali yeniden çizer. Fren yok.

Canvas - это круто!
Canvas - это круто!
  • 2019.09.20
  • www.mql5.com
Поставил себе задачу: коротким кодом эффектно продемонстрировать возможности пользовательской графики через класс CCanvas...
 
Алексей Барбашин :

Bu sayıları nereden aldığını tam olarak anlamadım. Tamamen basit bir Nikolay örneğine bakın https://www.mql5.com/en/forum/227736/page44#comment_13445909. Grafiğin boyutundaki bir tuvalde, grafiğin etrafında (tuval üzerinde) sürüklenebilen birkaç nesne oluşturulur. Bu, tüm tuvali yeniden çizer. Fren yok.

Yukarıdaki örneklere bakın.

GIF'lere bağlantılar eklendi.
 

Değerlerin hücrelere çıkışını yavaşlatmaya ve işlemci üzerindeki yükü azaltmaya bir örnek:


https://www.mql5.com/ru/forum/293630/page148

 
Алексей Барбашин :

Bu sayıları nereden aldığını tam olarak anlamadım. Tamamen basit bir Nikolay örneğine bakın https://www.mql5.com/en/forum/227736/page44#comment_13445909. Grafik boyutundaki bir tuvalde, grafiğin etrafında (tuvalde) sürüklenebilecek birkaç nesne oluşturulur. Bu, tüm tuvali yeniden çizer. Fren yok.

Bu örnekte, normal yenileme hızı. Yani yavaşlamıyor.