2011-4-28 18:23:33 阅读71 评论0 282011/04 Apr28
通常使用位域有两个目的:第一,如果你所需要的数据长度不是系统提供的char/short/int/long的长度,而你又比较想节省内存时,你可以把位域当成定长的数组来使用。 第二,你需要用一个数据块来存储多个不等位长的数据字段,或者你需要访问某个数据的特定位的数据。
以实际项目中的uuid的设计为例,我们期望在这个long类型8字节的uuid中记录一个8位的server, 4位的type, 32位的time, 20位的index,那么我们可能会做以下位域申明:
struct uuid_t
{
unsigned int index:20;
unsigned char server_id:8;
2011-4-12 21:33:11 阅读181 评论2 122011/04 Apr12
日志系统主要是一组记录引擎底层及应用逻辑层系统状态变化过程的接口。几乎所有的游戏服务器框架都会有一组操作日志的接口,当然最简单的就是大家所熟悉的printf格式化到标准输出,日志系统的复杂度有高有低,具体目的主要是为调试及运营数据查询需要。可以说日志系统实现是否易用、简洁,将直接影响到开发及运营效率。
文件VS数据库
是写文件还是写数据库,这是一个问题。数据库的优势是查询/统计/排序很方便,一旦建立好所有的日志表及其操作以后,后期运营会比较舒服,可以轻松应对策划无休止的BT日志统计需求。但为每个日志建立数据库的表项及其索引是需要有很强前瞻性的,对程序员的经验要求较高,大数据量的数据
2011-4-6 18:31:15 阅读39 评论1 62011/04 Apr6
有一段时间不写程序了,反而想起来写一点什么技术方面的总结,这是不是有点娱乐? 我是一个喜欢历史的人,同样我觉得程序也是有历史的,每一段代码都有他不为人知的过去,它为什么是这样而不是那样,它的演进过程是如何的? 不了解这些过去就很难理解它的现在,对吧? 嗯,事实上,接下来要说的内容实际上相当基础,只是一些具体项目的经历,不过呢标题我打算要响亮一点,不如就叫做《MMORPG服务器设计》吧, 这个确实够NB了。
好了,这个坑挖好了。
2011-4-6 18:23:15 阅读25 评论1 62011/04 Apr6
2010-8-9 19:17:50 阅读231 评论0 92010/08 Aug9
前一阵公司给各产品组发放了天威数字证书,用于客户端程序签名,防止被恶意修改和伪造,目前很多杀毒软件都支持数字签名验证,这对修改客户端的木马或者外挂来说是很好的防范手段。拿到证书以后,我一直在想这个证书应该不只是可以用于数字签名吧?用IE导入以后可以清楚的查看到证书的用途:a. 确保软件来自软件发布者 b.保护软件在发行后不被更改。联想到我们公司很多服务器的证书都还是自认证的,我就在想是否可以用这个合法的证书来做CA,形成一个受保护的合法CA链? 想到了就动手去做
首先是从pfx格式到处key及crt文件:
openssl pks12 -in site.pfx -nocerts -nodes -out ca.key
openssl
2010-7-27 14:41:57 阅读155 评论1 272010/07 July27
2010-7-22 17:45:01 阅读533 评论0 222010/07 July22
以下资料从网上收集整理获得,非原创
win7花屏解决方案:
首先,要用xp sp3兼容模式来运行, 并勾选256色, 640*480选项
第一种方案:下载starcraftfix程序,用这个程序来启动,部分同学有遇到死机的情况。
第二种方案:将桌面主题修改为“windows经典”,并打开屏幕分辨率修改窗口,然后开启游戏。
第三种方案:完美解决方案:
在星际目录里面建立一个start_sc.bat的文件,里面存入以下文本内容:
taskkill /f /IM explorer.exe
starcraft.exe
start explorer.exe
然后每次点击这个bat启动
2009-11-5 10:08:34 阅读57 评论1 52009/11 Nov5
现象: 内存分配器链表结构损坏,slot中其他节点数据完好,并且本节点的size信息正确,不太像是越界写导致的错误。初步怀疑是free了内存两次,或者使用已经free了的内存。
处理过程: 迅速祭出游戏录像功能,挂上gdb,查看crash的地方总是将内存节点的next指针置为0x1a,并且每次地址信息完全固定,这下心里有底了,内存不会乱飞事情就好办了。将malloc和free的记录全部Log下来备查,找到被写坏的内存段起始地址D1-D2, 在内存分配日志中找到最近的一个包含这个地址段的分配记录,That's ok,就是它了,然后对照代码查看,发现这个内存被丢进了gc链表,然后在对象析构的时候又手动free了一次。。。
2009-2-24 15:51:27 阅读878 评论0 242009/02 Feb24
生成不重复的随机数
| 生成无重复的随机数,注意,是不重复的序列. 通常的生成随机数的做法是不考虑重复的,因为即使重复也属于概率意义上的正常情况.但某些情况下需要不重复的随机数据,怎么办呢? 我想从大方向上来说,应该只有两个方法.要么牺牲时间要么牺牲空间.讲得不对或不完整,大家一定要指出来啊,谢谢. 注意,下面均以在101~200的范围内(设为b[100],它实际上是附加空间),从中产生10个不重复的随机数(设为a[10]).
一.牺牲时间为代价 |
2008-7-2 18:24:16 阅读71 评论0 22008/07 July2
最近测试一些hash算法的分布效率,偶然遇到浮点数精度问题,大概代码如下
float f = 16777217;
printf("%f\n",f);
输出数值为16777216.000000,很显然这里将整形转换为float的时候发生了精度损失问题。查看CSAPP书籍,可以知道,在IEEE标准中float数据包含1位符号位,8位指数位,以及23位小数位,所以float所能精确表述的最小正整数即为2的24次方(16777216)。超过这个数值,在移位的过程中就会发生数据丢失,从而影响精度。