Tuval ve Etiketler - sayfa 6

 

Doğrudan çalışma tablosunda kontrol etmek daha iyiyken, neden strateji test cihazında (ve hatta görsel gecikmeli görüntülemenin özel bir versiyonunda) grafik yapıları test edin?

Aynı zamanda, robotlarında görsel olmayan bir test cihazında grafik yapıları kapatmayı düşünmeyenleri tebrik ediyorum.

 

Nikolai haklı - etiket özelliklerini düzenlemenin etiket oluşturma ile hiçbir ilgisi yok.

Etiket, grafikteki diğer herhangi bir nesne gibi, MQL5 programının çalışmasından bağımsız olarak tamamen farklı bir iş parçacığında çizilir. Robot sadece çizelgenin tekrar çizilmeye zorlanmasını isteyebilir, ancak çizim süresini ölçemez. Nesnelerle bir grafik çizmek tamamen eşzamansızdır.

Ancak, doğrudan robot iş parçacığında yapıldığından tuvalde çizimin ölçülmesi kolaydır ve ardından grafiğin bağımsız çizimi sırasında, bitmiş bitmap'in yerel BitBlit'ini pencere bağlamına dönüştürmek kalır. Bu işlem temeldir ve video kartı tarafından iyi hızlandırılır.

Metin etiketlerinde TTF yazı tiplerinde SetFont/TextOut oldukça pahalıdır.
 
Mihail Matkovskij :

Bu ölçüme göre 321 kez çıkıyor.

Bu rakam sadece bu ölçüme güvenilemeyeceğini söylüyor.
Bu deneyimli bir programcı için açıktır.
Karakterleri piksel piksel oluşumları dışında grafik ekranda göstermenin başka bir yolu olduğunu gerçekten düşünüyor musunuz? ESok günleri çoktan gitti.
 
Renat Fatkhullin :

Doğrudan çalışma tablosunda kontrol etmek daha iyiyken, neden strateji test cihazında (ve hatta görsel gecikmeli görüntülemenin özel bir versiyonunda) grafik yapıları test edin?

Aynı zamanda, robotlarında görsel olmayan bir test cihazında grafik yapıları kapatmayı düşünmeyenleri tebrik ediyorum.

Grafiği de kontrol edebilirsiniz. Ancak, bunu test cihazında yapmanın daha kolay olacağını düşündüm. Ayrıca yukarıda bahsettiğim bir durumla karşı karşıya kaldım, gösterim CCanvas bazında yapıldığında ve bu EA'nın test cihazındaki işini çok yavaşlattı. Bu özellikle keneler için geçerliydi. Bir çizelgede bunu göstermek için metnin çıktısının bir döngü içinde yapılması gerekir. Yani, şu anda üzerinde çalıştığım çevrimdışı optimizasyon ile EA'mda yapıldığı gibi daha yüksek bir güncelleme sıklığı yapmak için. Ve bunun için etiket tabanlı bir gösterim yapmaya karar verdim çünkü Canvas işleri yavaşlatacaktı. Fark ettiğiniz gibi, etiket farklı bir iş parçacığında çizildiğinden, benim döngümde gerçekleştirilen uzmanın özerk optimizasyonunu yavaşlatmaz.

Görünen o ki, dediğiniz gibi, etiketlerde metin oluşturmak OBJ_BITMAP_LABEL oluşturmaktan daha fazla zaman alıyor. Daha sonra hız kazanması için render işleminin de ayrı bir iş parçacığında yapılması gerekir. Ama nasıl? yapılamazsa   daha sonra, uygulamanın bakış açısından, şunun kullanıldığı ortaya çıkıyor.   OBJ_LABEL , OBJ_BITMAP_LABEL'den daha mı hızlı?...

 
Nikolai Semko :
Bu deneyimli bir programcı için açıktır.

Bu, ayrıntılı olarak çalışmış veya bilgili deneyimli bir programcı için açıktır.   terminalin iyice çalışması! Ve bir terminal geliştiricisi olmadığım ve yalnızca bunun için uygulamalar yazdığım için, çoğu programcı gibi MQL belgelerinde neyin bulunmadığını bilemeyebilirim.

 
Mihail Matkovskij :

Bu, ayrıntılı olarak çalışmış veya bilgili deneyimli bir programcı için açıktır.   terminalin iyice çalışması! Ve bir terminal geliştiricisi olmadığım ve yalnızca bunun için uygulamalar yazdığım için, çoğu programcı gibi MQL belgelerinde neyin olmadığını bilemeyebilirim.

Yine de, sadece geliştiriciyle değil, MQ şirketinin yöneticisiyle de tartışmaya çalışıyorsunuz.

 
Alexey Viktorov :

Yine de, sadece geliştiriciyle değil, MQ şirketinin yöneticisiyle de tartışmaya çalışıyorsunuz.

Tartışmaya çalışmıyorum, ancak onu kullanan uygulama açısından OBJ_BITMAP_LABEL'in OBJ_LABEL'den daha ucuz hale getirilip getirilemeyeceğini görmek için!

 
Mihail Matkovskij :

Ve Canvas işleri yavaşlatacağından, bunun için etiketlere dayalı bir teşhir yapmaya karar verdim.

Tuvalinin neden yavaşladığını neredeyse eminim.
Çünkü 30 milisaniyelik bir kareye birkaç kare koymaya çalıştınız.
Gerçek şu ki, kareler hala saniyede yaklaşık 30 kareden daha sık yeniden çizilmiyor (ChartRedraw).

Burada söylediğim gibi, text canvas ile Label arasındaki fark, etiketler durumunda piksel dizisinin doldurulmasının asenkron olarak gerçekleşmesi ve sizin tarafınızdan kontrol edilmemesi, dolayısıyla etiketler durumunda piksel dizisinin doldurulmasının yapılmamasıdır. Her yaklaşık 30 milisaniyede bir defadan daha sık meydana gelir.
Ve tuval durumunda, bu olabilir, çünkü bu işlem (bitmap'i doldurma) eşzamansız değildir. Ve bitmap'i 30 milisaniyede on kez doldurabilirsiniz ve yalnızca bir kez ve çalışma boştayken 9 kez görüntülenecektir.
Bu nedenle, Tuval konusunda daha önce tartışıldığı gibi - harika! , programcının BitMap'i doldurmanın başlangıç zamanını kontrol etmesi gerekir.
Davranış modeli şunlar olabilir:

  • bitmap oluşturan bir işlev var
  • bu fonksiyonun girişinde, görüntü oluşumunun başlama zamanı, milisaniye cinsinden statik bir değişkende saklanır.
  • Bu fonksiyona bir sonraki girdiğinizde, son Bitmap oluşumunun başlamasından bu yana 30 milisaniyeden daha az süre geçip geçmediğini kontrol etmeniz gerekir. Evet ise, çıkar ve false döndürürüz, değilse, yeni bir Bitmap doldurmaya ve görüntülemeye devam ederiz.
tuvalin oluşumuna izin vererek veya yasaklayarak, sınıfa bir bool değişkeni eklemek elbette daha uygundur.
 
Nikolai Semko :

Tuvalinin neden yavaşladığını neredeyse eminim.
Çünkü 30 milisaniyelik bir kareye birkaç kare koymaya çalıştınız.
Gerçek şu ki, kareler hala saniyede yaklaşık 30 kareden daha sık yeniden çizilmiyor (ChartRedraw).

Burada söylediğim gibi, text canvas ile Label arasındaki fark, etiketler durumunda piksel dizisinin doldurulmasının asenkron olarak gerçekleşmesi ve sizin tarafınızdan kontrol edilmemesi, dolayısıyla etiketler durumunda piksel dizisinin doldurulmasının yapılmamasıdır. Her yaklaşık 30 milisaniyede bir defadan daha sık meydana gelir.
Ve tuval durumunda, bu olabilir, çünkü bu işlem (bitmap'i doldurma) eşzamansız değildir. Ve bitmap'i 30 milisaniyede on kez doldurabilirsiniz ve yalnızca bir kez ve çalışma boştayken 9 kez görüntülenecektir.
Bu nedenle, Tuval konusunda zaten tartışıldığı gibi - harika! , programcının BitMap'in dolum süresini kontrol etmesi gerekir.
Davranış modeli şunlar olabilir:

  • bitmap oluşturan bir işlev var
  • bu fonksiyonun girişinde, görüntü oluşumunun başlama zamanı, milisaniye cinsinden statik bir değişkende saklanır.
  • Bu fonksiyona bir sonraki girdiğinizde, son Bitmap oluşumunun başlamasından bu yana 30 milisaniyeden daha az süre geçip geçmediğini kontrol etmeniz gerekir. Evetse, çıkın ve false döndürün, değilse, yeni bir Bitmap doldurmaya ve görüntülemeye devam edin.
belki de, tuvalin oluşumuna izin veren sınıfa bir değişken eklemek daha iyidir.

Bu konuda daha fazla okuyabileceğim herhangi bir bilgi var mı? Her şeyi anlamama rağmen, konu yine de oldukça ilginç! Şimdi, bitmap güncellemeleri üzerinde kontrole sahip bir varyant yapmak ve test etmek için kalır. Bitmap etiketlerden daha hızlıysa şaşırırım.

 

İşte neden bahsettiğimi gösteren bir örnek. Buradaki betiğin temelini belgelerden aldım.
Burada, başlangıçta, her biri 100 satır olmak üzere 100 kez çıktı almak için rastgele bir dizi oluşturulur ve 100 Etiket oluşturulur.
İlk olarak, Etiketli 100 kare görüntülenir.
Ardından kanvas çizgilerle 100 kare.
Tuval bir.
Uyku döngüsü belgelenmiştir. Döngüde Sleep(0) varsa, tamamen farklı bir resim olacaktır. Deneme yapabilirsiniz.
Tüm çerçeveler ve çizgiler kontrol için numaralandırılmıştır.
Bir video kaydettim ve 30 kez yavaşlattım. Bundan, etiketler için 100'den sadece iki karenin gerçekten görüntülendiği görülebilir ve ikinci karede etiketlerin farklı karelerden, yani. asenkron çalışması görülebilir.

yani Label için şu değerler sahte:

Kanvas, 100 kareden 60-70 civarında bir yerde görüntülendi. Bunun nedeni, çerçevenin 30 milisaniyeden biraz daha hızlı oluşturulması ve bu nedenle, tümü oluşturulmuş olmasına rağmen, tüm karelerin görüntülenmesi için zaman olmamasıdır.
En iyi iki seçenekle deneme yapın

ve döngülerde bir gecikme ile.


Çıkış satırı sayısını artırırsanız 4001 hatasını yakalayabilirsiniz. Bu, çok fazla nesne olduğunda bir MQ hatasıdır.

Dosyalar:
Neden: