Galeria de UIs escritas em MQL - página 57

 

@Nikolai Semko

Nikolai, agora inesperadamente veio a resposta para a pergunta"por que demora tanto para desenhar uma tela".

As janelas consistem em duas telas! Essas telas são quase iguais em tamanho. Portanto, a área de desenho deve ser multiplicada por dois. Mas isso é só o começo.

No espaço da janela, há grandes elementos de rolagem (V_BOX), que também são desenhados completamente preenchidos com a cor original. Ou seja, se a V_BOX ocupar a parte principal da janela, a área de desenho deverá ser multiplicada por três. Mas! ele tem uma tela adicional. A imagem é rolada nessa tela. A base do elemento é apenas uma barra de rolagem. Resumindo: a área de desenho deve ser multiplicada por quatro (especialmente se a barra de rolagem for longa). E só então os elementos são desenhados.

Parece que isso é tudo... Podemos colocar um ponto,multiplicar a área da janela por três ou quatro. Mas não!

Ospróprios elementos também têm várias camadas. Cada um tem uma base. A base é sempre desenhada do zero, preenchida com a cor original. Em seguida, as molduras são desenhadas sobre a base. Em seguida, os ícones são desenhados sobre as partes já desenhadas do elemento. E, por fim, os textos são desenhados em cima de tudo.

Como resultado, o usuário vê apenas a cor final em cada pixel específico. Mas, no local desse pixel, as cores mudaram várias vezes à medida que a janela inteira é desenhada.


Agora multiplique isso por 15 janelas.... Fica claro que não há nenhum bug especial no código - medi especialmente a velocidade de execução de partes do bloco de desenho, e 50 ms para uma tela inteira também funciona para mim. O problema é que acabo tendo muito mais telas.


Tenho uma ideia de como alterar o código e acelerar o desenho em 2 ou 3 vezes. Mas farei isso depois do trabalho principal.

Quero agradecê-lo por insistir em verificar o código. Você estava certo. Esse é o caso quando a crítica foi útil.

Além disso, agradeço a @AndreyBarinov pela dica com o texto. Talvez eu consiga pensar em algo.

Nikolai Semko - BeeXXI Corporation
Nikolai Semko - BeeXXI Corporation
  • 2024.07.15
  • www.mql5.com
Профиль трейдера
 
Реter Konow #:

@Nikolai Semko

...e 50ms em tela cheia também funciona para mim. ....

O teste é aproximado. Medi a velocidade de abertura de uma janela com três telas de tamanho quase igual (janela de ícones) e obtive cerca de 70 ms. Se você somar a área de todas as telas (sem elementos), terá aproximadamente a área da tela do laptop de 17". Isso não inclui a área da base dos elementos e os próprios ícones, que foram desenhados na parte superior da tela. Portanto, sim, cerca de 50 ms para preencher com cores a área de uma tela cheia fictícia. Ainda não medi isso exatamente. Por que, quando o "elefante" está bem no meio da sala? :)

 
Eu estava falando de 50 ms como uma interface sobrecarregada e não otimizada. 3-10 ms é normal

No entanto, faça alguns perfis. Você fará muitas descobertas em seu código.
 
Nikolai Semko #:
Eu estava falando de 50 ms como uma interface sobrecarregada e não otimizada. 3-10 ms é normal

Mas faça alguns perfis. Você fará muitas descobertas em seu código.
Nikolai, esses são apenas números. Você precisa de detalhes específicos. Pelo menos o tamanho da tela. Assim, você poderá fazer cálculos precisos.
 
O desenho na tela é uma inicialização de matriz. É fácil descobrir a velocidade máxima - a função com o loop de preenchimento da matriz a revelará. O tamanho da matriz deve corresponder à soma dos pixels da tela condicional.
 
Você é como Stirlitz, que não queria ir para a plantação de batatas.
Faça o perfil...
 
Nikolai Semko #:
Você é como Stirlitz, que não queria ir para a plantação de batatas.
Faça o perfil...
Eu fiz. Vou lhe enviar um gif.
 


Você precisa de um estudo aprofundado dos ciclos dentro do bloco de desenho. O perfil superficial não oferece um quadro completo. Mas já está claro qual é o objetivo. Escrevi três postagens acima. Acho que não estou errado.

(versão preliminar do bloco de desenho, eu o uso para testes)