我的方法。核心是引擎。 - 页 123

 
Реter Konow:

...

不过,有可能是处理器因重绘而超载。也就是说,在一个像素数组内作画。换句话说,在高(16ms)的定时器频率下,不断对数组进行初始化

不,重绘不会以任何方式加载处理器;它需要几纳秒或最多几微秒的时间来向图形驱动程序发送命令。视频卡的处理器自己进行绘画,一个像素一个像素地进行,而通常有数百个,它们与处理器同时并行工作。也就是说,处理器向图形驱动程序发出命令:在CopyPut模式下显示一个中心在屏幕坐标Xc、Yc、半径为R的圆。对处理器来说,这只是一个带有参数的函数调用。它并没有比这更进一步。这种调用的频率不超过,例如,每秒2次,否则,用户根本无法理解屏幕上的任何东西,它不能被拉得如此频繁。对于一个开放的交易清单,你可以想象,它可能需要一个小时或一天或更长时间。

而逐个像素上色的算法(例如谷歌 "Bresenham Algorithm")是由显卡执行的,处理器不会在上面逗留。它的执行速度也非常快。还有......每次通话一次。在16ms时不需要重新初始化,屏幕图像在视频存储器中保持不变,直到在处理器的命令下进行新的改变。不仅如此,视频内存也保持重复,以加快可见屏幕的反应速度,在不可见的屏幕上进行更改,然后立即切换视频页面。

如果你对屏幕输出的方法仍然有你所描述的 "不断初始化数组"的像素--你应该把它去掉,事实并非如此。

 
Реter Konow:

点击查看。

图片中开幕时间一栏的数据有问题。

 
Vladimir:

不,重绘不会以任何方式加载处理器;它最多需要几纳秒或几微秒的时间来向图形驱动程序发送命令。视频卡的处理器逐个像素地执行绘画本身,而通常有数百个处理器,它们与处理器同时工作,平行进行。也就是说,处理器向图形驱动程序发出命令:在CopyPut模式下显示一个中心在屏幕坐标Xc、Yc、半径为R的圆。对处理器来说,这只是一个带有参数的函数调用。它并没有比这更进一步。这种调用的频率不超过,例如,每秒2次,否则,用户根本无法理解屏幕上的任何东西,它不能被拉得如此频繁。对于一个开放的交易清单,你可以想象,它可能需要一个小时或一天或更长时间。

而逐个像素上色的算法(例如谷歌的 "Bresenham Algorithm")是由显卡执行的,处理器并不在上面逗留。它的执行速度也非常快。还有......每次通话一次。在16ms时不需要重新初始化,屏幕图像在视频存储器中保持不变,直到在处理器的命令下进行新的改变。不仅如此,为了加快可见屏幕的反应速度,视频存储器也被保存为两份,在不可见的那份上进行修改,然后立即切换视频页面。

如果你对屏幕输出的方法仍然有你所描述的像素的 "永久数组初始化"--你应该摆脱它,这不是事实。

真是一团糟...
这是一种零散知识的混杂...

归根结底,事情不是这样的。

 
Vladimir:

不,重绘不会以任何方式加载处理器;它最多需要几纳秒或几微秒的时间来向图形驱动程序发送命令。视频卡的处理器逐个像素地执行绘画本身,而通常有数百个处理器,它们与处理器同时工作,平行进行。也就是说,处理器向图形驱动程序发出命令:在CopyPut模式下显示一个中心在屏幕坐标Xc、Yc、半径为R的圆。对处理器来说,这只是一个带有参数的函数调用。它并没有比这更进一步。这种调用的频率不超过,例如,每秒2次,否则,用户根本无法理解屏幕上的任何东西,它不能被拉得如此频繁。对于一个开放的交易清单,你可以想象,它可能需要一个小时或一天或更长时间。

而逐个像素上色的算法(例如谷歌 "Bresenham Algorithm")是由显卡执行的,处理器不会在上面逗留。它的执行速度也非常快。还有......每次通话一次。在16ms时不需要重新初始化,屏幕图像在视频存储器中保持不变,直到在处理器的命令下进行新的改变。不仅如此,为了加快可见屏幕的反应速度,视频内存也是一式两份,在不可见的那份上进行更改,然后立即切换到视频页面。

如果你对输出的方法仍然有 "恒定初始化数组"的像素--你需要摆脱它。

你有一个有趣的理论,尽管它与我的实验结果不太吻合,我现在将在下面发表。

如测试所示,像素阵列的初始化对CPU的负载最大。

查看下面的测试EA。

 

我不得不承认,我对测试的结果有点惊讶。

因此,我们谈论的是频率为16毫秒的持续函数调用。

事实证明,在绘制过程中,像素阵列的初始化对 处理器的负载最大。

但最奇怪的是,重复的函数调用

ObjectSetInteger(0,"MT object",OBJPROP_SELECTED,1);

将使处理器的负荷增加10%至15%。

另外,呼叫

   ObjectSetString(0,"MT object",OBJPROP_BMPFILE,"::MT object");  

   ObjectSetString(0,"MT object",OBJPROP_TEXT,"QWERTY");

以同样的10-15%的比例加载处理器。

同时,同时调用所有三个功能

ObjectSetInteger(0,"MT object",OBJPROP_SELECTED,1);
   
ObjectSetString(0,"MT object",OBJPROP_BMPFILE,"::MT object");  

ObjectSetString(0,"MT object",OBJPROP_TEXT,"QWERTY");

不会造成负载堆积。负荷仍然是10-15%。

然而,如果你在这些调用中加入一百万个单元的恒定数组重新初始化循环

for(int a1 = 0; a1 < 1000000; a1++)Arr[a1] = MathRand();

那么CPU的负荷就会上升到50%。

//-----------------------------------------------------------------------------------------------------------------------------------------------------

该功能本身

ResourceCreate("::MT object",Arr,1000000,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA);

不加载处理器。

职能

ResourceReadImage("::MT object",Arr,w,h);

将根据Arr[]数组的大小,从0到5%加载。

 

这里有一个测试顾问。你需要对这些行进行评论,并在任务管理器中检查CPU负载。

附加的文件:
Test_1.mq4  11 kb
 

这是他的代码。

//+------------------------------------------------------------------+
//|                                                       Test_1.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
uint Arr[1000000];
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetMillisecondTimer(16); 
   //----------------------------------------------------
   //Создаем МТ-объект.
   //----------------------------------------------------
   ObjectCreate(0,"MT object",OBJ_BITMAP_LABEL,0,0,0);
   //----------------------------------------------------
   //Соединяем с файлом.
   //----------------------------------------------------   
   ObjectSetString(0,"MT object",OBJPROP_BMPFILE,"::MT object");
   //----------------------------------------------------
   //Создаем ресурс.
   //----------------------------------------------------
   ResourceCreate("::MT object",Arr,1000000,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA);   
   //----------------------------------------------------  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   uint w = 0,h = 0;
   string name;
   //----------------------------------------------------
   //Читаем свойство bool.//Нагрузка процессора отсутствует.
   //----------------------------------------------------
   ObjectGetInteger(0,"MT object",OBJPROP_SELECTED);
   //----------------------------------------------------
   
   //----------------------------------------------------
   //Устанавливаем свойство bool.//Нагрузка процессора: 10% - 15%.
   //----------------------------------------------------
   ObjectSetInteger(0,"MT object",OBJPROP_SELECTED,1);
   //---------------------------------------------------- 
   
   //---------------------------------------------------- 
   //Перерисовываем изображение в массиве Arr[].
   //Нагрузка процессора зависит от размера массива. 
   //При 10000 ячеек, нагрузки нет, при 1000000 ячеек, - ~35%.
   //---------------------------------------------------- 
   for(int a1 = 0; a1 < 1000000; a1++)Arr[a1] = MathRand();
   //---------------------------------------------------- 
   
   //---------------------------------------------------- 
   //Пересоздаем ресурс.//Нагрузка процессора отсутствует
   //при любом размере массива.
   //----------------------------------------------------
   ResourceCreate("::MT object",Arr,1000000,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA);   
   //---------------------------------------------------- 
   
   //----------------------------------------------------
   //Читаем ресурс.
   //Нагрузка процессора зависит от размера массива. 
   //При 10000 ячеек, нагрузки нет, при 1000000 ячеек, 
   //Нагрузка "плавает" от 1 до 6%.   
   //----------------------------------------------------
   ResourceReadImage("::MT object",Arr,w,h);     
   //----------------------------------------------------
   
   //----------------------------------------------------
   //Пересоединяем с файлом.//Нагрузка процессора: 10% - 15%
   //----------------------------------------------------   
   ObjectSetString(0,"MT object",OBJPROP_BMPFILE,"::MT object");  
   //----------------------------------------------------
   
   //----------------------------------------------------
   //Устанавливаем описание объекта.//Нагрузка процессора: 10% - 15%
   //---------------------------------------------------- 
   ObjectSetString(0,"MT object",OBJPROP_TEXT,"QWERTY");   
   //----------------------------------------------------
   
   //----------------------------------------------------
   //Читаем описание объекта.//Нагрузка процессора отсутствует.
   //---------------------------------------------------- 
   name = ObjectGetString(0,"MT object",OBJPROP_TEXT);         
  }
//+------------------------------------------------------------------+
 
Andrey Barinov:

图片中开幕时间一栏中的数据有问题。

是的,我使用TimeToStr(OrderOpenPrice(),TIME_MINUTES|TIME_SECONDS)。

我不知道为什么会这样。

 
Реter Konow:

我不得不承认,我对测试结果感到有些惊讶。

因此,我们谈论的是频率为16毫秒的持续函数调用。

事实证明,在绘制过程中,像素阵列的初始化对 处理器的负载最大。

但最奇怪的是,重复的函数调用

将使处理器的负荷增加10%至15%。

另外,呼叫

以同样的10-15%的比例加载处理器。

同时,同时调用所有三个功能

不会造成负载堆积。负荷仍然是10-15%。

然而,如果你在这些调用中加入一百万个单元的恒定数组重新初始化循环

那么CPU的负荷就会上升到50%。

//-----------------------------------------------------------------------------------------------------------------------------------------------------

该功能本身

不加载处理器。

职能

负载从0到5%,取决于Arr[]阵列的大小。

Retrog Konow:

我必须承认,我对测试的结果有点惊讶。

因此,我们正在谈论16毫秒的持续函数调用。

事实证明,在绘图过程中,最需要加载处理器的是像素阵列的初始化

但最奇怪的是,重复的函数调用

将使处理器的负荷增加10%至15%。

另外,呼叫

以同样的10-15%的比例加载处理器。

同时,同时调用所有三个功能

不会造成负载堆积。负荷仍然是10-15%。

然而,如果你在这些调用中加入一百万个单元的恒定数组重新初始化循环

那么CPU的负荷就会上升到50%。

//-----------------------------------------------------------------------------------------------------------------------------------------------------

该功能本身

不加载处理器。

职能

将根据Arr[]数组的大小,从0到5%加载。


彼得,有一种强烈的感觉,你不听任何你被告知的数百页。
重读该主题--对 "为什么这样 "的问题有答案

 
Реter Konow:

是的,我使用TimeToStr(OrderOpenPrice(),TIME_MINUTES|TIME_SECONDS)。

我不知道为什么。

因为用OrderOpenPrice代替了OrderOpenTime()。