网页功能: 加入收藏 设为首页 网站搜索  
MMX 应用技术
发表日期:2006-08-20作者:[转贴] 出处:  

计算机科技日新月异 , 高级语言不断地翻新 , 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)
 

我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 MMX 应用技术
本类热点文章
  在DirectX 8 中进行2D渲染
  DirectDraw打造极速图形引擎(一)
  用窗口模式运行游戏
  DirectDraw编程基础
  Windows的位图alpha混合技术
  再谈GDI模式作图
  终极优化你的游戏——使用脏矩形技术
  D3D8里面的2D图形编程
  全屏模式
  对2D游戏引擎设计的一些思考
  DirectX8中的二维图形高级技巧
  使用标准GDI实现游戏品质的动画系统
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00403