脚本: OpenCL 测试 - 页 2

 
Svetosha:
如果这些可能性没有用处,那么它们又有什么用处呢?)))))))
莱特兄弟只飞了 20 米(可以说是示范飞行),他们的发明的用途是洲际飞行(俗话说,感受不同)。
 
Zeleniy: 受孕前的卵子。我还是不明白为什么要把它拿出来,还不如做些有用的事情,而不是最后定稿。
Svetosha 而这些机会的使用,如果他们不是有用的))))))。

创新常常被这样的 "践行者 "用刺刀刺中,他们从鼻子的角度来判断普遍性的问题,对他们来说,没有什么是有味道的。

然后,当大家都能从中获益时,他们就安全地忘记了自己的攻击。

 
Mathemat:

这种 "灰色从业者 "常常从反面来看待创新,他们从鼻子的角度来判断普遍性问题,而鼻子是闻不到任何气味的。

然后,当所有人都看到好处时,他们就安全地忘记了自己的攻击。

是的,OpenCL 真的很酷。老实说,我已经很久没有跟踪 5 的情况了。相互吸收订单的情况还存在吗?
 
VDev:
订单吸收还在吗?

不是还在。

不可能有其他办法。

 

从下一个版本开始,我们将提供新功能,使用 ResourceCreate() 函数即时创建图形资源。

下面是一个经过重写和简化的脚本,它无需将图像转储到磁盘,运行速度更快,而且不会与磁盘上的资源访问发生冲突:

//+------------------------------------------------------------------+
//|OpenCLTest.mq5
//| 2011 年 MetaQuotes 软件公司版权所有。
//|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
//+------------------------------------------------------------------+
//| OpenCL 函数代码|
//+------------------------------------------------------------------+
const string 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";
//+------------------------------------------------------------------+
//| 脚本程序启动功能|
//+------------------------------------------------------------------+
void OnStart()
  {
   int cl_ctx;
   int cl_prg;
   int cl_krn;
   int cl_mem;
//--- 初始化 OpenCL 对象
   if((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;
     }
//--- 准备执行
   float 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());
//--- 设置不可更改的 OpenCL 函数参数
   CLSetKernelArg(cl_krn,4,max);
   CLSetKernelArgMem(cl_krn,5,cl_mem);
//--- 创建用于图形显示的对象
   ObjectCreate(0,objname,OBJ_BITMAP_LABEL,0,0,0);
   ObjectSetInteger(0,objname,OBJPROP_XDISTANCE,4);
   ObjectSetInteger(0,objname,OBJPROP_YDISTANCE,26);
//--- 创建初始空图片
   uint 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);
//----渲染,直到我们不被外界阻止
   while(!IsStopped())
     {
      uint x=GetTickCount();
      //--- 设置浮动参数
      CLSetKernelArg(cl_krn,0,x0);
      CLSetKernelArg(cl_krn,1,y0);
      CLSetKernelArg(cl_krn,2,x1);
      CLSetKernelArg(cl_krn,3,y1);
      //--- 渲染框架
      CLExecute(cl_krn,2,offset,work);
      //--- 获取帧数据
      CLBufferRead(cl_mem,buf);
      //--- 输出渲染时间
      Comment(IntegerToString(GetTickCount()-x)+" msec per frame");
      //--- 将帧保存在内存中并绘制出来
      ResourceCreate(resname,buf,SIZE_X,SIZE_Y,0,0,SIZE_X,COLOR_FORMAT_XRGB_NOALPHA);
      ChartRedraw();
      //-- 稍作停顿并更新下一帧的参数
      Sleep(10);
      x0+=0.001 f;
      x1-=0.001 f;
      y0+=0.001 f;
      y1-=0.001 f;
     }
//--- 删除 OpenCL 对象
   CLBufferFree(cl_mem);
   CLKernelFree(cl_krn);
   CLProgramFree(cl_prg);
   CLContextFree(cl_ctx);
//--- 删除对象
   ObjectDelete(0,objname);
  }
//+------------------------------------------------------------------+


这样,你就可以创建任何带有 alpha 通道的 32 位动态图像,以进行详细渲染。

动态创建的资源会进入资源管理器,供终端 所有MQL5 程序 使用。


 
Renat 将提供使用 ResourceCreate() 函数即时创建图形资源的新可能性。
是只公布 ResourceCreate() 函数,还是准备一个用于处理图形对象/原型的类?
 
IgorM:
是只公布 ResourceCreate() 函数,还是准备一个用于处理图形对象/原型的类

该函数已经可用。

在它的帮助下,您可以在自己的缓冲区中创建自己的绘图库,然后将它们绑定到对象上。这样您就可以完全摆脱外部 BMP 文件中的外部绘图库。

下面是一个小例子--您可以直接在 buf 缓冲区中绘图,然后在此基础上创建一个资源并将其分配给一个对象。

   uint 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);


稍后,我们将使用本地 2D 加速函数制作一个用于在相同缓冲区中绘图的基元库。这将大大加快绘图速度。

 
Renat:

该功能已经可用。

在它的帮助下,您已经可以在自己的缓冲区中制作自己的绘图库,然后将它们绑定到对象上。这样,您就可以完全摆脱外部 BMP 文件中的外部绘图库。


该功能是否适用于所有 MQL,而不仅仅适用于OpenCL

在创建的 BMP 资源中,alpha 通道的情况如何?

 
稍后,我们将制作一个基元库,用于使用本地 2D 加速函数在相同的缓冲区中绘图。

我明白了,但我认为,开发人员最好同时公布新函数和图形处理基类,否则又要开始 "在大厅里大喊大叫 "了,说在 mql5 上编程很困难。

ZY:是不是只有我没有 "回复 "链接?

 

sergeev 2012.03.19 17:25 #

在创建的 BMP 资源中,alpha 通道的情况如何?
似乎可以