codingforspeed技术分享

ecofast ecofast     2022-09-06     538

关键词:

  上周和公司技术同事们作了次《Coding for Speed》技术分享,本来这只是再普通不过的技术探讨和交流(虽然挂了个颇有噱头的名称),但分享的时候逻辑没理好,语速很快,时间也太紧,因此难言是合格的“分享”、“探讨”,所以我觉得有必要以简短的文章形式对原 PPT 作点补充,即便分享的内容很少也很简单。

  本文将按原 PPT 的内容顺序分别作扩展说明或阐述,部分敏感信息将隐去,或只会简单提及。

 

  

  作本技术分享的初衷,一是在工作中了解及接触了一些我个人认为可优化改进的代码或设计,二也想能和同事们作一些技术方面的交流探讨,三我本人一直对性能这个议题颇有兴趣。

  约七、八年前还在做端游的时候,我和几个同事时有“蛋疼的”纯写/内嵌汇编以优化某些函数,或测试比拼 VC、Delphi、LLVM/CLang(C++Builder) 甚至 ICC(Intel C++ Compiler) 等编译生成的程序运行速度,而现在恐怕极少还有技术同仁去折腾这些了吧,(大部分时候)硬件已足够快、编译器优化也足够优秀,多数时候我们只要能正确的设计/使用/选用合适的技术方案和数据结构/算法,基本上不大会有性能方面的问题(尤其是考虑到现今大部分甚至绝大部分游戏的在线人数等远比不了以前,并发压力等小了很多)。

  当然,譬如休闲类的移动网络游戏,交互也(远)没有 MMORPG 复杂。

  

  以上所列这些软件、程序、算法甚至指令集等,几乎都有“快”、“高性能”等标签,如 std::map 底层实现即是用的红黑树,LZ4 HC 的解压速度是 zlib 的好几倍而压缩率只小一点点,TCMalloc 和 FastMM 都是非常高效的内存管理器,还有 Id Software 那著名的 InvSqrt 函数,和 Chrome 的底层脚本引擎 V8...等等。

  

  性能实在是很广很深的话题,在这方面我仅仅只是个有丁点经验的菜鸟而已。结合公司项目具体情况和诸同事技术及经验背景等因素,我将对查找表、位图算法、缓存及 IO 优化等方面和大家作探讨交流,并抛砖引玉分享 2 个我曾经想到的勉强也算“性能优化”的“优化”做法。

  

  简而言之,查找表即是预先将某些数据计算好,待需要的时候直接读取即可,譬如我以前写的 2D 绘制引擎(AGE),就预先计算了 0~360° 的 Sin/Cos 值等。很多时候,以少量的空间成本换取性能上的提升不失是个好做法(反之亦然),而这也是很基础很常用的“优化技术”。

  

  还记得以前重构某端游的任务系统时,我使用了位图来存储每个角色的任务标记位,譬如可用 2 个 bit 位来表示单个任务的完成情况(00 未接、01 已接、10 已放弃、11 已完成等),于是只需 1KB 的空间几乎就能存储每个玩家所有的任务完成情况了,而获取每个任务的状态也非常简单快速。

  

 

  

  

  从 Memory Hierarchy 简略图可以看出,越靠近 CPU,速度越快但容量越小,而 Jeff Dean 给出的数据更加直观。相较寄存器少及小的先天限制(多数时候对寄存器的使用是由编译器去作的优化),好的局部性能使程序有着更好的性能(cache 的功劳),譬如精简的循环通常有较好的时间和空间局部性(当然,循环展开是另外的优化话题了,它能有效减少分支预测失败带来的性能损耗)。

   

  较之 register 及 cache 的“不接地气”,明显内存(DRAM)就“平易近人”许多(想想 Redis),譬如游戏服务器完全可以(考虑)以适当的空间成本(内存占用)来提升负载能力,以优化改造之前同事写的某登录服务器为例,其做法是当客户端请求登录时,登录服务器会先从数据库查询用户数据然后再验证,而这步操作(相较而言)明显比较耗时,远比不上直接从内存读取的速度(譬如可以 hashtable 存取),所以可以考虑在登录服务器启动时,载入近几天登陆过游戏的用户数据至内存,当客户端请求登录时,若内存中没有此玩家数据,则再去数据库获取并将之放入内存,于是后续便只需读取内存(当然,每条玩家数据会占用多少内存空间,完全可以估算或测试)。而譬如密码,数据库保存的是其哈希值,但客户端登录时上传的是明文密码(通讯封包当然加密了,不过明文密码这个必然不好),于是登录服务器在验证时还需要将明文密码作哈希等处理然后再比较,我也顺带的将这个步骤作了优化,针对每个账号,当其登录请求第一次验证通过时,直接将其明文密码也缓存,于是以后的登录验证,直接比较明文密码即可,无需再进行哈希校验等。

  

  考虑到磁盘 IO 的低效(及延长硬盘寿命),和减轻数据库等压力,我们应重视及运用 Buffer 和 Batch 机制,譬如若有持续、频繁的写文件之类需求,可以先将它们存入缓冲区(Buffer),每隔一小段时间再 Flush 到磁盘,再譬如若有频繁的更新数据表记录的需求,若时效要求不严,完全可以事务的方式作批量更新等。

  

  有些端游、页游能绘制(鼠标所指)人物的轮廓,我也曾尝试写 shader 实现这种效果,但后来想到,以类似字体描边的做法不就可以实现么,而且写起来更简单,绘制引擎也能作 Batch Rendering 优化。

  简单提一下字体描边的做法,譬如在 (x,y) 处绘制文字,那么只需在 (x, y-1)、(x+1,y-1)、(x+1,y)、(x+1,y+1)、(x,y+1)、(x-1,y+1)、(x-1,y)、(x-1,y-1) 处分别再以描边颜色绘制一遍该文字,即能展现所谓“描边”效果了。

  网络游戏通常会对 AOI 作优化,而这些优化大多是数据结构和算法类的,譬如 MMORPG,可能有上百张地图,但很多时候,玩家大多集中在几个主城和副本地图里,但那些没有玩家的地图场景仍然会有 AOI 等,所以如果只对有玩家的地图作 AOI 等操作,应是能优化服务器的承载能力的。

  

  

  对于第二个问题,可能 XOR(异或) 是个好方法。

技术团队管理:技术分享

这里写自定义目录标题为什么要进行技术分享如何做技术分享找人找分享主题内容准备进行分享会后为什么要进行技术分享技术团队,员工为什么要离职?钱没给到位?没学到技术?技术成长对初,中级开发人员来说非常重要,曾经面试... 查看详情

美团点评技术分享

美团点评技术分享:美团点评技术文档  查看详情

技术栈分享

文章来源:刘俊涛的博客 地址:http://www.cnblogs.com/lovebing 查看详情

公开运维技术分享的一些经验

技术分享三条实战经验:●良好的逻辑性●自己真实经验总结●多练习首先,说明下,我不是技术分享高手,分享了次数比较多,有点心得;另外,听的分享多了,对好坏也有一些感受。还有,在此特别感谢下西山居的运维开发... 查看详情

《学技术练英语》ppt分享

分享给博客园的兄弟们:目录:学技术-打基础学技术-广度学技术-深度练英语-重要性练英语-读练英语-写练英语-听练英语-说练英语-附录学技术练英语.pdf  查看详情

dynamicsunifiedservicedesk技术分享资源汇总(工具,文档)

...c;具体的分析明细请查看博文:DynamicsCRMUnifiedServiceDesk技术分享博主最近做的技术分享所用到的PPT文档:UnifiedServiceDesktop简介与实战技巧博主最近做的技术分享所用到的工具:CRMSDKTemplatesPackageDeploy 查看详情

如何做技术分享

很多同事做技术分享的时候,会给听众一个印象:“感觉这个人做了很多事情,就是讲不出来”。这种说法还是算客气的,现实中,演讲水平甚至严重影响工程师的晋升。软件工程师通常很聪明,做具体技术工作时得心应手,&nb... 查看详情

瀚高技术团队分享活动

...服务团队将在2022年有计划、有体系、有深度的做一系列技术分享活动。瀚高服务团队致力于技术分享,愿与客户、志同道合的技术伙伴一起成长,共同努力,助力国家信息化建设。瀚高服务团队会通过每周四|20:00|直|... 查看详情

技术干货分享

这篇文章中的大部分书籍、网站、博客等曾经在我的学习中给了我很大的帮助,因此把他们分享出来,希望能给更多的人以帮助,也希望大家能够继续补充,可以在后边的评论区进行补充,我会时刻进行更新。0x00关于C++书籍(... 查看详情

敖丙在蘑菇街的技术分享(代码片段)

本期呢是我在蘑菇街算法工程团队做技术分享的一个文字版本,我后面有机会做一下视频的线上版本。其实在做这个分享的时候我很纠结,我都不知道当时为啥自己选了Redis,这个我是知道比较多点,但是作为技术分享就不是很... 查看详情

js技术分享

怎么向上取整、向下取整: 向上取整用Math.ceil(doublea) 向下取整用Math.floor(doublea)  怎么保留小数点后两位:方法1:用Math.round计算,这里返回的数字格式的.floatprice=89.89;intitemNum=3;floattotalPrice=price*itemNum;floatnum=(float)( 查看详情

inplayable技术分享

Inplayable技术分享运维设计模式Web安全工具语言python运维《awslambda通过codebuild上线踩坑指南之lambda进程被占用statuserror255》《googlepay配置sub/pub回调》《AWS攻略——使用CodeCommit托管代码》《AWS攻略——使用S3托管静态网页》《AWS攻... 查看详情

inplayable技术分享

Inplayable技术分享运维设计模式Web安全工具语言python运维《awslambda通过codebuild上线踩坑指南之lambda进程被占用statuserror255》《googlepay配置sub/pub回调》《AWS攻略——使用CodeCommit托管代码》《AWS攻略——使用S3托管静态网页》《AWS攻... 查看详情

inplayable技术分享

Inplayable技术分享运维设计模式Web安全工具语言python运维《awslambda通过codebuild上线踩坑指南之lambda进程被占用statuserror255》《googlepay配置sub/pub回调》《AWS攻略——使用CodeCommit托管代码》《AWS攻略——使用S3托管静态网页》《AWS攻... 查看详情

各公司用户画像技术案例分享

关于用户画像的技术分享,分享给有需要的小伙伴,这里给的部分案例并非本人的作品,而是来自于其它优秀的公司和前辈,大部分来自于他们的技术分享及网络图片,如果不妥欢迎批评指正。01什么是用户画... 查看详情

内部技术分享-大数据和算法(上)

内部分享过几次技术,这次是大数据概要性的一些分享,一些PPT制作得比较简单,有纰漏的可以指出下。一些PPT背后对应的一些讲解后续慢慢补充上来。 查看详情

内部技术分享-大数据和算法(上)

内部分享过几次技术,这次是大数据概要性的一些分享,一些PPT制作得比较简单,有纰漏的可以指出下。一些PPT背后对应的一些讲解后续慢慢补充上来。 查看详情

技术站点分享

<AHREF="http://www.java1234.com/"ADD_DATE="1470663608"LAST_MODIFIED="1470663608">Java知识分享网-免费Java资源下载</A><AHREF="http://www.uml.org.cn/zjjs/201107193.asp"ADD_DATE="1470663608"LAST_MODIF 查看详情