четверг, 12 января 2012 г.

The Matrix

Давно я сюда ничего не писал. Всё времени формулировать мысли нет. но вот сдал все экзамены и всё-же решил опубликовать то что написал в ночи перед экзаменами. Матрица.


Есть сотни реализаций, на разных языках и графика и консоль, что хочешь. Но свой велосипед всегда приятнее.

Подробности под катом.



К тому-же сессия, надо учить экономику а она в голову не лезет. И тут я вспомнил что на С++ писал только с помощью Qt. Решил что это не порядок. Почему бы не написать что-то например с помощью gcc? В моём случае g++. И попутно изучить редактор emacs. Флаг в руки и в атаку. Решил написать заставку из матрицы. Для позиционирования символов использовал ncurses. Ещё хочеться использовать свой i5 на полную катушку. Поэтому решил сделать матрицу ещё и многопоточной. Использовал pthread.

Давайте рассмотрим костыли.
ncurses поста в использовании google кишит ссылками на эту тему. Алгоритм рисования одной пробегающей "змейки" в матрице тоже достаточно прост.



void print_snake(int col,int len,int speed){
//print 1 snake in col column with len length and speed speed;
    int i;
    for (i = 0;i<count_row;i  ){
 TS_print_char(i,col);
 if (i>=len){
            TS_print_pass(i-len,col);// when snake is almost on screen is time to clear her tail
 }
 usleep(speed);
    }
    for (i=count_row-len-1;i<count_row;i  ){
        TS_print_pass(i,col);//clear tail when snake is under screen border
 usleep(speed);
    }
}

TS_print_char - моя потоко-безопасная функция вывода случайного символа на экран в место x y.

Сначала я делал refresh каждый раз при выводе символа. Но посмотрел что програмка при выполнении занимает полтора процессора. и Ужаснулся. Вывел обновление в отдельный поток, с периодом в 10000 микросекунд. Теперь программка занимает каких-то 15 - 20 % процессора, и это при полном экране ( более 100 потоков) . Ах я ещё не говорил. Количество потоков зависит от количества столбцов помещающихся на консоль. Вот собственно и всё.

Просмотреть код можно тут:
КОД
скачать запустить, или скомпилировать и запустить можно от сюда
git clone git@github.com:alexkutsan/The-Matrix.git
или

Код легко читаем. Разобраться в нём - раз плюнуть. Я старался максимально снабдить комментариями

Матрица - хорошее упражнение. Алгоритм не сложный легко наверстать набивку кода ручками. При этом немного подумать о функционале, и многопоточности. В перспективе сделаю матрицу на технологии cuda. Но пока-что не могу победить драйвер видеокарты под Linux.И можно сделать матрицу на OpenGL.

Читать дальше......