re: 项目开发中的一些思考 杨粼波 2012-02-17 11:28
1.对于STL这样的态度的公司或团队,不乏少数。其实,不论从容器还是算法来说,STL提供的容器和算法足够大部分情况下的使用。boost也同样好。当然,主要还是要能够掌控他们,否则就如脱缰野马。好与不好,合适就好。
2.关于游戏开发的技术含量,还是有的。在我的定义里面,游戏开发其实还是一种应用。所以相对于那些高深的研究来说,还是相对要技术含量低,特别是在国内一把抄的前提下。就服务器而言,最基础的是要提供稳定的底层,而后随着人数的承载量增长,对于服务器的架构设计要求也是越来越高的。就管理而言,要保证几十号人工作如一人,项目管理能力同样重要。
3.关于内存管理,得就事论事,合适就好。先用最普通的内存分配方式实现,如果不合适了再行优化。Premature optimization is the root of all evil.
4.如果能够在设计最初就划分好模块,那再好不过,因为这样就可以把功能细分了,功能能细分了,这样就能够把任务更细的划分到每一个实现人身上。但若一开始无法划分,那就不要划分,这样反倒会束手束脚,那就先实现,完成后再重构。其实你说的情况不是一个模块划分,接口的问题,而是一个高耦合的情况。“高内聚,低耦合”这都没做到,自然的,就更不要谈什么模块和接口了。如果你们能够达到这点,就不会乱到一锅粥了。要坚持不断重构,其中的好处,你们越到后面,越能够体会到。
我这里加载了很多dll,dll会有pdb文件,好像不会卸载。
擦,我现在是相当相当的痛苦!
非常的想把VS升级上去了。
再怎么减少,还是有操作的,只能说是尽量的减少操作量。因为现在的磁盘型硬盘io操作还是非常非常慢的。这种优化是非常收益可观的。
其实我现在也是采用的定时保存,开了数据库的连接池。我有经常查看数据库的消耗,多半都是消耗在了批量更新上。现在来看,还是可以承受的。
如果你的MySQL能被查询所拖垮,那你可以考虑下:能否减少查询的次数?如果不可行,那是否应该要去分表了?
现在的确KV型的NoSQL数据库兴起了,但是就我直觉来说,很长时间内关系型的SQL数据库是不大可能被淘汰的。
re: 2011之总结及2012之展望 杨粼波 2012-01-10 10:28
@zuhd 现在深圳也很冷,光膀子,几乎没人敢这么做。
@春秋十二月 有的话你其实不爱听,我还是要说。你要有一个好的心态,怨天尤人的人不可成大事,甚至连生活都有可能一团糟。我也时常咒骂自己,这也许你无法理解,但是我要说:你软弱给谁看?就算别人给了点点的言语上的安慰,又有什么用呢?能帮助你走出困境吗?能帮你自立自强吗?不能。或许你没有碰到过那种绝望却又要继续前行的时候,所以你不能理解。哥们!天行健,君子以自强不息。比你情况糟的人太多了。就想想贝多芬,想想霍金。不要因为我说得难听就激愤难平,我不是想做你的人生导师,这是在分享。
对于我这里的博文我有着这样一个原则思想:转载实用有用的文章,以备日后查阅;原创简单实用的文章,不高谈阔论。我坚信着我碰到的问题,别人也会碰到,记之共享,至少其他人不会因此走弯路。
用SP可以节约一点带宽。不过对于更新数据来说,对数据库的消耗确实是大的。而如果只是查询,那并不存在任何问题。
网络开销基本上不是问题,现在部署上多半都是同局域网的,千兆网卡,甚至光纤,很难造成太大的影响。
数据库主要IO开销还是在硬盘上,特别是更新数据。用memcached,主要也就是减轻磁盘IO的消耗,缓存在内存中,减少对磁盘的操作。
像MySQL这样级别的数据库,可以把数据规模降低,比如分表这种做法。当然,这需要数据规模达到一定程度。所以我现在还没有分表。数据库还能承受。
我现在头疼两个东西:
1.批量更新;
2.日志的增长。
日志倒还好,勤快点备份清理就好。
批量更新,可以缓存数据到内存当中,以期减少写入频率,但是,始终还是要写入的,这个负载最终还是无可避免的。
既然能够想到 “敢问路在前方”,你为何却看不到这句歌词的后一句“路在脚下”。
正如你能够看到贝多芬,却不能够看到贝多芬的内心强大?
正因为如此,才促使你选择了软弱,放弃了强大。
如果你总盯着生活中的倒霉事,会错过很多好事。----《倒霉爱神》
不要在这里犹如怨妇一般的矫情,怨天尤人。
你以为你这样就能够改变一切吗?
你为什么不庆幸着自己还活着?还有机会做程序员,还有机会拿着不到八千块钱的工资?你为什么不庆幸自己不是流落街头的流浪汉?
自己内心软弱,你想做给谁看?谁又能可怜你?谁又能帮你摆脱人生的不如意。
人生本来就充满着这样那样的灰度,就这么点事情就失魂落魄的。还好意思拿贝多芬来说事,别人贝多芬至少流芳百世,创作了许多伟大的曲子。你呢?在这里怨天尤人,不思进取。
没口德的骂你:没用的东西,就这么点事就扛不住了。
re: Ubuntu下的C/C++环境搭建 杨粼波 2011-12-18 17:16
配置一个合适自己的编辑环境,这个是最麻烦的。别的倒还好。不过,顺手的编辑环境靠的是自己慢慢的摸索,如果摸索出来了,之后再配置的话就仅仅是体力活了。
事实上,我一直都摆脱不了VS,都是在Windows下面编辑好,然后再到非Windows平台下编译调试的。
对于我这等抛弃不了鼠标的货来说,全键盘还是颇为不习惯的。
@小比
那就是别的服务没开。这个错误,虽然会启动的时候老报错,不过基本功能不影响使用。就是启动的时候看着不舒服而已。
re: 骑行水壶的选择技巧[未登录] 杨粼波 2011-11-02 23:48
我买了一个普通的水壶。用着还行。
re: SSH 登录太慢的解决方法 杨粼波 2011-07-19 20:11
我今天碰到一个问题是,我配置的DNS服务器,我这里连接不上,所以,系统没有DNS服务器可用,那么,既是意味着解析不到DNS。
所以,我发现,系统启动的时候,启动sshd的时候会很慢很慢,至少有一分钟的停顿。
而且,登陆ssh的时候,也非常非常的慢,这是我从前所未见到过的。
其缘故就是这个DNS解析。
@Orcas
一台服务器只需要花费一次的钱,外加托管的钱,不多的。
但是程序员的支出是每月的开支。
你要意识到这一点。
re: C++杂谈[未登录] 杨粼波 2011-07-11 21:38
一切遵循木桶效应,如果项目中有一两个水平低的,那么整个项目的质量都可能会被这一两个人所拖累。
如果一个人,掌握不了复杂的东西。风险最小原则,那么就不要使用复杂的东西,那将会把一切都搞砸掉。
不论是什么语言,什么技术,在技艺好的人手里,都能玩转自如,而在一个初学者,一个愚笨者手里,任何东西都会弄得一团糟。
c的好处,对我来说,就是可以平铺直叙,只要设计好数据结构,就可以写算法了,很简单。c++这些有oo的语言里面,你却需要去做一些OO设计,但是如果设计好了,那就很舒服了,因为所有细节都被遮挡住了。
在我学习的那么多语言中,各种语言有各种语言的特色特点,同样也有他们的缺点。语言本身没有错,存在的就是有理的。错的,永远都是使用语言的人。
工欲善其事,必先利其器。没有那把金刚钻,就不要揽那瓷器活。
这个模板,是在编译时做了一个类型检查,可以看做是一个断言:传入的参数必须是数组,否则编译不过。
是这样的。
不过,大多人都走进了这样一个误区。不过看起来是挺容易混淆的。
Sweep and Prune的话,4000个物体还能够接受。
我曾经做碰撞系统的时候,第一阶段Sweep and Prune耗费的时间几乎是微乎其微的。
如果要分离这个业务逻辑,我看,在线人数至少要几万以上。因为,分离意味着,它的计算量已经不是单机能够承受了。
最多的耗时,还是花费在了网络群发上面。
re: 观察者模式[未登录] 杨粼波 2011-06-20 14:25
==!那个,大话我也有买,不过束之高阁,还没看过……
我把几乎市面上所有的设计模式的书都买了。哈哈,收藏。
re: 观察者模式 杨粼波 2011-06-20 12:18
我还是觉得用报刊订阅讲述比较贴切。哈哈哈,这是经典的描述。
不过,楼主的讲述也很生动。哈哈哈,别有风味。
re: TinyXML总结 杨粼波 2011-06-20 12:14
RapidXML
TinyXML
这两个都是比较轻量级的。其中RapidXML,boost里面有用到。boost/property_tree里面用到了。因为,RapidXML内部自建了一个内存池,所以相对来说要比TinyXML要快。实验证明确实是如此的。而且,二者之间使用方法上比较相近。
补充一下,在Windows下面可以用纤程。
是一种类似coroutine的实现。
lua很轻量级;
python相对重一些,性能要比lua稍要差,不过还是很好用的,毕竟OO支持要好点,库神马的也多点;
jsp的话,语法接近Java,倒是合适招一些会点Java的人,v8采用的是编译执行的方式,性能还过得去;
Ruby其实也很不错,只不过它的GC有点让人纠结。
Mono严格意义上不算是一种语言,只能说是一种类似.net的平台。
Windows的换行方式和UNIX的方式不一样所导致的。
Windows是CR+LF的方式。
而UNIX的是LF的方式,
而MAC的是CR的方式。
最后一行回车是最简单的解决方式,我都已经保持了这样的一个习惯,尽管我现在一直在做Windows下的开发。
re: GUI库分块 杨粼波 2011-05-10 12:23
GUI实现也就那样了,都已经发展成熟了。
无需要对架构设计方面花费太多心思,CEGUI,Qt,都是比较好的。
GUI主要在堆砌GUI的控件上面,耗时耗力。抛开GUI的控件集,其实质性的东西也没有多少东西。
GUI核心无非要解决的就是:消息处理、图形渲染、配置(可编辑)。其中,消息处理和图形渲染是必须的两个核心。可编辑,如果时间不允许,不需要也可以,只是体力活比较累人。
@饭中淹
和我想的差不多。
比XML要紧凑一些。
以前看Jabber的时候,它是用XML序列化,不过,空间代价太大了。
版本兼容性,这是一个问题。我现在的做法是完全不兼容。只要是协议版本不一致,就强制性升级更新。我觉得这是一个简单有效的方法。如果还要兼容协议版本,做的事情多得多,这样就得耗费大量的时间在上面,而且对稳定性有一定的影响。
@饭中淹
我没有尝试过“类型加数值的序列化和反序列化”,这个的空间不太好吧?会相对多吃点字节数吧?
@饭中淹
还有一个,就是数据持久化。
嗯。。。。反正是IO神马的地方都可以用用。
我的服务器事件系统的一些数据有的也是用这个传递。
我是从arcemu里面拿出来的,感觉好像和mongos里面的是一样的。
还有一种利用std::stringstream做序列化的,倒也还可以。
用std::vector可以利用STL的内存分配器,这个比较省心。
@finalday
忘记说明了,此种方式只支持POD类型数据,这是我描述的缺失。
字节对齐,这个是可以指定的,问题倒不大,比如windows可以用:
#pragma pack(1)
Google Protocal Buffer使用的是序列化的方式,而且提供了它自己的协议描述语言,对于跨语言的情况下,是非常好用的。
这个文章,这段代码是讲解如何封包解包的。当然,缺点是,无法应付变长的情况。这一切都只是为了“简单”:套接字用的是阻塞的,不考虑非POD数据变长数据的情况。
re: MMO游戏对象属性设计[未登录] 杨粼波 2011-05-03 18:15
数据还是放到配置里面的好,比如csv,xml。
放脚本里面可以,但是编辑性不好啊。
做技术的,实事求是是最基本的。
不盲目崇拜,也不盲目的否定。
更不能叫骂人身攻击。
=。=不过,话说现在这个天气比较燥热,是容易爆火气。我最近凉茶度日。
std::vector进行一次内存分配的成本是很高的,需要销毁掉原有的内存块,创建一块新的内存块,然后还有进行一次拷贝。启动的时候,使用std::vector::reserve()进行预先分配,成本将会低上许多,即使是超支了,再分配的次数也是很微小的。这是一种空间换时间的做法。
像Buffer这种可以预先知道大致大小的场景,可以使用std::vector::reserve()预先分配好内存块。而非在使用时实时的进行多次的动态分配,虽然时间复杂度不大,但是代价还是是很大的。
std::vector::capacity() 返回vector所能容纳的元素数量(在不重新分配内存的情况下)
std::vector::reserve() 设置Vector最小的元素容纳数量。
做内存分配的是STL内置的allocator,capacity()本身所取得的是allocator所预先分配的大小。
vector::push_back导致vector大小增长过程是这样的,0 -> 1 -> 2 -> 4 -> 8 -> 16 -> 32 ...
既是以2的指数增长,虽然时间复杂度是o(1),但是还是比较费,因为有内存销毁,因为有内存拷贝,如果是原生数据还稍微好一点,如果是struct或者class,这是一个恶梦。
另,std::vector::append()这个方法是不存在的。
@路人甲
我并非恶语相向,而是如此的误导性的东西,是在误人子弟。此类型文章是面向初学者的,如果一个引路者误导他们,这是一件很糟糕的事情。
还有,0bug是谁?我还真不认识。
re: 博客迁移[未登录] 杨粼波 2011-04-25 14:15
额,我现在木有那个精力学语言哩……
要不,我也玩玩。
re: 博客迁移 杨粼波 2011-04-25 09:55
怎么去弄Lisp去了?
自己先好好学一学STL。
还capacity()机制,寒……
先仔细看看std::vector吧,
调用reserve()才会预分配内存。
这些都是STL的内存分配机制的问题。
自己先多学点东西吧。
根据我的观察,每调试一次,pdb的句柄就增加一次,调试多次的话,此解决方案无效,纵使关闭掉了IDE打开的文件句柄,文件却无法做写操作。用VS2003在Windows7上面调试就是一个巨大的悲剧。
最好的解决方案是:调试一次,关闭一次IDE。
re: 被delete难倒了[未登录] 杨粼波 2011-04-01 15:40
re: 被delete难倒了[未登录] 杨粼波 2011-04-01 14:39
把struct改为class,然后把数据private,测试一次看看。排除客户代码应用上的错误。
当然了,也有可能在调用的时候,被其他地方的错误牵连导致这个struct的数据被损坏。
如果牵扯到DLL的话,那有可能是exe和dll两者之间的版本不一致所导致,DLL的导出地址是用的一个,却不想exe用了另外一个,所以发生错误,这是有可能发生的。用VS的编译器,特别是2003,你需要依照以下步骤重编译:清理全部(包括dll和exe)->重编。
@zzy
这孩子,少见多怪了吧。破解的都这样,破解需要二进制级的修改文件,被杀毒软件认为有毒也是正常的。