В 1000 раз быстрее

Публикация № 1096524

Разработка - Практика программирования

Изображения tinyraytracer Трассировка лучей Перфолента randraytracer

12
Реализация алгоритма трассировки лучей на новом языке программирования "Перфолента"

 

Предлагаю на время отвлечься от задач автоматизации, и погрузиться в загадочный и увлекательный мир 3D моделирования. Дочитавшим до конца - сюрприз)

 

Предыстория

Изначально программа для отрисовки сцен при помощи алгоритма трассировки лучей tinyraytracer была написана на языке C++ (статья на Хабре).
 
Потом на язык OneScript программу перевел Michael Rybakin (проект на GitHub).
 

К сожалению, реализация этого алгоритма на OneScript имеет один критический недостаток - картинка формируется слишком медленно. Программа интенсивно использует структуры данных, что приводит к большим накладным расходам.

Забегая вперёд, скажу, что труды Mr-Rm не пропали даром, и его программа засияла новыми красками. Мной была проделана работа по адаптации этой программы под новый язык "Перфолента" Сергея Рогаткина.

Кто не знает, "Перфолента" - это "повзрослевший" язык 1С, который из прикладного инструмента, превратился в самостоятельный язык программирования. Он получил все необходимые для современного языка технологии, при этом сохранив привычные возможности и совместимый синтаксис. Но, в отличие от 1С и OneScript, "Перфолента" - это компилятор со статической типизацией, поэтому типы для всех объявляемых переменных, функций и их аргументов должны быть заранее определены.

 
Программа
 
Процесс адаптации программ не сложный, но требует внимательности и терпения) Надеюсь, что в будущем эту задачу удастся автоматизировать.
Итак, мы получили работающий код на языке "Перфолента".
 
Текст программы без оптимизации:
 
 
Хм, программа хоть и стала работать быстрее, но не намного - где-то раза в 2,5. Но ещё рано унывать! Вспоминаем про тяжелые структуры данных, и заменим их на более оптимальные классы.
 
Текст программы с классами:

//Код, оптимизированный под возможности Перфоленты

#ИспользоватьСтандартнуюБиблиотеку

//В процессе экспериментов выяснилось, 
//что Вектор лучше делать Структурой
//а Материал, Свет и Сферу классами, тогда производительность возрастает 
//примерно на 25 процентов по сравнению с вариантом когда только структуры
//и примерно на 8 процентов по сравнению с вариантом, когда только классы


// ------------------
Структура Вектор
    &ВидноВсем Поле x тип ДВещ
    &ВидноВсем Поле y тип ДВещ
    &ВидноВсем Поле z тип ДВещ
    //---------------------------
    &ВидноВсем 
    Конструктор(px тип ДВещ, py тип ДВещ, pz тип ДВещ) 
        x = px
        y = py
        z = pz
    КонецКонструктора

#Область ПереопределениеОператоровВектора    

    //Переопределим для теста операторы сложения, вычитания, умножения и скалярного произведения векторов
    //проверим в функции Отражение()
    
    //---------------------------
    &ВидноВсем, ОбщийДляКласса 
    Оператор +(В1 тип Вектор, В2 тип Вектор) тип Вектор 
        возврат Новый Вектор( В1.x+В2.x, В1.y+В2.y, в1.z+В2.z );
    КонецОператора   

    //---------------------------
    &ВидноВсем, ОбщийДляКласса 
    Оператор -(В1 тип Вектор, В2 тип Вектор) тип Вектор 
        возврат Новый Вектор( В1.x-В2.x, В1.y-В2.y, В1.z-В2.z );
    КонецОператора   

    //---------------------------
    &ВидноВсем, ОбщийДляКласса 
    Оператор *(В1 тип Вектор, ч тип ДВещ) тип Вектор 
        возврат Новый Вектор( В1.x*ч, В1.y*ч, В1.z*ч );
    КонецОператора   

    //---------------------------
    &ВидноВсем, ОбщийДляКласса 
    Оператор *(В1 тип Вектор, В2 тип Вектор) тип ДВещ
        возврат В1.x*В2.x + В1.y*В2.y + В1.z*В2.z;
    КонецОператора   

#КонецОбласти

    //---------------------------
    &ВидноВсем,ОбщийДляКласса 
    Процедура Печать( В1 тип Вектор )
        ВыводСтроки "("+В1.x+","+В1.y+","+В1.z+")";
    КонецПроцедуры    
    
    //---------------------------
    &ВидноВсем,ОбщийДляКласса 
    Функция Минус( В1 тип Вектор ) тип Вектор 
        возврат Новый Вектор( -В1.x, -В1.y, -В1.z );
    КонецФункции    
    
    //---------------------------
    &ВидноВсем,ОбщийДляКласса 
    Функция Сумма( В1 тип Вектор, В2 тип Вектор ) тип Вектор
        возврат Новый Вектор( В1.x+В2.x, В1.y+В2.y, в1.z+В2.z );
    КонецФункции    
    
    //---------------------------
    &ВидноВсем,ОбщийДляКласса 
    Функция Разность( В1 тип Вектор, В2 тип Вектор ) тип Вектор
        возврат Новый Вектор( В1.x-В2.x, В1.y-В2.y, В1.z-В2.z );
    КонецФункции    
    
    //---------------------------
    &ВидноВсем,ОбщийДляКласса 
    Функция Умножить( В1 тип Вектор, ч тип ДВещ) тип Вектор
        возврат Новый Вектор( В1.x*ч, В1.y*ч, В1.z*ч );
    КонецФункции    
    
    //---------------------------
    &ВидноВсем,ОбщийДляКласса 
    Функция СкалярноеПр( В1 тип Вектор, В2 тип Вектор ) тип ДВещ
        возврат В1.x*В2.x + В1.y*В2.y + В1.z*В2.z;
    КонецФункции    
    
    //---------------------------
    &ВидноВсем,ОбщийДляКласса 
    Функция Норма( В1 тип Вектор ) тип ДВещ
        возврат Sqrt( В1.x*В1.x+В1.y*В1.y+В1.z*В1.z );
    КонецФункции
    
    //---------------------------
    &ВидноВсем,ОбщийДляКласса 
    Функция КвНормы( В1 тип Вектор ) тип ДВещ
        возврат В1.x*В1.x+В1.y*В1.y+В1.z*В1.z;
    КонецФункции
    
    //---------------------------
    &ВидноВсем,ОбщийДляКласса 
    Функция Нормализация( В1 тип Вектор ) тип Вектор
        норма=Вектор.Норма( В1 );
        В1.x = В1.x/норма;
        В1.y = В1.y/норма;
        В1.z = В1.z/норма;
        возврат В1;
    КонецФункции
КонецСтруктуры


//***************************
Программа tiny

	//---------------------------
	Поле МАКС_Число тип ДВещ;
	Поле ГЛУБИНА_РЕКУРСИИ тип Целое;
	
	Поле НулевойВектор тип Вектор;
	Поле ЕдиничныйВектор тип Вектор;
	Поле ЕдиничныйВекторX тип Вектор;
	Поле ЕдиничныйВекторY тип Вектор;
	Поле ЕдиничныйВекторZ тип Вектор;
	
	Поле ЦветФона тип Вектор;
	Поле ЦветБелый тип Вектор;
	Поле ЦветЖелтый тип Вектор;
	
	Поле ПлиткаБелая тип Материал;
	Поле ПлиткаЖелтая тип Материал;
	
	Поле Сферы тип Сфера[];
	Поле Освещение тип Свет[];
	Поле Ширина тип Целое;
	Поле Высота тип Целое;
	Поле УголЗрения тип ДВещ;
	Поле Кадр тип Вектор[];
	
	
	Функция Норм_Цвет(знач цв тип ДВещ) тип ДВещ
		возврат Цел(255*Макс(0, Мин(1,цв)));
	КонецФункции    
	
	
	// ------------------
	
	Функция Сфера_Пересечение(Сф тип Сфера,Исх тип Вектор, Напр тип Вектор, ссыл Расст тип ДВещ) тип Булево
		
		КЦентру = Вектор.Разность( Сф.Центр, Исх );
		перем пр тип ДВещ = Вектор.СкалярноеПр( КЦентру, Напр );
		перем д2 тип ДВещ = Вектор.КвНормы( КЦентру ) - пр*пр;
		перем р2 тип ДВещ = Сф.Радиус*Сф.Радиус; 
		если д2 > р2 тогда
			возврат Ложь;
		КонецЕсли;
		
		р = Sqrt( р2 - д2 ); 
		Расст = пр - р;
		
		если Расст < 0 тогда
			Расст = пр + р;
			если Расст < 0 тогда
				возврат Ложь;
			КонецЕсли;
		КонецЕсли;
		
		возврат Истина;
		
	КонецФункции    
	
	Функция НайтиПересечения( Исх тип Вектор, Напр тип Вектор, ссыл Точка тип Вектор, ссыл Нормаль тип Вектор, ссыл Материал тип Материал ) тип Булево 
		Перем Расст тип ДВещ = 0;
		МинРасст = МАКС_Число;
		Для Каждого Сф из Сферы Цикл
			если (Сфера_Пересечение( Сф,Исх,Напр, Расст )) и (Расст < МинРасст) тогда
				МинРасст = Расст;
				Точка = Вектор.Сумма( Исх, Вектор.Умножить( Напр, Расст ) );
				Нормаль = Вектор.Нормализация( Вектор.Разность( Точка, Сф.Центр ) );
				Материал = Сф.Материал;
			конецесли;    
		КонецЦикла;
		
		// квадрат (-10,-10,-4) - (10,-30,-4)
		Если Напр.y < -0.001 Тогда
			р = -(Исх.y+4)/Напр.y;
			Если 0<р и р<МинРасст Тогда
				Т = Вектор.Умножить(Напр,р);
				Т = Вектор.Сумма(Т,Исх);
				Если Abs(Т.x)<10 и -30<Т.z и Т.z<(-10) Тогда
					МинРасст = р;
					Точка = Т;
					Нормаль = ЕдиничныйВекторY;
					Материал = ?( (Цел(0.5*Точка.x+1000)+Цел(0.5*Точка.z))%2=1, ПлиткаБелая, ПлиткаЖелтая );
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
		возврат МинРасст < 1000;
	КонецФункции
	
	// return I - N*2.f*(I*N);
	Функция Отражение( Луч тип Вектор, Норм тип Вектор ) тип Вектор
        
        //возврат Вектор.Разность( Луч, Вектор.Умножить( Норм, 2*Вектор.СкалярноеПр(Луч, Норм) ) );
        
        //воспользуемся переопределенными операторами для Вектора
        возврат Луч - Норм * 2д * (Луч * Норм) 
        
	КонецФункции
	
	Функция Преломление( Луч тип Вектор, Норм тип Вектор , КоэфПр тип ДВещ  ) тип Вектор
		Если КоэфПр=1 Тогда 
			Возврат Луч;
		КонецЕсли;  
		
		CosI = -Макс( -1, Мин( 1, Вектор.СкалярноеПр(Луч, Норм)));
		Если CosI>=0 Тогда
			_1; = 1/КоэфПр;
			Н = Норм;
		Иначе
			CosI = -CosI;
			_1; = КоэфПр;
			Н = Вектор.Минус(Норм);
		КонецЕсли;    
		К = 1 - _1;*_1;*(1-CosI*CosI);
		Если К<0 Тогда
			возврат ЕдиничныйВекторX;
		КонецЕсли;
		
		возврат Вектор.Сумма( Вектор.Умножить(Луч,_1;), Вектор.Умножить(Н,_1;*CosI-Sqrt(К)) );
	КонецФункции
	
	Функция ТрассироватьЛуч( Исх тип Вектор, Напр тип Вектор, Глубина тип Целое = 0 ) тип Вектор
		Перем Точка тип Вектор = Неопределено;
		Перем Нормаль тип Вектор = Неопределено;
		Перем Материал тип Материал = Неопределено;
		
		Перем ТеньТочка тип Вектор = Неопределено;
		Перем ТеньНормаль тип Вектор = Неопределено;
		Перем ВремМатериал тип Материал = Неопределено;
		
		если Глубина>ГЛУБИНА_РЕКУРСИИ или НЕ НайтиПересечения( Исх,Напр, Точка,Нормаль,Материал ) тогда
			возврат ЦветФона;
		конецесли;    
		
		СдвигПоНормали = Вектор.Умножить( Нормаль, 0.001 );
		
		ОтражНапр = Отражение(Напр,Нормаль); // нормализовано
		ОтражИсх = ?( Вектор.СкалярноеПр(ОтражНапр, Нормаль)<0, Вектор.Разность(Точка,СдвигПоНормали), Вектор.Сумма(Точка,СдвигПоНормали) );
		ОтражЦвет = ТрассироватьЛуч( ОтражИсх, ОтражНапр, Глубина+1 );
		
		ПреломНапр = Вектор.Нормализация(Преломление(Напр,Нормаль,Материал.КПрелом));
		ПреломИсх = ?( Вектор.СкалярноеПр(ПреломНапр, Нормаль)<0, Вектор.Разность(Точка,СдвигПоНормали), Вектор.Сумма(Точка,СдвигПоНормали) );
		ПреломЦвет = ТрассироватьЛуч( ПреломИсх, ПреломНапр, Глубина+1 );
		
		перем Яркость тип ДВещ = 0;
		перем Блик тип ДВещ = 0;
		Для Каждого Свет из Освещение цикл
			НапрКСвету = Вектор.Нормализация(Вектор.Разность(Свет.Поз, Точка));
			
			РасстДоСвета = Вектор.КвНормы(Вектор.Разность(Свет.Поз, Точка));
			ТеньИсх = ?( Вектор.СкалярноеПр(НапрКСвету, Нормаль)<0, Вектор.Разность(Точка,СдвигПоНормали), Вектор.Сумма(Точка,СдвигПоНормали) );
			
			если НайтиПересечения( ТеньИсх,НапрКСвету, ТеньТочка,ТеньНормаль,ВремМатериал ) 
				и Вектор.КвНормы(Вектор.Разность(ТеньТочка, ТеньИсх))<РасстДоСвета  тогда
				Продолжить;
			конецесли;    
			
			Яркость = Яркость + Свет.Ярк * Макс( 0, Вектор.СкалярноеПр( НапрКСвету, Нормаль ));
			
			//powf(std::max(0.f, -reflect(-light_dir, N)*dir), material.specular_exponent)*lights[i].intensity;
			Блик = Блик + Свет.Ярк * Pow(Макс(0, Вектор.СкалярноеПр(Отражение(НапрКСвету, Нормаль),Напр) ), Материал.ЭкспОтраж);
		КонецЦикла;
		
		возврат Вектор.Сумма(Вектор.Сумма(Вектор.Сумма( Вектор.Умножить( Материал.Цвет, Яркость*Материал.Альб0 ), Вектор.Умножить( ЕдиничныйВектор, Блик*Материал.Альб1 )),Вектор.Умножить( ОтражЦвет, Материал.Альб2 )),Вектор.Умножить( ПреломЦвет, Материал.Альб3 ));
	КонецФункции
	
	Процедура Рендер()
		
		Камера = Новый Вектор(0,0,0);
		Напр_Z =-Высота/(2*Tan(УголЗрения/2));
		Для верт=0 по Высота-1 Цикл
			линия = верт*Ширина;
			Напр_Y = -(верт+0.5д)+Высота/2д;
			Для гор=0 по Ширина-1 Цикл
				Напр_X = (гор+0.5д)-Ширина/2д;
				Направление = Вектор.Нормализация( Новый Вектор(Напр_X,Напр_Y,Напр_Z) );
				Кадр[линия+гор] = ТрассироватьЛуч( Камера, Направление );
			КонецЦикла;
		КонецЦикла;
		
	КонецПроцедуры
	
	Процедура СохранитьКадр( ИмяФайла тип Строка)
		файл=Новый ТекстовыйДокумент;
		
		файл.ДобавитьСтроку("P3");
		файл.ДобавитьСтроку(""+Ширина+" "+Высота);
		файл.ДобавитьСтроку("255");
		
	        //Для п=0 по Высота*Ширина-1 Цикл
	        Для Инд тип Целое = 0 по Высота*Ширина-1 Цикл //делаем переменную цикла целой!
	            Пиксел = Кадр[Инд];
	            перем м1 тип ДВещ = Пиксел.x; 
	            перем м2 тип ДВещ = Пиксел.y; 
	            перем м3 тип ДВещ = Пиксел.z; 
	            МаксИнт = Макс( м1, Макс(м2,м3) );
	            Если МаксИнт>1 Тогда
	                МаксИнт = 1/МаксИнт; 
	                Пиксел.x = Пиксел.x * МаксИнт;
	                Пиксел.y = Пиксел.y * МаксИнт;
	                Пиксел.z = Пиксел.z * МаксИнт;
	            КонецЕсли;
	            файл.ДобавитьСтроку( ""+Норм_Цвет(Пиксел.x)+" "+Норм_Цвет(Пиксел.y)+" "+Норм_Цвет(Пиксел.z) ); 
        	КонецЦикла;
        
	        ВыводСтроки ИмяФайла
		
		файл.Записать(ИмяФайла,КодировкаТекста.ANSI);
		
		
	КонецПроцедуры
	
	
	Процедура Старт
		
		Пи = 3.14159265359;
		МАКС_Число = 999999999999999;
		ГЛУБИНА_РЕКУРСИИ = 4;
		
		НулевойВектор=Новый Вектор(0, 0, 0);
		ЕдиничныйВектор=Новый Вектор(1, 1, 1);
		ЕдиничныйВекторX=Новый Вектор(1, 0, 0);
		ЕдиничныйВекторY=Новый Вектор(0, 1, 0);
		ЕдиничныйВекторZ=Новый Вектор(0, 0, 1);
		
		ЦветБелый=ЕдиничныйВектор;
		ЦветЖелтый=Новый Вектор(1, 0.7, 0.3);
		
		Ширина=1024;
		Высота=768;
		УголЗрения = Пи/3;
		Кадр = Новый Вектор[Ширина*Высота]
		
		ЦветФона=Новый Вектор(0.2, 0.7, 0.8);
		
		Серый =   Новый Материал( Новый Вектор( 0.4, 0.4, 0.3 ), 0.6, 0.3,0.1,0,    50,1 );
		Стекло =  Новый Материал( Новый Вектор( 0.6, 0.7, 0.8 ), 0,   0.5,0.1,0.8, 125,1.5 );
		Красный = Новый Материал( Новый Вектор( 0.3, 0.1, 0.1 ), 0.9, 0.1,0.0,0,    10,1 );
		Зеркало = Новый Материал( Новый Вектор( 1.0, 1.0, 1.0 ), 0,  10.0,0.8,0,  1425,1 );
		
		ПлиткаБелая =  Новый Материал( Вектор.Умножить(ЦветБелый,0.3),  1,0,0,0, 0,1 );
		ПлиткаЖелтая = Новый Материал( Вектор.Умножить(ЦветЖелтый,0.3), 1,0,0,0, 0,1 );
		
		Сферы = Новый Сфера[3]
		Сферы[0]=Новый Сфера(Новый Вектор(-3,   0,  -16), 2, Серый )
		Сферы[1]=Новый Сфера(Новый Вектор(-1.0,-1.5,-12), 2, Стекло )
		Сферы[2]=Новый Сфера(Новый Вектор( 1.5,-0.5,-18), 3, Красный )
		Сферы[3]=Новый Сфера(Новый Вектор( 7,   5,  -18), 4, Зеркало )
		
		Освещение = Новый Свет[2]
		Освещение[0]=Новый Свет(Новый Вектор(-20, 20,  20), 1.5)
		Освещение[1]=Новый Свет(Новый Вектор( 30, 50, -25), 1.8)
		Освещение[2]=Новый Свет(Новый Вектор( 30, 20,  30), 1.7)
		
		т0=ТекущаяУниверсальнаяДатаВМиллисекундах();
		Рендер();
		т1=ТекущаяУниверсальнаяДатаВМиллисекундах();
		ВыводСтроки("~"+ Цел(т1-т0) );
		
		СохранитьКадр(ЭтаПрограмма.Каталог+"out.ppm");
		
		Консоль.Пауза
		
	КонецПроцедуры
	
КонецПрограммы


// ------------------
Класс Материал 
    &ВидноВсем Поле Цвет тип Вектор
    &ВидноВсем Поле Альб0 тип ДВещ
    &ВидноВсем Поле Альб1 тип ДВещ
    &ВидноВсем Поле Альб2 тип ДВещ
    &ВидноВсем Поле Альб3 тип ДВещ
    &ВидноВсем Поле ЭкспОтраж тип ДВещ
    &ВидноВсем Поле КПрелом тип ДВещ
    //---------------------------
    &ВидноВсем 
    Конструктор(пЦвет тип Вектор, пАльб0 тип ДВещ, пАльб1 тип ДВещ, пАльб2 тип ДВещ, пАльб3 тип ДВещ, пЭкспОтраж тип ДВещ, пКПрелом тип ДВещ)  
        Цвет = пЦвет
        Альб0 = пАльб0
        Альб1 = пАльб1
        Альб2 = пАльб2
        Альб3 = пАльб3
        ЭкспОтраж = пЭкспОтраж
        КПрелом = пКПрелом
    КонецКонструктора
КонецКласса


// ------------------
Класс Свет 
    &ВидноВсем Поле Поз тип Вектор
    &ВидноВсем Поле Ярк тип ДВещ
    //---------------------------
    &ВидноВсем 
    Конструктор(пПоз тип Вектор, пЯрк тип ДВещ)  
        Поз=пПоз
        Ярк=пЯрк
    КонецКонструктора
КонецКласса

// ------------------
Класс Сфера 
    &ВидноВсем Поле Центр тип Вектор
    &ВидноВсем Поле Радиус тип ДВещ
    &ВидноВсем Поле Материал тип Материал
    //---------------------------
    &ВидноВсем 
    Конструктор( пЦентр тип Вектор, пРадиус тип ДВещ, пМатериал тип Материал )  
        Центр=пЦентр
        Радиус=пРадиус
        Материал=пМатериал
    КонецКонструктора
КонецКласса


 

Как видите, классы очень органично легли в программу, и это не удивительно, потому что они были в исходной версии на С++.

Что же теперь со скоростью? Это невероятно! Программа стала выполняться быстрее в 500 раз! Это конечно не так быстро как в C++, но учитывая гораздо более простой процесс разработки, результат более чем достойный.

 
Что еще можно предпринять для ускорения программы? Добавим в программу параллельности.
 
Текст изменений:

//1) добавляем поля

    //переменные для параллельного цикла
    Поле Камера тип Вектор;
    Поле линия тип ДВещ;
    Поле Напр_Y тип ДВещ;
    Поле Напр_Z тип ДВещ;

//2) изменяем процедуру Рендер

    Процедура Рендер()
        
        Камера = Новый Вектор(0,0,0);
        Напр_Z =-Высота/(2*Tan(УголЗрения/2));
        Для верт=0 по Высота-1 Цикл
            линия = верт*Ширина;
            Напр_Y = -(верт+0.5д)+Высота/2д;
            
            //распараллелим
            ПараллельныеДействия.Для(0, Ширина-1, ПолучитьДелегат(,ТелоЦикла,"ДействиеПроц<Целое>"))

        КонецЦикла;
        
    КонецПроцедуры
   

//3) добавляем тело параллельного цикла

   
    //---------------------------
    //тело параллельного цикла 
    Процедура ТелоЦикла(гор тип Целое)
        Напр_X = (гор+0.5д)-Ширина/2д;
        Направление = Вектор.Нормализация( Новый Вектор(Напр_X,Напр_Y,Напр_Z) );
        Кадр[линия+гор] = ТрассироватьЛуч( Камера, Направление );
    КонецПроцедуры    

 

Производительность возрастает кратно количеству имеющихся физических ядер процессора.
Все современные компьютеры оснащены минимум двух-ядерными процессорами, поэтому заявленный в заголовке прирост производительности в 1000 раз вам обеспечен. А если у вас есть еще и мощный сервер, то грех ему простаивать)
 
randraytracer
 
Теперь уже можно полноценно пользоваться программой. Давайте её немного усовершенствуем. Сделаем так, чтобы программа случайным образом размещала свет и объекты, а мы будем выбирать самые удачные кадры.
 

Вот что у меня получилось:

 
 
Ещё немного:
 

 

И ещё

 

 

И всё

 

 

Слабые варианты (определяются по малому времени рендеринга) программа пропускает сама. Еще программа берет параметры (из имени файла) уже существующих в папке изображений, для построения на их основе новых. Так что можно сказать, что программа учитывает ваши предпочтения. Богатый материал для психодиагностики)
 
Для скачивания доступны две программы:
randraytracer1 генерирует случайные изображения небольшого разрешения для отбора удачных вариантов.
randraytracer2 увеличивает разрешение и глубину рекурсии выбранных изображений.
Для их запуска потребуется установить дистрибутив языка "Перфолента"

 

12

Скачать файлы

Наименование Файл Версия Размер
randraytracer1.pfl
.pfl 23,81Kb
24.07.19
0
.pfl 23,81Kb Скачать
randraytracer2.pfl
.pfl 23,46Kb
24.07.19
0
.pfl 23,46Kb Скачать

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. SerVer1C 197 24.07.19 15:21 Сейчас в теме
Сравнивать IL под .Net платформу с псевдобайткодом стековой машины 1с, думаю, не уместно, т. к. последний в алгоритмических задачах, мягко сказать, просаживается по производительности в сотни раз.
blackhole321; +1 Ответить
3. Perfolenta 183 24.07.19 15:52 Сейчас в теме
(1) зато хороший пример того, что иногда производительность имеет значение...
пользоваться программой до переделки совершенно не возможно...
а еще, показывает, что при необходимости критичный код перевести на Перфоленту не трудно...
и картинки красивые получились, хоть на рабочий стол ставь :)
2. vasvl123 94 24.07.19 15:37 Сейчас в теме
Цель статьи наглядно продемонстрировать возможности нового языка. Ранее недоступные.
Jeka44; chebser; Soloist; fancy; Fox-trot; Perfolenta; +6 Ответить
4. Perfolenta 183 24.07.19 15:57 Сейчас в теме
(2) кстати, да, интересный ход, пропускать слабые кадры по времени рендеринга... если шары расположились кучкой друг за другом, то картинка вряд-ли будет интересной!
5. shard 251 24.07.19 16:30 Сейчас в теме
генератор картинок на рабочий стол, стандартные обои кубунты некоторых релизов напомнило)
6. Perfolenta 183 31.07.19 19:40 Сейчас в теме
Отрендерил в 4К и посмотрел на большом телевизоре.. гораздо интереснее выглядит, чем сжатые кадры маленького разрешения, которые тут в скриншотах показаны...
vasvl123; +1 Ответить
Оставьте свое сообщение

См. также

Remotrix - простая консоль SQL-запросов к удаленной базе Bitrix через админку 6

Инструменты и обработки Системный администратор Программист Архив с данными Windows Абонемент ($m) WEB

Время от времени требуется выполнять прямые запросы к базе сайта на Bitrix. Делать это через web-интерфейс в админке - не слишком удобно, так родился Remotrix.

1 стартмани

15.11.2019    311    1    MadDAD    0       

Замена MS Project в интегрированных системах 6

Инструменты и обработки Программист Архив с данными 1cv8.cf Windows Абонемент ($m) WEB Работа с интерфейсом

Сразу надо сказать, что речь идет о замене только наиболее сложной части - расчете расписания с выравниванием загрузки ресурсов. Рисовать и редактировать диаграмму Ганта, учитывать факт, сравнивать планы и разрабатывать отчеты придется самим. Хотя для разработчиков корпоративных систем все это не выглядит чересчур сложным.

1 стартмани

31.10.2019    1082    5    PeterAlmazov    0       

Подсистема настройки управляемых блокировок 12

Конфигурация Системный администратор Программист Руководитель проекта Конфигурация (md, cf) v8::blocking 1cv8.cf Абонемент ($m) Практика программирования

Подсистема настройки управляемых блокировок предназначена для наложения управляемой блокировки на регистры при проведении документов.

2 стартмани

28.10.2019    1501    2    igormiro    6       

ODa - Android приложение, для подключения к любой конфигурации 1С используя OData протокол. 60

Инструменты и обработки no Приложение (apk) 1cv8.cf Абонемент ($m) Мобильная разработка

В платформе 1С реализована прекрасная возможность работы с открытым веб-протоколом OData, который предоставляет любой другой платформе интерфейс доступа - возможность запрашивать и обновлять данные из базы 1С. Далее в статье будут описаны особенности работы мобильного приложения ODa, которое без программировании на стороне Android'a позволит разработчикам публиковать базы 1С, что даст возможность обычным пользователям взаимодействовать с объектами метаданных, используя нативные элементы интерфейса платформы Android.

1 стартмани

22.10.2019    3566    4    Kosigo    11       

Что умеет Русский Фокс? 11

Статья Программист Архив с данными Россия Windows Абонемент ($m) Языки и среды

Краткий обзор русскоязычного объектно ориентированного 1С подобного языка программирования Русский Фокс.

1 стартмани

30.09.2019    1665    andreosh    16       

Распаковка хранилища значений средствами MS SQL Server 15

Инструменты и обработки Программист Компонента, плагин (dll, vbs,..) MS SQL Абонемент ($m) Практика программирования

Способ извлечения данных из 1С-ного "ХранилищеЗначений" в MS SQL Server с помощью самописной скалярной функции (без использования платформы 1С).

1 стартмани

23.09.2019    2948    SerVer1C    11       

Расширяем возможности MS SQL Server с помощью хранимых процедур CLR 8

Инструменты и обработки Программист Архив с данными MS SQL Абонемент ($m) Практика программирования Разработка

Не хватает какого-то функционала на скуле для обработки данных? Тогда он (новый функционал) идет к вам.

1 стартмани

02.09.2019    3697    SerVer1C    9       

Получение данных из Web-сервиса 1С в php, с авторизацией логином и паролем на кириллице 8

Инструменты и обработки Программист Архив с данными Абонемент ($m) WEB

В рамках задачи получения данных из 1С средствами web-сервиса, часто возникает потребность авторизации на web-сервисе под учетными данными уже существующих пользователей. Но так как "логины" и "пароли" уже занесены в кириллической раскладке, возникает ошибка авторизации, в то время как логины в латинской раскладке работают корректно. Это возникает из-за того что кодировка текста (логина и пароля) отличается от той что понимает web-сервис 1С (UTF-8).

1 стартмани

01.08.2019    1452    1    miha889    0       

Упражнения на Перфоленте. Парсим технологический журнал 1С 20

Статья Системный администратор Программист Архив с данными Windows Абонемент ($m) Сервисные утилиты Инструментарий разработчика Практика программирования Разработка

В статье рассматривается парсинг технологического журнала 1С на новом языке программирования Перфолента. Статья может быть полезна как для парсинга, так и для изучения некоторых особенностей языка.

1 стартмани

31.07.2019    3653    Perfolenta    62       

Перфолента, первое знакомство. Новый язык программирования 141

Инструменты и обработки Программист Приложение (exe) Windows Абонемент ($m) Практика программирования Инструментарий разработчика

Первое знакомство с новым языком программирования Перфолента. В статье описано назначение языка, причины его появления, основные характеристики и возможные варианты использования.

22.07.2019    15054    107    Perfolenta    165       

Настраиваемое мобильное приложение для сканирования штрихкодов 10

Инструменты и обработки Программист Приложение (apk) Android Абонемент ($m) Практика программирования Сканер штрих-кода Мобильная разработка

Обзор приложения для сканирования штрихкодов с возможностью обработки результата сканирования произвольным кодом для совместного использования с Android приложениями через Intent и взаимодействие с 1С конфигурациями через web-сервис.

1 стартмани

14.01.2019    3996    2    inord777    5       

OneScript - WinExt: Работа с окнами, управление мышкой и клавиатурой 74

Инструменты и обработки Программист Архив с данными Windows Абонемент ($m) OneScript

Цель: Инструмент позволяющий автоматизировать управление окнами, мышкой, посылать нажатия клавиш. Задачи: - Поиск окна по части заголовка - Поиск фрагмента изображения похожего на сохраненный в файле кусок. - Возможность позиционировать курсор, нажимать кнопки мышки. - Возможность посылать нажатия клавиш

1 стартмани

29.11.2018    8434    8    ret-Phoenix    30       

Разработка внешних компонент на ассемблере goAsm 129

Статья Программист Архив с данными Windows Абонемент ($m) Практика программирования

Создание внешней компоненты по технологии Com "с нуля", используя ассемблер goAsm.

1 стартмани

26.11.2018    7709    6    chessman    40       

Рабочее Место Кассира (РМК+) для фискальных регистраторов АТОЛ (всех) и Штрих (тоже всех), без 1С и вообще без АСУТ 7

Инструменты и обработки Бухгалтер Руководитель проекта Архив с данными Россия Windows Кассовые операции Розничная торговля Абонемент ($m) Фискальный регистратор Рабочее место

Не хотите покупать 1С? У вас всего 5-10 товаров или услуг? Тогда это решения для вас! Проложение Рабочее Место Кассира+ (РМК+) решает 1 задачу: соблюдение 54-ФЗ Приложение позволяет печатать чеки на фискальных регистраторах Атол и Штрих без покупки 1С. При этом выполняются все требования 54-ФЗ! Ели вам нет необходимости внедрять учет, если вам не нужно ничего, кроме печати чеков - РМК+ самое дешевое решение на рынке. Отличительная особенность: открытый код на VBS

1 стартмани

07.09.2018    5232    5    mat skywalker    10       

1C Форматер кода 5

Инструменты и обработки Программист Приложение (exe) Россия Абонемент ($m) Инструментарий разработчика

Автоматическое форматирование кода 1С

1 стартмани

24.08.2018    4636    2    admin_at_gkgeostroy    9       

Подключение к хранилищу конфигурации через HTTPS 59

Статья Программист Архив с данными Windows Абонемент ($m) WEB

В публикации пошагово описывается публикация хранилища на веб сервере и подключение к ней, используя протокол HTTPS и SSL сертификаты.

1 стартмани

15.08.2018    8853    2    KonS    14       

РусскийФокс и ClickerMann заносят данные в 1С 5

Инструменты и обработки Программист Архив с данными Россия Windows Абонемент ($m) Сервисные утилиты Практика программирования

Новый объектно-ориентированный русскоязычный 1С-подобный язык программирования РусскийФокс. . РусскийФокс создает сценарии для Clickermann. Сценарий заполняет справочник в 1С.

1 стартмани

21.07.2018    6650    1    andreosh    20       

РусскийФокс и OpenOffice, а также исследование объектов 5

Инструменты и обработки Программист Архив с данными Россия Windows Абонемент ($m) Практика программирования

Новый объектно-ориентированный русскоязычный 1С-подобный язык программирования РусскийФокс. . Взаимодействие с OpenOffice. GitHub https://github.com/UfaScript/RusFox

1 стартмани

12.07.2018    4083    1    andreosh    2       

РусскийФокс. Настройка NotePad++, 1C-подобные функции и операторы и создание объектов 11

Статья Программист Архив с данными Россия Windows Абонемент ($m) Практика программирования Математика и алгоритмы

Новый объектно-ориентированный русскоязычный 1С-подобный язык программирования РусскийФокс. Создание объектов и настройка NotePad++. GitHub https://github.com/UfaScript/RusFox

1 стартмани

06.07.2018    7682    1    andreosh    12       

РусскийФокс — 1С-подобный язык программирования 8

Инструменты и обработки Программист Архив с данными Россия Windows Абонемент ($m) Практика программирования Математика и алгоритмы

Новый объектно-ориентированный русскоязычный 1С-подобный язык программирования РусскийФокс. Знакомство.

1 стартмани

03.07.2018    6623    1    andreosh    50       

Подсветка синтаксиса 1С для программы NotePad ++ 9

Инструменты и обработки Программист Архив с данными Абонемент ($m) Инструментарий разработчика

После установки подсветки, в программе "NotePad ++" будет подсвечиваться код 1С. Очень удобно работать с подсвеченным кодом... В архиве с файлом инструкция по установке....

1 стартмани

15.05.2018    7291    15    IceEvgen    4       

Фоновые задания в http-сервисах OneScript 49

Статья Программист Архив с данными Абонемент ($m) OneScript

В статье описана библиотека, реализующая механизм фоновых заданий в http-сервисах OneScript, а также некоторые обновления платформы 1.0.19

1 стартмани

28.03.2018    13060    4    blackhole321    14       

Кэшируем данные в приложениях OneScript 7

Статья Программист Архив с данными Абонемент ($m) OneScript

В статье описана библиотека, позволяющая кэшировать данные в памяти, в ваших приложениях OneScript.

1 стартмани

25.03.2018    7115    2    blackhole321    2       

MS Office Excel для пользователей. Подводные камни и полезные возможности 57

Статья no Архив с данными Абонемент ($m) Пользователю системы Загрузка и выгрузка в Excel

Приветствую, дорогие читатели! Этот материал рассчитан на пользователей, имеющих минимальный опыт работы в MS Ofice Excel. Предполагается, что пользователь уже умеет рисовать таблицы, раскрашивать шрифты, границы, фон ячеек и т.п. В материале будет показано как облегчить свою повседневную работу настроив удобно интерфейс, изучите самые часто используемые функции, возможности и всё это на понятном и доступном языке. Меня часто просили научить работать в Excel, что однажды пришлось сесть и написал небольшой самоучитель в стиле "просто и коротко о главном". Читайте, учитесь, а если вас просят "Научи" или "Подскажи", то можете смело дать ссылку на эту статью, тем самым сэкономив своё время. Хотите, чтобы ваши сотрудники стали эффективней, тогда тоже, порекомендуйте им эту статью. Приятного изучения!

1 стартмани

18.03.2018    13864    18    akor77    12       

Интеграция с ГИС ЖКХ, описание подготовительного этапа 17

Статья Программист Архив с данными Энергетика и ЖКХ Россия Абонемент ($m) Внешние источники данных

Как начать знакомство с ГИС ЖКХ (бонусом пример выгрузки адресов, описания зданий и координат из 2GIS).

1 стартмани

02.02.2018    15440    3    CSiER    9       

Веб-разработка на 1С (1Script) 142

Инструменты и обработки Программист Архив с данными Абонемент ($m) Практика программирования

Дорогие коллеги, под новый год хочется сделать небольшой сюрприз. Я уже два года обещаю сделать движок веб-разработки для 1С-ников, и вот, наконец, есть что показать. Этим новогодним постом я открываю сериал "Веб-разработка для 1С-ников". Все, кто знаком с проектом OneScript – добро пожаловать! Остальные, тоже не стесняйтесь!

1 стартмани

28.12.2017    24998    22    Evil Beaver    81       

Check Info. Расширенная информация по чеку по QR-коду 11

Инструменты и обработки no Архив с данными Розничная и сетевая торговля (FMCG) Россия Android Кассовые операции Абонемент ($m) Мобильная разработка

Мобильное приложение для расширенной проверки чеков по QR-коду. Показывает всю информацию по чеку - название магазина, адрес, состав чека (наименование позиции, количество, цена).

1 стартмани

29.10.2017    9556    7    koks17v    6       

Учет рабочего времени, учет времени выработки процессов 8

Инструменты и обработки Программист Приложение (exe) Россия УУ Windows Учет рабочего времени Абонемент ($m) Универсальные обработки

Программа позволяет вести учет рабочего времени исполнения запущенных задач.

4 стартмани

19.10.2017    8213    4    protexprotex    5       

Получение RGB (HEX) цвета 8

Инструменты и обработки Программист Печатная форма (mxl) Windows Абонемент ($m) Работа с интерфейсом

Получение RGB (HEX) цвета из любого вида цветов 1С.

1 стартмани

14.09.2017    10973    21    AlexxSys    9       

OneScript SQL - работа с СУБД 114

Инструменты и обработки Программист Архив с данными Абонемент ($m) OneScript

Внешняя компонента, реализующая возможность работы с базами данных из OneScript (https://infostart.ru/public/548028/ , https://infostart.ru/public/327581/). Поддерживаются базы: sqlite, MS SQL Server, MySQL, PostgreSQL.

1 стартмани

12.09.2017    17540    16    ret-Phoenix    35       

Правила и приемы доработки типовых конфигураций 1С для облегчения их дальнейшей поддержки и обновления 152

Статья Программист Архив с данными Абонемент ($m) Практика программирования

В первую очередь, статья адресована разработчикам 1С, но надеюсь, что интересно будет не только им.

1 стартмани

18.07.2017    28777    786    Tavalik    58       

OneScript и Ajax. Создание GET-запроса 6

Инструменты и обработки Программист Архив с данными ИТ-компания Россия Абонемент ($m) OneScript

Создание GET-запроса на OneScript с помощью библиотеки UfaScript.osb. Описание шаблона OneScript.zip для Joomla. Главный файл шаблона Index.php генерируется функциями из библиотеки UfaScript.osb.

1 стартмани

05.06.2017    7058    andreosh    0       

Мониторинг баз данных 1С. Автоматизация обновления конфигураций 8

Инструменты и обработки Системный администратор Архив с данными Россия Windows Абонемент ($m) Журнал регистрации Администрирование данных 1С Распределенная БД (УРИБ, УРБД)

Если вы сталкивались с обновлением большого количества баз в рамках РИБ, то данная программа позволяет автоматизировать плановые обновления конфигурации, платформы на различном количестве физических\виртуальных серверов. Также администратор видит выполнение бекапов SQL информационных баз. Программа полезна, если у вас на поддержке большое количество РИБ 1С.

1 стартмани

05.04.2017    12365    10    vlkvlkvlk    6       

CSV Converter 6

Инструменты и обработки Программист Архив с данными Windows Абонемент ($m) Инструментарий разработчика Универсальные обработки Разработка внешних компонент

Представляю вам мою первую программу. CSV Converter. Компонента читает файл с разделителями и переводит в структуру, которую мы можем получить, выгрузив любую ТЗ в файл стандартной функцией "ЗначениеВФайл()".

1 стартмани

03.03.2017    11574    4    ziercool    2       

Свой http-cервис проверки орфографии 10

Инструменты и обработки no Архив с данными Абонемент ($m) WEB

http-cервис проверки орфографии. Обвертка для использования библиотеки PyEnchant как http-сервис.

1 стартмани

14.02.2017    8291    pallid    13       

Менеджер буфера обмена с поддержкой 1С - ClipAngel 1.85 72

Инструменты и обработки no Архив с данными Windows Абонемент ($m) Сервисные утилиты Инструментарий разработчика

Этот помощник запоминает все, что вы копируете в буфер обмена, и позволяет легко и быстро найти в истории нужную информацию и вставить ее в любое окно.

1 стартмани

17.01.2017    29752    70    tormozit    196       

1С:EDT ("Eclipse-Конфигуратор"). Пример разработки плагина 164

Инструменты и обработки Программист Архив с данными Абонемент ($m) EDT

Видеоматериал, демонстрирующий пример разработки несложного работоспособного плагина для 1C:Enterprise Development Tools

1 стартмани

22.12.2016    31366    16    boln    52       

1С:ExcelReport - COM компонента для вывода в Excel в стиле 1С 22

Инструменты и обработки Программист Архив с данными Windows Абонемент ($m) Разработка внешних компонент Загрузка и выгрузка в Excel

Когда необходимо создать из 1С файл Excel с богатым форматированием и встроенными в ячейки формулами, приходится писать на языке 1С довольно объемный код. Предлагаемая компонента позволяет создать макет Excel и вывести отчет «как в 1С», с использованием простого задания параметров и вывода/присоединения секций.

1 стартмани

02.12.2016    13682    12    Perfolenta    7       

Скринсейвер настоящего программиста 8

Инструменты и обработки Программист Приложение (exe) Windows Абонемент ($m) Работа с интерфейсом

Ко Дню программиста знакомые прислали ссылку на коуб. Сделал из нее скринсейвер.

1 стартмани

14.09.2016    12320    4    capitan    7       

Создание внешних компонент 1С по технологии NativeAPI на языке Eiffel 32

Инструменты и обработки Программист Архив с данными Абонемент ($m) Математика и алгоритмы

Статья знакомит с новым средством создания NativeAPI внешних компонент для 1С - языком Eiffel. Она будет интересна высококвалифицированным разработчикам 1С, которые имеют также опыт программирования на других языках. Eiffel - это высокоуровневый кроссплатформенный полностью объектно-ориентированный язык, обладающий красотой и элегантностью. Как инструмент создания внешних компонент он способен составить конкуренцию C++.

1 стартмани

15.07.2016    18519    14    IgorKissil    8       

Примеры скриптов на OneScript 141

Инструменты и обработки Системный администратор Архив с данными Россия Windows Абонемент ($m) OneScript

В своей работе нам часто приходится заниматься рутинными операциями. При небольшом их объеме "ручное" выполнение еще допустимо, но с ростом их числа все мы задумываемся об автоматизации. Вот тут нам на помощь и приходят скрипты. На этом сайте уже выложено немало примеров различных скриптов, вот и я решил внести свою лепту.

1 стартмани

14.07.2016    25375    39    Drak0n    43       

QR-код 2 в 1 (обычная и управляемая форма) 25

Инструменты и обработки Программист Внешняя обработка (ert,epf) Абонемент ($m) Инструментарий разработчика Разработка внешних компонент

Вам нужно интегрировать 1С и QR-коды? Нет ничего проще, будем использовать внешнюю компоненту!

1 стартмани

05.04.2016    22808    106    Xershi    29       

Распаковщик RAR-архивов - UnRAR 1C 13

Инструменты и обработки Программист Внешняя обработка (ert,epf) Windows Абонемент ($m) Разработка внешних компонент

Внешняя Native компонента для распаковки RAR-архивов.

1 стартмани

19.03.2016    12790    23    frkbvfnjh    3       

Удобная база знаний для программиста 1С. "Шаблоны текста" в WEB-е 22

Инструменты и обработки Системный администратор Программист Архив с данными Абонемент ($m) Инструментарий разработчика Практика программирования

Справочник для программиста 1С. (WEB) Легко и быстро вести "дневник" программиста. Одним кликом редактировать статьи, примеры кода. Сохранять обработки и добавлять к ним описания.

1 стартмани

28.01.2016    13465    26    Farzar    15       

Программа для нечеткого сравнения строк FuzzyStringComparison 38

Инструменты и обработки Программист Приложение (exe) Windows Абонемент ($m) Инструментарий разработчика

Появилась задача синхронизировать справочник Номенклатуры в трех базах, которые велись независимо друг от друга. В каждой базе около 30000 позиций. Поискав то, что есть на эту тематику, нашел библиотеку, но время работы ее абсолютно не годилось для моей задачи. К тому же, с моей точки зрения, программа должна рекомендовать значения, а решение принимает человек. В итоге сделал программу, которая решает поставленную передо мной задачу.

5 стартмани

11.01.2016    18721    18    o2005    17       

Собственная страничка с последними релизами 1С 17

Инструменты и обработки Системный администратор Программист Архив с данными Windows Абонемент ($m) WEB

Когда часто обновляешь 1С у клиентов, хочется иметь под рукой страничку, где выведены последние релизы программ 1С. В статье описывается, как это сделать.

1 стартмани

28.12.2015    19110    8    fixin    12       

Python V8Unpack 13

Инструменты и обработки Программист Приложение (exe) Абонемент ($m) Инструментарий разработчика

В ряду анпакеров пополнение! Теперь и на Python.

1 стартмани

16.11.2015    13011    15    Infactum    14       

Что нам стоит сайт построить 74

Инструменты и обработки Программист Приложение (exe) Абонемент ($m) Разработка внешних компонент

Многие знают, что платформа 1С:Предприятие "технически" позволяет написать сайт. Но для этого нужна платформа и клиентские лицензии на каждое подключение. А вы знаете, что можно написать "простой" сайт на знакомом нам языке, без необходимости устанавливать платформу и приобретать клиентские лицензии, и все благодаря одной замечательной opensourse разработке из мира 1С? Интересно? Тогда прошу под кат.

1 стартмани

21.08.2015    20233    28    nextkmv    10       

Описание форматов xml-файлов 7

Инструменты и обработки Программист Архив с данными Абонемент ($m) Техническое задание Обмен через XML

В статье рассказывается о способе согласования состава xml, при постановке задач об обменах между различными информационными системами.

1 стартмани

13.06.2015    18647    22    unichkin    8       

Напоминалка для Android о делах, событиях 6

Инструменты и обработки no Приложение (exe) Android Абонемент ($m) Мобильная разработка

Напоминалка и счетчик дней на рабочий стол Android

1 стартмани

29.05.2015    11875    3    Lokiy    13