Fazendo um projeto de crowdsourced em Tela - página 19

 

.

Aqui está o vídeo que eu prometi publicar. A qualidade da imagem é ruim, mas não impede que você veja os atrasos na resposta.

Na verdade, há menos atrasos no terminal. Quando o gravador está ligado, tudo é duas vezes mais lento. O processador carrega muito mais, também.

Portanto, não é possível ter uma idéia completamente objetiva da velocidade de reação deste vídeo, mas ele mostra claramente um padrão entre a taxa de atualização da janela e o tamanho da janela.

(É por isso que eu fiz várias janelas de diferentes tamanhos).

Acho que tenho a razão exata para a desaceleração da resposta da imagem. É a chamada constante da função ColorToARGB(). Em cada evento e em cada pixel eu chamo esta função. Em vez de calcular as cores uma vez e usá-las prontas, eu as recalculo o tempo todo.

Acho que este é o ponto.

P.S. Eu esqueci de acrescentar que o número total de objetos de todas as janelas é 35.

 
Реter Konow:

.

Aqui está o vídeo que eu prometi publicar. A qualidade da imagem é ruim, mas não impede que você veja os atrasos na resposta.

Na verdade, há menos atrasos no terminal. Quando o gravador está ligado, tudo é duas vezes mais lento. O processador carrega muito mais, também.

Portanto, não é possível ter uma idéia completamente objetiva da velocidade de reação deste vídeo, mas posso ver claramente um padrão entre a taxa de atualização da janela e o tamanho da janela.

(É por isso que eu fiz várias janelas de diferentes tamanhos).

Acho que tenho a razão exata para a desaceleração da resposta da imagem. É a chamada constante da função ColorToARGB(). Em cada evento e em cada pixel eu chamo esta função. Em vez de calcular as cores uma vez e usá-las prontas, eu as recalculo o tempo todo.

Acho que essa é a questão.

P.S. Eu esqueci de acrescentar que o número total de objetos de todas as janelas é 35.

É possível olhar para as fontes? Para mim mesmo, para a experiência .
 
Vladimir Pastushak:
É possível dar uma olhada no código fonte? Para mim, pela minha experiência.
Sim, nesta página eu afixei um bloco de funções que atraem todas estas janelas juntas. https://www.mql5.com/ru/forum/92113/page16
Делаем краудсорсовый проект по Canvas
Делаем краудсорсовый проект по Canvas
  • www.mql5.com
Приветстсвую кодеров. Есть интересная задача сделать действительно что-то полезное, и думаю что краудсорс будет хорошим вариантом...
 
O problema do atraso nas reações foi resolvido. A solução foi a seguinte:

Uma imagem é criada uma vez. Esta é a primeira vez que leva mais tempo para desenhá-la, pois a imagem consiste de um grande número de peças, e desenhar cada peça é uma chamada às funções de desenho, cada uma das quais percorre as peças e inicializa os valores na matriz.

Vou explicar qual era o problema:

Antes, ao desenhar os detalhes de uma imagem, eu estava fazendo um loop sobre toda a área da imagem e foi isso que criou o atraso. Para uma janela de 500×500 pixels, tive que redesenhar cerca de 300 peças para cada repintura, o que resultou em (500×500×300×número de funções de desenho) interações em ciclos em cada repintura. Isto acaba levando tempo até mesmo para um computador.
A solução foi a seguinte: em vez de desenhar novamente a imagem em cada evento que requer a repintura de um detalhe particular dentro da imagem, eu desenho a imagem uma vez, e na próxima repintura eu a devolvo a uma matriz usando ResourceReadImage().

Então eu redesenho a parte sem looping sobre toda a imagem, mas calculo a localização do pixel da parte da imagem na matriz de imagens por uma fórmula especial e a redesenho apenas. Dessa forma, nenhuma integração desnecessária é feita. Além disso, fundi as funções de desenho em uma só, o que também tornou o mecanismo mais eficiente.





 
É realista acelerar a renderização em Tela usando OpenCL?
 
Timur Gatin:
É realista acelerar a renderização em Tela com OpenCL?


Sim. OCL tem a capacidade de paralelizar o processamento + a capacidade de operar em vetores - isto acelera o processo de renderização/sobreposição.

Leia mais sobre o uso de vetores no artigo do Mathemat https://www.mql5.com/ru/articles/407

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


Sim. A OCL tem a possibilidade de paralelizar o processamento + possibilidade de operar com vetores - isto acelera o processo de desenho/layering.

Leia mais sobre o uso de vetores no artigo do Mathemat https://www.mql5.com/ru/articles/407

Você comparou a velocidade de Erase() do CCanvas e o loop PixelSet() feito no OpenCl? Em teoria, com uma boa velocidade, você pode fazer código de desenho burro sem caching de resultados intermediários e outras complicações.

A propósito, você mistura camadas usando esta fórmula?


 

Sim, a fórmula é da wikipedia, para cada componente de cor: Resultado = Fundo + (Primeiro plano - Fundo) * Alfa;

A propósito, há um problema com o Erase no OCL. Não existe um análogo de memset (ao contrário da CUDA). É por isso que agora tenho que apagar no host e copiar a matriz limpa através do CLBufferWrite, que certamente não é mais rápido do que o simples apagar.
Por outro lado, tentei fazer uma matriz de tarefas para unidades de trabalho escrevendo 1 ponto na matriz, mas não me lembro da velocidade - parecia ser mais lenta do que o método anterior.

E no OCL 1.2clEnqueueFillBuffer() que faz isso => de acordo com a sintaxe MQL deve haver CLBufferFill()

Mas este invólucro não é implementado (já que a versão 1.1 é portada).

 
Igor Volodin:

Sim, a fórmula é da wikipedia, para cada componente de cor: Resultado = Fundo + (Primeiro plano - Fundo) * Alfa;

A propósito, há um problema com o Erase no OCL. Não existe um análogo de memset (ao contrário da CUDA). É por isso que agora tenho que apagar no host e copiar o conjunto limpo através do CLBufferWrite, que certamente não é mais rápido do que o simples apagar.
Por outro lado, tentei fazer uma matriz de tarefas para unidades de trabalho escrevendo 1 ponto na matriz, mas não me lembro da velocidade - parecia ser mais lenta do que o método anterior.

E no OCL 1.2clEnqueueFillBuffer() que faz isso => de acordo com a sintaxe MQL deve haver CLBufferFill()

Mas este invólucro não é implementado (já que a versão 1.1 é portada).

Em inglês wiki, a fórmula é mais interessante, você pode misturar duas camadas semi-transparentes. Isto pode fazer uma interface semitransparente e outras gentilezas.
 
Timur Gatin:
Na vítima inglesa, a fórmula é mais interessante, você pode misturar duas camadas translúcidas. É possível fazer uma interface translúcida e outras coisas bonitas.

Eu não precisava disto no meu caso, tudo se mistura corretamente. Qualquer coisa abaixo da camada A pode ser considerada o substrato, mesmo que a camada B esteja em cima dele, através da qual o próprio substrato brilha.
Razão: