Мой подход. Ядро - Движок. - страница 123

 
Реter Konow:

...

ЗЫ. Хотя, возможно, что процессор нагружает перерисовка. То есть рисование внутри массива пикселей. Иначе говоря, постоянная инициализация массива значениями, происходящая на высокой (16 мс) частоте таймера. 

Нет, перерисовка процессор никак не нагружает, для него послать команду графическому драйверу - дело нескольких нано- или максимум микросекунд. Само рисование в видеопамяти, попиксельное, выполняют процессоры видеокарты, а их в ней обычно сотни и они работают одновременно с процессором, параллельно. Те есть процессор отдает команду графическому драйверу: выведи на экран в режиме CopyPut окружность с центром в экранных координатах Xc, Yc радиусом R. Для процессора это всего лишь вызов функции с передачей параметров. Дальше этого он не идет. Такие вызовы он делает не чаще, например, 2 раз в секунду, иначе пользователь просто ничего не разберет на экране, его нельзя дергать так часто. Для списка открытых сделок - сами представляете, может пройти и час, и сутки, и больше.

А уж алгоритм (гугл "Алгоритм Брезенхэма", например) попиксельной раскраски исполняет видеокарта, процессор на этом не задерживается. Исполняет также очень быстро. И.. один раз на вызов. Никакой переинициализации с частотой 16 мс не требуется,  в видеопамяти образ экрана хранится постоянным до нового изменения по команде процессора. Мало того, для ускорения видимой реакции экрана видеопамять еще держат в двух экземплярах, изменения вносят на невидимом, после чего сразу переключают видеостраницу.

Если же в Вашем подходе к выводу на экран все же имеет место описываемая Вами "постоянная инициализация массива" пикселей - надо от нее избавляться, это не дело.

 
Реter Konow:

Нажмите, чтобы посмотреть.

На картинке что-то не так с данными в колонке Opening Time.

 
Vladimir:

Нет, перерисовка процессор никак не нагружает, для него послать команду графическому драйверу - дело нескольких нано- или максимум микросекунд. Само рисование в видеопамяти, попиксельное, выполняют процессоры видеокарты, а их в ней обычно сотни и они работают одновременно с процессором, параллельно. Те есть процессор отдает команду графическому драйверу: выведи на экран в режиме CopyPut окружность с центром в экранных координатах Xc, Yc радиусом R. Для процессора это всего лишь вызов функции с передачей параметров. Дальше этого он не идет. Такие вызовы он делает не чаще, например, 2 раз в секунду, иначе пользователь просто ничего не разберет на экране, его нельзя дергать так часто. Для списка открытых сделок - сами представляете, может пройти и час, и сутки, и больше.

А уж алгоритм (гугл "Алгоритм Брезенхэма", например) попиксельной раскраски исполняет видеокарта, процессор на этом не задерживается. Исполняет также очень быстро. И.. один раз на вызов. Никакой переинициализации с частотой 16 мс не требуется,  в видеопамяти образ экрана хранится постоянным до нового изменения по команде процессора. Мало того, для ускорения видимой реакции экрана видеопамять еще держат в двух экземплярах, изменения вносят на невидимом, после чего сразу переключают видеостраницу.

Если же в Вашем подходе к выводу на экран все же имеет место описываемая Вами "постоянная инициализация массива" пикселей - надо от нее избавляться, это не дело.

Ну нагородили...
Какая-то мешанина отрывочных знаний...

В итоге все не так...

 
Vladimir:

Нет, перерисовка процессор никак не нагружает, для него послать команду графическому драйверу - дело нескольких нано- или максимум микросекунд. Само рисование в видеопамяти, попиксельное, выполняют процессоры видеокарты, а их в ней обычно сотни и они работают одновременно с процессором, параллельно. Те есть процессор отдает команду графическому драйверу: выведи на экран в режиме CopyPut окружность с центром в экранных координатах Xc, Yc радиусом R. Для процессора это всего лишь вызов функции с передачей параметров. Дальше этого он не идет. Такие вызовы он делает не чаще, например, 2 раз в секунду, иначе пользователь просто ничего не разберет на экране, его нельзя дергать так часто. Для списка открытых сделок - сами представляете, может пройти и час, и сутки, и больше.

А уж алгоритм (гугл "Алгоритм Брезенхэма", например) попиксельной раскраски исполняет видеокарта, процессор на этом не задерживается. Исполняет также очень быстро. И.. один раз на вызов. Никакой переинициализации с частотой 16 мс не требуется,  в видеопамяти образ экрана хранится постоянным до нового изменения по команде процессора. Мало того, для ускорения видимой реакции экрана видеопамять еще держат в двух экземплярах, изменения вносят на невидимом, после чего сразу переключают видеостраницу.

Если же в Вашем подходе к выводу на экран все же имеет место описываемая Вами "постоянная инициализация массива" пикселей - надо от нее избавляться, это не дело.

У вас интересная теория, хотя она не совсем соответствуем результатам моих опытов, которые я сейчас выложу ниже.

Как показала проверка, именно инициализация массива пикселей нагружает процессор больше всего.

Проверьте тестовый советник ниже.

 

Должен признать, что результаты теста меня немного удивили.

И так, речь идет о постоянных вызовах функций на частоте 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();

то, нагрузка на процессор вырастает до 50%.

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

Сама функция 

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

не нагружает процессор.

А функция 

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

нагружает от 0 до 5 процентов, в зависимости от размера массива Arr[].

 

Вот тестовый советник. Нужно по-переменно комментировать строки и проверять нагрузку процессора в диспетчере задач.

Файлы:
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:

На картинке что-то не так с данными в колонке Opening Time.

Да. Я использовал TimeToStr(OrderOpenPrice(),TIME_MINUTES|TIME_SECONDS);

Не знаю, почему так.

 
Реter Konow:

Должен признать, что результаты теста меня немного удивили.

И так, речь идет о постоянных вызовах функций на частоте 16 мс.

Оказывается, сильнее всего процессор нагружает именно инициализация массива пикселей при рисовании.

Но самым странным, оказалось, что переодический вызов функции

нагружает процессор на 10 - 15%. 

Также, вызовы 

нагружают на эти же 10 - 15%.

При этом, одновременные вызовы всех трех функций

Не приводят к складыванию нагрузки. Нагрузка по прежнему остается 10-15%.

Однако, если присовокупить к этим вызовам постоянный цикл переинициализации массива в миллион ячеек

то, нагрузка на процессор вырастает до 50%.

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

Сама функция 

не нагружает процессор.

А функция 

нагружает от 0 до 5 процентов, в зависимости от размера массива Arr[].

Реter Konow:

Должен признать, что результаты теста меня немного удивили.

И так, речь идет о постоянных вызовах функций на частоте 16 мс.

Оказывается, сильнее всего процессор нагружает именно инициализация массива пикселей при рисовании.

Но самым странным, оказалось, что переодический вызов функции

нагружает процессор на 10 - 15%. 

Также, вызовы 

нагружают на эти же 10 - 15%.

При этом, одновременные вызовы всех трех функций

Не приводят к складыванию нагрузки. Нагрузка по прежнему остается 10-15%.

Однако, если присовокупить к этим вызовам постоянный цикл переинициализации массива в миллион ячеек

то, нагрузка на процессор вырастает до 50%.

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

Сама функция 

не нагружает процессор.

А функция 

нагружает от 0 до 5 процентов, в зависимости от размера массива Arr[].


Пётр, такое стойкое ощущение, что вы не слушаете ничего что вам отвечают на протяжении сотен страниц.
Перечитайте тему - там есть ответы на вопрос "почему так"

 
Реter Konow:

Да. Я использовал TimeToStr(OrderOpenPrice(),TIME_MINUTES|TIME_SECONDS);

Не знаю, почему так.

Потому что надо вместо OrderOpenPrice поставить OrderOpenTime()

Причина обращения: