MQL ile yazılmış kullanıcı arayüzleri galerisi - sayfa 54

 
Bir sorun var, Peter.
Bir saniyelik bir gecikme yasaklayıcı bir gecikmedir. Tüm pencere için en zor arayüzün oluşumu 50 milisaniyeyi geçmemelidir.
Gerçekten de render mantığı Güncelleme fonksiyonları (aslında ChartRedraw) ile aşırı yüklenmiş gibi görünüyor.
Bu varsayımı kontrol etmek için CCanvas sınıfındaki Update fonksiyonuna statik bir sayaç koyun (eğer kullanıyorsanız) ve örneğin count%100 == 0 olduğunda bu sayacı yazdırın.
 

Ayrıca her değişiklikte tamamen yeniden çizilen tam ekran bir tuvalim var, ancak 50 ms'den fazla sürmüyor....

En pahalı olanı metin çizmektir. Bu nedenle her seferinde TextOut kullanmamak için onları dizilerde saklıyorum. Çok daha hızlı oluyor.

 

Şimdi asıl zorluk kullanıcıya arayüz kontrolleri üzerinde programatik kontrol sağlamaktır.

Teknik olarak bu görev zor değildir, çünkü kullanıcı programı ve motorun simbiyotik birlikteliğinde, grafik çekirdek her iki tarafın algoritmaları tarafından global düzeyde görülebilir. Sorun, kullanıcının çekirdekle nasıl çalışacağını bilmemesidir. Eleman yönetimi ilkelerini bilmiyor ve anlamıyor. Bu nedenle, çekirdeğe erişebileceği ve değerleri değiştirebileceği tanıdık sarmalayıcılar - işlevler vermek gerekir.

Ancak bir nüans var. Fonksiyonların isimleri çok uzun. Sonuçta, etkileşimli bir öğenin her bir işlevsel sargısı, öğenin ve pencerenin adlarını içermelidir. Bu, isimler arasında yönlendirme için gereklidir. Aksi takdirde, kullanıcının kafası kolayca karışacak ve işlev sarmalayıcılarını anlamayacaktır. Ayrıca, isimler çakışabilir ve bu hiç de iyi değildir. Böylece ortaya çıkıyor - iki bileşenden isimler oluşturmanız gerekiyor: öğenin adı ve pencerenin adı. O zaman karışıklık olmaz, ancak sarmalayıcıların adları çok uzun olur. Özellikle de geçirilen parametreler tarafında. Ek olarak, intellisense aracılığıyla hızlı bir şekilde bulmak için işlevlere ön ekler eklemeniz gerekir. Bu, açılır örneğin verimli bir şekilde filtrelenmesini sağlar. Kullanışlı. AMA UZUN!

Sadece bu da değil. Sorun, geçirilen parametrelerdir. Seçim, ya öğelerin ve pencerelerin her ön ayarlı get/set-properties için sarmalayıcılar yazmak ya da her sarmalayıcının bir kullanıcı çağrısından gelen parametrelerin tam listesini kabul etmesidir. Bu son derece elverişsizdir. Ve en önemlisi, açıklaması zordur.


Bir çıkış yolu var ve çok basit. Ve işte bu: bir grup soyut özellik. Kullanıcının programı ve motor tarafından aynı anda görülebilen global değişkenler.

Nasıl çalışacak:

1. Tüm öğe ve pencere sarmalayıcıları merkezi fonksiyonu adresleyecek ve indekslerini iletecektir. Merkezi fonksiyon bunları çağrının hedef elemanını/penceresini belirlemek için kullanacaktır.

2. Bu çağrıdan sonra, kullanıcı seçilen soyut özellikler kümesini gerekli değerlere ayarlayacaktır.

3. Merkezi fonksiyonu çağırın ve c.word "Set "i iletin.

4. Central, soyut özelliklerin değerlerini global değişkenlerinden belirli eleman veya pencerenin hedef özelliklerine ayarlayacaktır.

5. Elemanı/pencereyi güncelleyecek ve soyut özellikleri sıfırlayacaktır.

İşte bu kadar.

Bence, aşağıdakileri sağlayacak basit ve etkili bir çözüm:

a) Sıkı tutarlılık gerektiren bir işleve parametre aktarmadan herhangi bir öğenin ve pencerenin özelliklerine kolay erişim. (Artı - geçirilen parametre sayısında sınırlama. Ve çağrı uzun ve okunamaz hale gelir).

c) Programın herhangi bir yerindedeğerler ayarlanırken/alınırken bir dizi öğe ve pencere özelliğinin serbest kombinasyonu.


Dezavantajlar gören varsa konuşsun. Yayınlanmadan önce bu konuyu koordine etmek güzel olurdu.

 
Nikolai Semko CCanvas sınıfındaki Update işlevine (eğer kullanıyorsanız) statik bir sayaç koyun ve örneğin count%100 == 0 olduğunda bu sayacı yazdırın.

Nicholas, birden fazla GUI penceresinden bahsettiğimizi dikkate almakta fayda var. Son sürümde bunlardan 17 tane vardı ve her birinde yüzlerce öğe vardı. Ve her bir öğe karmaşıktır. Bir dizi parçadan oluşur. Her ayrıntı, tuvalin içinden geçmeniz gereken ve gerekli değerlerle doldurmak için doğru yerde bulunan bir bölümüdür.

Ortalama pencere sayısını 10 alırsak (Papkov'un 11 pencerelik bir arayüz sipariş ettiğini hatırlıyorum) ve her birinin bir dizi öğeye veya bir tabloya sahip olduğunu hayal edersek, tüm arayüzün tam olarak oluşturulmasının neden bu kadar zaman aldığı anlaşılır. Arayüzde simgeler, gölgeler, yüzey gradyanı, çeşitli çerçeveler olduğunu hatırlatmama izin verin.... o zaman toplamda TÜM arayüzün tamamen çizilmesi en az 500 ms sürecektir. Bu konuda yapabileceğiniz hiçbir şey yok.

Pencere sayısını azaltırsanız veya grafikleri basitleştirirseniz daha hızlı olabilir.

Yeniden çizme hakkında - neredeyse hiç saf ChartRedraw() çağrım yok. _ChartRedraw bayrağı her yerde kullanılır. Bu bayrak ayarlandığında, ChartRedraw() işlevi 25 ms sonra bir sonraki zamanlayıcı yinelemesinde çağrılır. Yani bir kez. Bu şekilde gereksiz yeniden çizimlerden kaçınıyorum. Sadece nadir durumlarda ChartRedraw() fonksiyonuna doğrudan çağrı yapıyorum .

 
Andrey Barinov #:

Ayrıca tam ekran tuvali her değiştirdiğimde tamamen yeniden çiziliyor, ancak bu 50 ms'den uzun sürmüyor ...

En pahalı olanı metin çizmektir. Bu nedenle, her seferinde TextOut kullanmamak için bunları dizilerde saklıyorum. Çok daha hızlı oluyor.

Basit aritmetik burada işe yarıyor: 10 - 17 pencerenin alanlarının toplamı tam ekrandan çok daha büyük. Katılıyorum. Artı gölgeler, simgeler, çerçeveler oluşturmak için gerekli ikincil ek çizim....

Ve TextOut hakkında kontrol edip yazacağım. İlginç bir fikir.

 

Bir test gerçekleştirdim:

Demo proje 1.mqh dosyasına girdim ve tüm pencereleri OOI bayrağına ayarladım. (başlatma sırasında açılıyor).

Toplamda - farklı boyutlarda ve farklı içeriklerde 15 pencere. Kaydırma çubukları ve tabloları olan 2 pencere (böylece tuvalleri kısmen gizlenir ve aslında 2-3 kat daha uzundur. Tam uzunluk, kaydırma çubuğunun kaydırma çubuğuna oranına göre değerlendirilebilir). Toplam çizim alanı(minimum) 2000*1000 piksel. Ama bundan daha fazla olduğunu düşünüyorum. Toplam çizilen 1158 parça (çekirdek yazdırıldıktan sonra kontrol edildi). Tüm tuvallerin sıfırdan 1600 - 1900 ms arasında tam çizim süresi.

Yine çizilmesi gereken ayrıntıların miktarına dikkat edin. Gölgeler, simgeler, degradeler, çerçeveler, metinler.


Çizim süresi ekran görüntüsü üzerindedir:


 
Çizimi hızlandırmanın bir yolu olabilir. Pencere platformlarının alt tabanını kaldırın. Bunlar, elemanların bulunduğu ön tarafın arkasındaki büyük tuvallerdir. Onları kaldırırsanız, 2 kat daha hızlı olacaktır. Bunun hakkında düşünmem gerekecek.
 
Belirli pencereleri yalnızca açık olduklarında çizmek mümkün mü? Aynı anda bir düzine pencerenin açık olması nadirdir. Bunu yapmanıza gerek yok.
 
hini #:
Belirli pencereleri yalnızca açık olduklarında çizebilir miyim? Aynı anda düzinelerce pencerenin açık olması nadirdir. Buna hiç gerek yok.

Bu olan tek şey, inanın bana. Ben sadece tüm arayüz pencerelerinin aynı anda ilk çiziminden bahsediyorum. İlk çizim en çok zaman alan çizimdir. Ve bundan sonra, tüm görüntüler zaten kaydedilir ve gerekirse bellekten alınır. Tek bir çağrı ile birkaç milisaniye içinde tuvallerine eklenirler. Bu bir sorun değildir. Sadece ilk çizimin süresini sıkıştırmak istiyorsunuz.

 
Реter Konow #:
Çizimi hızlandırmanın bir yolu olabilir. Pencere platformlarının alt tabanını kaldırın. Bunlar, elemanların bulunduğu ön tarafın arkasındaki büyük tuvallerdir. Onları kaldırırsanız, 2 kat daha hızlı olacaktır. Bunun hakkında düşünmem gerekecek.

Bahsettiğim tuval bu:

1. Elemanların bulunduğu ön taraf:


2. Pencerenin düğmelerinin (çarpı, simge durumuna küçültme), simgesinin ve ad metninin bulunduğu arka taraf. Ancak, pencerenin tamamı yeşil renktedir ve üzerinde zaman harcanmıştır. Ancak kullanıcı sadece çerçeveleri ve pencere başlığını görür. Bu yerde çizimin boşuna yapıldığı ortaya çıkıyor: