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

         

Примеры внутренних циклов текстурирования


ОПТИМИЗАЦИЯ
6.2. Примеры внутренних циклов текстурирования

Если немного поработать профайлером, можно выяснить следующую интересную вещь: большая часть времени на отрисовку сцены тратится именно в процедуре текстурирования, а в ней, в свою очередь, большая часть времени проходит во внутреннем цикле (inner loop). Естественно, что его и надо оптимизировать в первую очередь.

Возьмем этот самый inner loop от обычного аффинного текстурирования (такой же, на самом деле, используется и в перспективно-корректном) и перепишем на ассемблере (в критических участках кода на компилятор надеяться не стоит). Будем использовать 24:8 fixedpoint для u, v, а также 8-битную текстуру шириной 256 байт. mov eax,u ; 24:8 fixedpoint mov ebx,v ; 24:8 fixedpoint mov ecx,length xor edx,edx mov esi,texture mov edi,outputbuffer inner: mov dl,ah ; вытащили целую часть u mov dh,bh ; вытащили целую часть v ; теперь edx = dx = (100h * v + u) - как раз ; смещение тексела [v][u] относительно начала ; текстуры mov dl,[esi+edx] ; dl = texture[v][u] mov [edi],dl ; *outputBuffer = dl add eax,du ; u += du add ebx,dv ; v += dv inc edi ; outputBuffer++ loop inner ; ...

Красиво, аккуратно, на ассемблере.



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