wenjiang 的个人资料morning's blog照片日志列表更多 工具 帮助

日志


10月25日

80后做到了这些就成熟了

每天11:00点前睡觉,每天7:30点前起床;
每天提醒自己,不要忘记梦想;
有时间多看书,多学习,做一个有文学素养的 人,不要把时间浪费在滑稽怪诞的事情上;
多锻炼身体,身体垮了什么都没有了,男人女人都要对自己好一点;
努力学习赚钱的本领,钱是一个人活着的根本,是做人的尊严;
常回家看看老妈,常给姐姐哥哥电话,亲情是最珍贵的感情;
要学会做个倾听者,要多听听别人的感受,从中获得教训;
要学会玩,学会有品位的玩;
工作上的烦恼,不要带回家,解决不了任何问题,带回来会平添更多烦恼;
做工作的有心人;
学会奉承领导,多摆笑脸,不做恶人,三缄其口,三思而后行;
学会推拖事情,人善被人欺,马善被人骑;
不和没素养的人交往,免得受其影响;
不与小气的人交往,吃亏的总是自己;
不与已婚人或者已经同居的人谈感情,多半是浪费口舌,最后没什么收获,反而打击自己的生活激情;
要寻找与自己有共同价值观的人,爱自己的人,好好珍惜,好好保护,终了一生;
不要把感情浪费在没有希望的人身上,看重外在的人永远都是弱智,只有在伤痕累累时才明白,真正爱她的人原来一直在她身边关注她,而她却一直以为幸福很遥远;
不要过分将就一个人,过分将就不是爱情;
要做回自己,为自己活着;
要明白读过很多书的人不一定有很多知识,没上过学的人却不一定是文盲
……
以上部分转自网络,择其善者而从之

10月14日

星际争霸汉化总结

结束星际争霸汉化的研究,做一下总结:
汉化一个英文游戏,主要包含2个方面:
1.原始字符串的提取并翻译,有几种方式:
 1.1 静态资源汉化:提取资源,然后翻译其中的字符,并回写,这涉及很多方面,包括资源格式,当然,工作量往往很大,而且会存在汉化遗漏的问题.
 1.2 实时动态汉化:在字符串即将显示时,进行即时汉化,由于是实时获取,所以,只需分析内存中有关字符串处理的结构即可,把游戏大致玩一遍,保存所有程序传过来的字符串,然后把这些字符串翻译做成字典,那么,在使用时,根据这个字典实时翻译即可.当然这其中包含一些技巧,例如 字符串通配算法,翻译缓存,字典的管理.它们决定了实时翻译的速度.
2.修正中文显示支持:
 2.1 中文的显示
 ANSI语言的程序员(其实绝大多数没双字节概念的程序员都有这个问题)会假设字符串是单字节的,直接++,而不是_tcsinc.
 由于ASCII的字符数很有限,游戏开发者为了优化游戏性能,可能会做成字库,但中文就死翘翘了.
 两种办法解决:
  2.1.1 制作一个包含游戏用到几种大小的包含所有字符的字库(字符图片),这个办法性能一般较快,因为等需要显示时,直接把字符所对应的点阵拷贝过去就可以了,但是由于中文(仅GB2312部分)字符在7000左右,如果游戏用到了3个大小的字体,哦...可以想象这个字库是多大了.
  2.1.2 现在的计算机处理字符已经非常快了,另外,游戏出现大量对白的画面毕竟少数,所以,采用GDI绘制到一个bitmap缓冲,然后贴图,这也是一个办法,比起前者,灵活性较高.通过算法优化,速度不比前者差.(现在支持中文/日文/韩文的游戏一般采用这个办法)
 2.2 更多信息
 我们要显示字符,不可能仅仅把字符贴到(0,0)的位置上,还包括以下信息
  2.2.0 绘图目标:surface/缓冲的起始地址,宽度,高度,色深,最终的字符串图片会合成到这个缓存的准确内存地址.
  2.2.1 绘图坐标:决定字符串的显示位置
  2.2.2 绘图区域:决定字符串的区域,有多少宽,有多少高
  2.2.3 字符串风格:斜体/粗体,字体大小,这些决定了我们该使用的中文字体的height和weight
  2.2.4 颜色:是的,还有颜色,当然,可能还包括透明度,先生成256色深的白底黑字的图片,然后转成具有alpha等级的对应颜色点阵图.
  2.2.4 其他:默认的单字符宽度,默认的TAB宽度等
10月5日

修改WindowsXP/2003,让它跑得更快!

最近认真看了一下Intel的算术库,对其中的SSE2的运用印象深刻.
然后猛然想到 windows 2003在使用FPU87呢,还是SSE2呢?
经过调试,很遗憾,系统使用的是传统的FPU87的指令集,这实在是浪费CPU的能量啊.
于是操起OllyDbg,打开msvcrt.dll,ntdll.dll改写了一些代码.
1._ftol: VC7.1之前编译的函数按默认设置都会调用此函数进行浮点转整形,对于脚本引擎等涉及频繁浮点整形转化的程序很有意义
改写如下:
 cvttsd2si eax, [esp+arg_0]
 retn
2.fabs: VC未开启内联,或低于VC7.1时被调用,用于abs~
改写如下:
fld     qword ptr [esp+4]
fabs
retn
3.
其他浮点函数atan/ceil/exp/floor/log/log10/modf/pow
这些在msvcrt.dll是有开关函数的 _set_SSE2_enable,虽然MSDN说如果CPU支持会自动开启,但是其实是如果CPU支持将允许你启用,不等于自动开启
代码片段:
  77BE1499      8325 845DBF77 00         and     dword ptr [77BF5D84], 0
  77BE14A0      8325 805DBF77 00         and     dword ptr [77BF5D80], 0  // 直接都改成 or 1
  77BE14A7  |.  F645 EB 04               test    byte ptr [ebp-15], 4
  77BE14AB  |.  74 13                    je      short msvcrt.77BE14C0
  77BE14AD  |.  E8 4EFFFFFF              call    msvcrt.77BE1400  //进行无效指令计算
  77BE14B2  |.  85C0                     test    eax, eax
  77BE14B4  |.  74 0A                    je      short msvcrt.77BE14C0
  77BE14B6  |.  C705 845DBF77 01000000   mov     dword ptr [77BF5D84], 1 // 如果支持 77BF5D84 设为1,但是却没有把77BF5D80设为1
  77BE14C0  |>  8B4D FC                  mov     ecx, dword ptr [ebp-4]
OK,这就好办了
or    dword ptr [77BF5D80], 1
这样就强制开启了.
对于ntdll.dll,大部分函数没有SSE2的代码,只有ceil,floor,直接去掉头部的jmp即可.
 
额外的:
vcpkg5.5自带了这个patch,当VC6IDE加载vcpkg时自动patch msvcrt.dll,提升VC6的浮点性能.显然,内存patch仅作用于当前进程,对系统其他进程没有帮助,推荐patch系统文件,这样所有系统中运行的软件都会受益.
 
对于开发人员:
如果你在用 VC6或可能会调用msvcrt.dll中的浮点运算函数(就算你不调用,系统自身dll也会调用,因为它是 NT CRT DLL),那么显然我们不能去Patch用户计算机中的文件,启动时执行以下代码,有益于提高速度.
调用永远是安全的,因为这个函数会将设置与屏蔽位取与,所以,只有在SSE2指令集的计算机中在最终生效.
 typedef int (_cdecl *PFN_set_SSE2_enable)(int flag);
 PFN_set_SSE2_enable pfn_set_SSE2_enable;
 pfn_set_SSE2_enable=(PFN_set_SSE2_enable)GetProcAddress(GetModuleHandle(_T("msvcrt.dll")),"_set_SSE2_enable");
 if (pfn_set_SSE2_enable) pfn_set_SSE2_enable(1);
 

注意:
1.如果你要跟随这个修改,务必保证你的CPU支持SSE2指令集,否则,.....
2.关掉系统的SFC,否则,会被自动还原
3.ntdll.dll,这类系统dll的修改,记得替换前更新CheckSum,这是好习惯