Самоучитель по 3dsmax 7

         

Только вот согласно правилам спаривания, половина команд в этом цикле не спарится, и цикл...


Только вот согласно правилам спаривания, половина команд в этом цикле не спарится, и цикл займет порядка 6-7 тактов. А на самом деле, чуточку переставив местами команды, можно его загнать где-то в 4.5 такта: ; ... inner: mov dl,ah add eax,du mov dh,bh add ebx,dv mov dl,[esi+edx] inc edi dec ecx mov [edi-1],dl jnz inner ; ...

В таком виде любая пара команд отлично спаривается, получаем те самые 4.5 такта. Здесь, правда, есть обращения к внешним переменным du и dv, что может снизить скорость. Решение - самомодифицирующийся код: ; ... mov eax,du mov ebx,dv mov inner_du,eax mov inner_dv,ebx ; ... inner: ; ... add eax,12345678h org $-4 inner_du dd ? add edx,12345678h org $-4 inner_dv dd ? ; ...

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

Дальше - больше. 4.5 такта на пиксел - это тоже не предел. В fatmap.txt (ftp://ftp.hornet.org/pub/demos/code/3d/trifill/texmap/fatmap.txt) приводится вот такой красивый inner loop на четыре такта. ; текстура должна быть выравнена на 64k ; линии рисуются справа налево ; верхние 16 бит ebx = сегмент текстуры ; bh = целая часть v ; dh = дробная часть v ; dl = дробная часть dv ; ah = целая часть v ; ecx = u ; ebp = du inner: add ecx,ebp ; u += du mov al,[ebx] ; al = texture[v][u] mov bl,ch ; bl = новая целая часть u add dh,dl ; считаем новую дробную часть v adc bh,ah ; считаем новую целую часть v mov [edi+esi],al ; рисуем пиксел dec esi ; jnz inner ;

Надо, правда, отметить, что он уже требует каких-то ухищрений - а именно, выравнивания текстуры на 64k и отрисовки строк справа налево.



Содержание раздела