win32游戏编程.ppt

  1. 1、本文档共82页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
解决这个问题的方法是: (1) 把除了主页面外的所有页面放在内存中(初始化页面时将ddsd.ddsCaps.dwCaps中的 DDSCAPS_OFFSCREENPLAIN后再或( | )一项DDSCAPS_SYSTEMMEMORY),当然也要将主页面的页面描述改一下: ddsd.dwSize=sizeof(ddsd); ddsd.dwFlags=DDSD_CAPS; ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE; 后台缓冲改为一个普通的离屏页面。这样做的另一个好处是你Lock( )一次后就永远得到了页面指针,而且然后一Unlock( )就又可以使用Blt了。所以你就拥有了两种改变页面的手段。 ? (2) 将Flip( )和不带透明色的BltFast( )改成直接用memcpy( )拷贝。注意要一行一行地拷贝,比如说640x480x24位色下的全屏幕拷贝是这样的: BYTE *pSrc=(BYTE *)ddsd_src.lpSurface; //源页面 BYTE *pDest=(BYTE *)ddsd_dest.lpSurface; //目标页面 ? for (int y=0;y480;y++) { memcpy(pDest, pSrc, 1920); //若为32位色则为2560=640*32/8 pSrc+=ddsd_src.lPitch; //移至下一行 pDest+=ddsd_dest.lPitch; //移至下一行 } ? 事实上memcpy( )还有进一步“压榨”的余地,下面是用SSE指令实现的超高速memcpy( )。把它拷贝到你的程序中享受完美的速度吧(快80%以上),呵呵(nQWORDs为要拷贝多少个8字节,注意它应能整除8!)。 void Qmemcpy(void *dst, void *src, int nQWORDs) { #define CACHEBLOCK 1024 //一个块中有多少QWORDs //修改此值有可能实现更高的速度 int n=((int)(nQWORDs/CACHEBLOCK))*CACHEBLOCK; int m=nQWORDs-n; if (n) { _asm //下面先拷贝整数个块 { mov esi, src mov edi, dst mov ecx, n //要拷贝多少个块 lea esi, [esi+ecx*8] lea edi, [edi+ecx*8] neg ecx mainloop: mov eax, CACHEBLOCK / 16 prefetchloop: mov ebx, [esi+ecx*8] //预读此循环 mov ebx, [esi+ecx*8+64] //预读下循环 add ecx, 16 dec eax jnz prefetchloop sub ecx, CACHEBLOCK mov eax, CACHEBLOCK / 8 writeloop: movq mm0, qword ptr [esi+ecx*8 ] movq mm1, qword ptr [esi+ecx*8+8 ] movq mm2, qword ptr [esi+ecx*8+16] movq mm3, qword ptr [esi+ecx*8+24] movq mm4, qword ptr [esi+ecx*8+32] movq mm5, qword ptr [esi+ecx*8+40] movq mm6, qword ptr [esi+ecx*8+48] movq mm7, qword ptr [esi+ecx*8+56] ? movntq qword ptr [edi+ecx*8 ], mm0 movntq qword ptr [edi+ecx*8+8 ], mm1 movntq qword ptr [edi+ecx*8+16], mm2 movntq qword ptr [edi+ecx*8+24], mm3 movntq qword ptr [edi+ecx*8+32], mm4 movntq qword ptr [edi+ecx*8+40], mm5 movntq qword ptr [edi+ecx*8+48], mm6 movntq qword ptr [edi+ecx*8+56], mm7 add ecx, 8 dec eax jnz writeloop

文档评论(0)

wuyoujun92 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档