Svetosha: E qual é a utilidade dessas possibilidades se elas não forem úteis? )))))))
Os irmãos Wright voaram apenas 20 metros (por assim dizer, um voo de demonstração), a utilidade de sua invenção são os voos intercontinentais (como dizem, sinta a diferença).
Zeleniy: O óvulo antes da concepção. Ainda não entendo por que divulgá-lo, seria melhor fazer algo útil e não finalizado.
Svetosha: E o uso dessas oportunidades, se elas não forem úteis))))))
As inovações são frequentemente enfrentadas com baioneta por esses "profissionais sermyazhnye", que julgam os problemas universais do ponto de vista de seu nariz, para o qual nada cheira.
E então, quando o benefício é visível para todos, eles se esquecem com segurança de seus ataques.
As inovações são frequentemente enfrentadas por esses "praticantes cinzentos", que julgam os problemas universais do ponto de vista de seu nariz, para o qual nada cheira.
E então, quando todos veem o benefício, eles esquecem com segurança seus ataques.
Sim, o OpenCL é muito legal. Para ser sincero, não acompanho a situação do 5 há muito tempo. A inter-absorção de ordens ainda existe?
A partir da próxima compilação, novos recursos estarão disponíveis para criar recursos gráficos em tempo real usando as funções ResourceCreate().
Aqui está um script reescrito e simplificado que dispensa o despejo de imagens no disco, funciona mais rápido e sem conflitos de acesso a recursos no disco:
//+------------------------------------------------------------------+//|OpenCLTest.mq5//| Copyright 2011, MetaQuotes Software Corp.//| http://www.mql5.com//+------------------------------------------------------------------+#property copyright "Copyright 2011, MetaQuotes Software Corp."#property link "http://www.mql5.com"#property version "1.00"//---#define SIZE_X 512#define SIZE_Y 512//+------------------------------------------------------------------+//| Código de função OpenCL|//+------------------------------------------------------------------+conststring cl_src=
"__kernel void MFractal( \r\n"" float x0, \r\n"" float y0, \r\n"" float x1, \r\n"" float y1, \r\n"" uint max, \r\n"" __global uint *out) \r\n"" { \r\n"" size_t w = get_global_size(0); \r\n"" size_t h = get_global_size(1); \r\n"" size_t gx = get_global_id(0); \r\n"" size_t gy = get_global_id(1); \r\n"" float dx = x0 + gx * (x1-x0) / (float) w; \r\n"" float dy = y0 + gy * (y1-y0) / (float)h; \r\n"" float x = 0; \r\n"" float y = 0; \r\n"" float xx = 0; \r\n"" float yy = 0; \r\n"" float xy = 0; \r\n"" uint i = 0; \r\n"" while ((xx+yy)<4 && i<max) \r\n"" { \r\n"" xx = x*x; \r\n"" yy = y*y; \r\n"" xy = x*y; \r\n"" y = xy+xy+dy; \r\n"" x = xx-yy+dx; \r\n"" i++; \r\n"" } \r\n"" if(i==max) \r\n"" out[w*gy+gx] = 0; \r\n"" else \r\n"" out[w*gy+gx] = (uint)((float)0xFFFFFF/(float)max)*i; \r\n"" } \r\n";
//+------------------------------------------------------------------+//| Função de início do programa de script|//+------------------------------------------------------------------+voidOnStart()
{
int cl_ctx;
int cl_prg;
int cl_krn;
int cl_mem;
//--- inicialização de objetos OpenCLif((cl_ctx=CLContextCreate())==INVALID_HANDLE)
{
Print("OpenCL not found");
return;
}
if((cl_prg=CLProgramCreate(cl_ctx,cl_src))==INVALID_HANDLE)
{
CLContextFree(cl_ctx);
Print("OpenCL program create failed");
return;
}
if((cl_krn=CLKernelCreate(cl_prg,"MFractal"))==INVALID_HANDLE)
{
CLProgramFree(cl_prg);
CLContextFree(cl_ctx);
Print("OpenCL kernel create failed");
return;
}
if((cl_mem=CLBufferCreate(cl_ctx,SIZE_X*SIZE_Y*sizeof(uint),CL_MEM_READ_WRITE))==INVALID_HANDLE)
{
CLKernelFree(cl_krn);
CLProgramFree(cl_prg);
CLContextFree(cl_ctx);
Print("OpenCL buffer create failed");
return;
}
//--- preparando-se para a execuçãofloat x0 =-2;
float y0 =-0.5;
float x1 =-1;
float y1 = 0.5;
uint max = 20000;
uint offset[2]={0,0};
uint work [2]={SIZE_X,SIZE_Y};
string objname ="OpenCL_"+IntegerToString(ChartID());
string resname ="Mandelbrot_"+IntegerToString(ChartID());
//--- configuração de parâmetros de função OpenCL imutáveis
CLSetKernelArg(cl_krn,4,max);
CLSetKernelArgMem(cl_krn,5,cl_mem);
//--- criando o objeto para exibição de gráficosObjectCreate(0,objname,OBJ_BITMAP_LABEL,0,0,0);
ObjectSetInteger(0,objname,OBJPROP_XDISTANCE,4);
ObjectSetInteger(0,objname,OBJPROP_YDISTANCE,26);
//--- criar imagem inicial vaziauint buf[];
ArrayResize(buf,SIZE_X*SIZE_Y);
ResourceCreate(resname,buf,SIZE_X,SIZE_Y,0,0,SIZE_X,COLOR_FORMAT_XRGB_NOALPHA);
ObjectSetString(0,objname,OBJPROP_BMPFILE,"::"+resname);
//--- renderização, até que não sejamos impedidos por forawhile(!IsStopped())
{
uint x=GetTickCount();
//--- configuração de parâmetros flutuantes
CLSetKernelArg(cl_krn,0,x0);
CLSetKernelArg(cl_krn,1,y0);
CLSetKernelArg(cl_krn,2,x1);
CLSetKernelArg(cl_krn,3,y1);
//--- renderizando o quadro
CLExecute(cl_krn,2,offset,work);
//--- pegando os dados do quadro
CLBufferRead(cl_mem,buf);
//--- gerando o tempo de renderizaçãoComment(IntegerToString(GetTickCount()-x)+" msec per frame");
//--- salvando o quadro na memória e desenhando-o
ResourceCreate(resname,buf,SIZE_X,SIZE_Y,0,0,SIZE_X,COLOR_FORMAT_XRGB_NOALPHA);
ChartRedraw();
//--- uma pequena pausa e atualização dos parâmetros para o próximo quadroSleep(10);
x0+=0.001 f;
x1-=0.001 f;
y0+=0.001 f;
y1-=0.001 f;
}
//--- removendo objetos OpenCL
CLBufferFree(cl_mem);
CLKernelFree(cl_krn);
CLProgramFree(cl_prg);
CLContextFree(cl_ctx);
//--- remover objetoObjectDelete(0,objname);
}
//+------------------------------------------------------------------+
Assim, você pode criar qualquer imagem dinâmica de 32 bits com canais alfa para renderização detalhada.
Os recursos criados dinamicamente entram no gerenciador de recursos e ficam disponíveis para todos os programas MQL5 do terminal.
Com a ajuda dela, você já pode criar suas próprias bibliotecas para desenhar em seu próprio buffer e depois vinculá-las a objetos. Assim, você pode se livrar completamente das bibliotecas de desenho externas em arquivos BMP externos.
Aqui está um pequeno exemplo: você pode desenhar diretamente no buffer buf e, em seguida, criar um recurso com base nele e atribuí-lo a um objeto.
Um pouco mais tarde, criaremos uma biblioteca de primitivos para desenhar nos mesmos buffers usando funções de aceleração 2D nativas. Isso permitirá desenhar com muito mais rapidez.
Com a ajuda dele, você já pode criar suas próprias bibliotecas para desenhar em seu próprio buffer e, em seguida, vinculá-las a objetos. Assim, você pode se livrar completamente das bibliotecas de desenho externas em arquivos BMP externos.
Essa função estará disponível para todos os MQL, e não apenas para trabalhar com OpenCL?
E qual é a situação do canal alfa nos recursos BMP criados?
Um pouco mais tarde, criaremos uma biblioteca de primitivos para desenhar nos mesmos buffers usando funções de aceleração 2D nativas.
Entendo, mas, na minha opinião, é melhor que os desenvolvedores anunciem de uma só vez a nova função e a classe base para trabalhar com gráficos, caso contrário, começarão novamente a "gritar do corredor" sobre as dificuldades de programação no mql5.
SZY: Será que é só eu que o link "responder" não funciona? em vez de citar uma postagem, aparece a janela "Novo comentário".
E qual é a utilidade dessas possibilidades se elas não forem úteis? )))))))
As inovações são frequentemente enfrentadas com baioneta por esses "profissionais sermyazhnye", que julgam os problemas universais do ponto de vista de seu nariz, para o qual nada cheira.
E então, quando o benefício é visível para todos, eles se esquecem com segurança de seus ataques.
As inovações são frequentemente enfrentadas por esses "praticantes cinzentos", que julgam os problemas universais do ponto de vista de seu nariz, para o qual nada cheira.
E então, quando todos veem o benefício, eles esquecem com segurança seus ataques.
A absorção de pedidos ainda está lá?
Não é que ela ainda esteja lá.
Não pode ser de outra forma.
A partir da próxima compilação, novos recursos estarão disponíveis para criar recursos gráficos em tempo real usando as funções ResourceCreate().
Aqui está um script reescrito e simplificado que dispensa o despejo de imagens no disco, funciona mais rápido e sem conflitos de acesso a recursos no disco:
Assim, você pode criar qualquer imagem dinâmica de 32 bits com canais alfa para renderização detalhada.
Os recursos criados dinamicamente entram no gerenciador de recursos e ficam disponíveis para todos os programas MQL5 do terminal.
Será anunciada apenas a função ResourceCreate() ou será preparada uma classe para trabalhar com objetos gráficos/primitivos?
Essa função já estará disponível.
Com a ajuda dela, você já pode criar suas próprias bibliotecas para desenhar em seu próprio buffer e depois vinculá-las a objetos. Assim, você pode se livrar completamente das bibliotecas de desenho externas em arquivos BMP externos.
Aqui está um pequeno exemplo: você pode desenhar diretamente no buffer buf e, em seguida, criar um recurso com base nele e atribuí-lo a um objeto.
Um pouco mais tarde, criaremos uma biblioteca de primitivos para desenhar nos mesmos buffers usando funções de aceleração 2D nativas. Isso permitirá desenhar com muito mais rapidez.
Esse recurso já estará disponível.
Com a ajuda dele, você já pode criar suas próprias bibliotecas para desenhar em seu próprio buffer e, em seguida, vinculá-las a objetos. Assim, você pode se livrar completamente das bibliotecas de desenho externas em arquivos BMP externos.
Essa função estará disponível para todos os MQL, e não apenas para trabalhar com OpenCL?
E qual é a situação do canal alfa nos recursos BMP criados?
Entendo, mas, na minha opinião, é melhor que os desenvolvedores anunciem de uma só vez a nova função e a classe base para trabalhar com gráficos, caso contrário, começarão novamente a "gritar do corredor" sobre as dificuldades de programação no mql5.
SZY: Será que é só eu que o link "responder" não funciona? em vez de citar uma postagem, aparece a janela "Novo comentário".
sergeev 2012.03.19 17:25 #
E qual é a situação do canal alfa nos recursos BMP criados?