All streams
Search
Write a publication
Pull to refresh
147
0
Алексей Борисов @Imp5

Программный инженер

Send message
Работает, но как-то странно. Если набрать в консоли Far-а, то печатает пустую строку. Если в cmd.exe, то работает правильно.
не подходит,
echo "ON"
напечатает в кавычках
кстати, кто-нибудь знает, как при помощи echo напечатать одно слово ON?
А ещё в Windows есть аналог команды 'cd', называется она 'cd'
Очень круто! Даже не приходило в голову решать эту задачу при помощи Particle Filter.
Очень хочется увидеть фотографии из коридора, чтобы было понятнее, с чем придётся иметь дело. Будет ли он огорожен от прямого солнечного света? Если вдруг лазерное пятно не будет видно на освещённой солнцем панели, или солнце будет освещать половину маркера, то это не очень приятный сюрприз.
Как вы отучили уток плавать в бассейне?
На самом деле, на C++ там написан только менеджмент ресурсов и рендер, всё остальное на яве.
откуда такая информация?
Планирую в одной из следующих статей выложить идеальные, с моей точки зрения, структуры для работы с заголовками протоколов стека TCP/IP

Давай. А мы посмотрим, как оно заработает на PowerPC
ага, а потом нарваться в самый неожиданный момент на LE / BE
Виталий, я рассчитываю, что через 2 дня будет готов новый рендер травы.
а да, точно, спасибо :)
тогда uint64_t
Не переполнится, я посчитал, перед тем как делать.
1920 * 1080 * 256 = 0x 1FA4 0000

Размер long int сейчас обычно такой же как и int, возможно, вы имели в виду long long int.
А да, не заметил сразу, что умножения вынесены за цикл. Да, так будет быстрее.
Только сначала лучше померить, действительно ли это скомпилируется в более быстрый код. У меня было несколько идей по поводу второго цикла: пробовал производить вычисления вместо обращения к палитре, пробовал считать по 4 байта и писать сразу dword, пробовал разносить чтение и запись на 1024 байта, пробовал вручную разворачивать цикл, в итоге оставил самый простой вариант, как самый быстрый.
ещё по поводу ошибок:

int b[L];
палитру лучше было сделать из (unsigned char)

lAB += (int)(valueR * 0.299 + valueG * 0.587 + valueB * 0.114);
при округлении в этом месте будет теряться много информации, например, если весь буфер будет заполнен синим цветом с яркостью 6, то переменная lAB, которая средняя яркость всех пикселей, будет равна 0.

ну и ещё много мелочей, вроде «return 0;» в функции которая возвращает void, кучи лишних приведений типов и ни о чём не говорящих названий переменных.

(у поста уже 17 плюсов, кто все эти люди? :) )
Основная ошибка автора — использование распараллеливания там, где это не нужно. Вычислений почти нет, обращений к памяти много. Основное время процессор будет ждать передачи дынных, на сколько потоков это не раскидывай — лучше не будет.

Вместо 1.0 максимальная яркость принята за 256, поэтому константы почти такие же как у автора.
77 / 256 ~= 0.3
150 / 256 ~= 0.586
29 / 256 ~= 0.113

По поводу умножения и сдвига на 8 (деления на 256): да, константы для операций с фиксированной точкой могут показаться странными.
Эта статья — отличный пример неправильного использования многопоточности.
Вычислений почти нет, в основном работа с памтятью. Вот код, который на на 15% быстрее и выполняется в одном потоке:
void contrastFilter(unsigned char * imageData, size_t dataSize, int contrast) // contrast (256 - normal)
{
  unsigned char buf[256];
  unsigned int midBright = 0;
  for (size_t i = 0; i < dataSize; i += 3)
    midBright += imageData[i] * 77 + imageData[i + 1] * 150 + imageData[i + 2] * 29;
  midBright /= (256 * dataSize / 3);
  for (size_t i = 0; i < 256; i++)
  {
    int a = (((i - midBright) * contrast) >> 8) + midBright;
    if (a < 0) buf[i] = 0;
      else if (a > 255) buf[i] = 255;
        else buf[i] = a;
  }
  for (size_t i = 0; i < dataSize; i++)
    imageData[i] = buf[imageData[i]];
}

Information

Rating
Does not participate
Registered
Activity