Последняя ассемблерная вставка была явным перебором.
Запись от Hrethgir размещена 24.03.2023 в 14:10
Показов 1004
Комментарии 1
|
Там вышло фиктивное увеличение производительности из-за ошибки. Код остался таким [SPOILER][PASCAL] repeat // dec(steps); repeat asm jmp logic end; logic1://пропускаем первую строку logic:=@logic2; goto logic4; logic2: Edge:=@Edge3; logic:=@logic3; logic3: TracerY:=y-steps1;//расчёт ячейки правого столбца TracerX:=0; if TracerY<0 then begin TracerX:=RazmerX-(stepFrequent*y+znak*trunc(y/(stepsBig))+Ostatok1);// if TracerX<0 then TracerX:=0; TracerY:=0; end; logic4: // altHead:=@altHead1; steps:=stepsBig; repeat if steps=0 then begin Biger:=x-stepRare+1; steps:=stepsBig; end else begin Biger:=x-stepFrequent+1; end; if Biger<0 then Biger:=0; repeat {%REGION 'Engine'} xf:=x+1;//если раскомментироваnm строки После jmp p то начнётся вывод данных в таблицу asm jmp p end; p1: //StringGrid1.Cells[xf,yf]:= IntToStr(TracerX)+','+IntToStr(TracerY) +','+'1';//запись правого столбца p:=@p3; goto p4; p2: //StringGrid1.Cells[xf,yf]:= IntToStr(xf)+','+IntToStr(yf)+',' +'0';//автоматическое забивание координат в местах скоса трассы p:=@p3; goto p4; p3: //StringGrid1.Cells[xf,yf]:= IntToStr(xf)+','+IntToStr(y)+',' +'0';//автоматическое забивание координат трассы на прямых участках p4: dec(x); {%ENDREGION} until x<Biger; asm jmp Edge end; Edge1://подсчёт шагов в первой строке - других расчётов для первой строки не требуется и знание этого значения нужно для последней строки inc(steps1); Goto Edge3; Edge2://трассировку начальной ячейки каждого шага последней обрабатываемой строки кроме правого столбца dec(steps1); TracerY:=y-steps1; TracerX:=0; p:=@p1; Goto Edge4; Edge3: p:=@p2; Edge4: dec(steps); until x<0;///////////////////////////////////////////////////////////////////////////////////////////////////////////////// inc(y); yf:=y+1; p:=@p1; x:=xRazmerX; until y>yRazmerY-1; Edge:=@Edge2; until y>yRazmerY;[/PASCAL][/SPOILER] логическая часть вначале исправлена [PASCAL] procedure Vstavka; begin //CaTanDegP:=round(CaTanDeg); //StringDiv:=RazmerX / (CaTanDeg); stepFrequent:=round(CaTanDeg);//кол-во пикселей в частом штрихе StringDiv:=frac(CaTanDeg);//выборка дробной части катангенса StringDiv1:=1-StringDiv; znak:=sign(0.5-StringDiv)*sign(StringDiv);//указывает на увеличение или уменьшение результата суммирования этой дробной части при повторе частых штрихов if StringDiv>0.5 then stepsBig:=round(1/StringDiv1) else stepsBig:=round(1/StringDiv); if StringDiv=0 then stepsBig:=1; Ostatok1:=1; if CaTanDeg=1 then begin znak:= 0; Ostatok1:=0; end; // stepsBig:=round(1/StringDiv1);// stepRare:=stepFrequent+znak;//количество пикселей в редком штрихе. промежуточный, пока не нужен. bigStep:= stepsBig*stepFrequent;//поправил if bigStep=0 then begin bigStep:=stepRare; stepRare:=0; end; end; [/PASCAL] Быстродействие осталось 296 милисекунд при максимальной загрузке угол 45, без сохранения 10 000 на 10 000 клеток. |
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 1
Комментарии
-
надо попробовать как-то вообще заменить весь ассемблер, для интереса. Но у меня вопрос - возникает, в шейдерах разрешается проверка условий?Запись от Hrethgir размещена 24.03.2023 в 16:09


