计算机科技日新月异 , 高级语言不断地翻新 , Visual Basic , Dephi , Blorand C++ Builder等可视化套件相继出炉 , 当用了这些软件后 , 也就没有人想重回以前写 Assembly(汇编语言)的日子了。
然而, 大多数刚接触游戏工作的人 , 可能不知道 , 遥远以前 , 游戏都是用Assembly(汇编语言) 写的 , 甚至到了今天 , 很多游戏的核心 , 也是用Assembly(汇编语言) 写的, 为何要用Assembly(汇编语言) 呢 ? … 没错 , 就是为了在游戏中加速那为何不用 ”微软” 的函式呢 ? …. 相信计算机玩得愈久的人 , 愈能感受到。 答案就是 => 要是能用 , 早拿来用了 >_<~~ 。
所以接下来的内容 , 当然就要有点 Assembly(汇编语言) 基础的人 , 才看的懂啰 !
以前用汇编语言加速的方法 , 大多是用一次能处理 4 Bytes的指令及缓存器 ,来进行加速; 例如 : mov edi,p_d mov ecx,count shr ecx, 1 rep stosd
而现在呢? 当然是用 MMX 加速啰 ! 废话不多说 , 先看个范例 :
这是将一张 640 * 480 16bit Colors 的底图 , 在上面覆盖了一层红色玻璃色。 最后面是 VC + Assembly + MMX 的核心程序
不用 MMX 加速 , 每秒有 33 次的更新率 用了 MMX 加速 , 每秒有 54 次的更新率, 快了将近一倍的速度
if(isMMX) { __int64 mmx_mask_red = MMX_MR; __int64 mmx_mask_green = MMX_MG; __int64 mmx_mask_blue = MMX_MB;
int s_w = d_w; int dd_screen = d_screen - (s_w*2); s_w = s_w / 4; int BK_s_w = s_w; int s_h = d_h;
__int64 color64; WORD *cc = (WORD *)&color64; cc[0] = cc[1] = cc[2] = cc[3] = color;
p_d += dy * d_screen + dx*2 ;
__asm {
mov edi,p_d
ALIGN 4
movq mm7,ALPFULL
mov al,alpha // Alpha -> mm0 = 00a3 00a2 00a1 00a0 mov ah,al mov bx,ax shl eax,16 mov ax,bx movd mm0,eax pxor mm1,mm1 punpcklbw mm0,mm1
psubsb mm7,mm0 // mm7 = !mm0 again:
// Start Blend // SourceColor * Alpha
movq mm1,color64 movq mm2,mm1 movq mm3,mm1
pand mm1,mmx_mask_red psrlw mm1,RED_SEEK pand mm2,mmx_mask_green psrlw mm2,5 pand mm3,mmx_mask_blue
pmullw mm1,mm0 pmullw mm2,mm0 pmullw mm3,mm0
// DourceColor * (MaxAlpha - Alpha)
movq mm4,[edi] movq mm5,mm4 movq mm6,mm4
pand mm4,mmx_mask_red psrlw mm4,RED_SEEK pand mm5,mmx_mask_green psrlw mm5,5 pand mm6,mmx_mask_blue
pmullw mm4,mm7 pmullw mm5,mm7 pmullw mm6,mm7
// (SourceColor * Alpha) + (DourceColor * (MaxAlpha - Alpha))
paddw mm1,mm4 paddw mm2,mm5 paddw mm3,mm6
// (SourceColor * Alpha) + (DourceColor * (MaxAlpha - Alpha))/ MaxAlpha
psrlw mm1,5 psrlw mm2,5 psrlw mm3,5 psllw mm1,RED_SEEK psllw mm2,5
por mm1,mm2 por mm1,mm3
add esi,8 movq [edi],mm1 add edi,8
dec s_w jnz again
add edi,dd_screen
mov eax,BK_s_w mov s_w,eax dec s_h jnz again
emms
} } 演示下载。 (1204KB)
|