摘要: 首先要说明的是, 这个棋牌游戏的服务器架构参考了网狐棋牌的架构。网狐棋牌最令人印象深刻的是其稳定性和高网络负载。它的一份压力测试报告上指出:一台双核r的INTEL Xeon 2.8CPU加上2G内存和使用共享100M光纤的机子能够支持5000人同时在线游戏。 在研究其服务器框架后发现,它的网络部分确实是比较优化的。它主要采用了Windows提供的IO完成端口来实现其网络组件。本服务器虽然参考了其设计,但是还是有很大的不同,因为这个服务器框架主要是用在linux系统之上,而网狐棋牌是基于Windows平台的,严重依赖于windows sdk。这个架构延续了网狐棋牌在网络组件所作的努力,... 阅读全文
posted @ 2012-09-15 23:26 李书淦 阅读(13729) 评论(3) 推荐(5) 编辑
摘要: 现象:1. 在两个不同的dll中使用static的boost.log。在一个dll中的设置在另一个dll中没有起作用原因:core::get()返回的是一个单例。在不同的dll中是不同的对象解决办法: -DBOOST_LOG_DYN_LINK 阅读全文
posted @ 2014-02-04 18:15 李书淦 阅读(359) 评论(0) 推荐(0) 编辑
摘要: 现象:1。 没有使用boost.log前能正常收发数据2。加入boost.log后async_connect没有回调fix过程:1. gdb调试发现程序block在pthread_timed_wait.死锁? 使用helgrind没有检查出异常.2. 难道是内存错误? valgrind的memcheck也没有发现异常3. 重新编译boost为debug版, gdb调试发现 task_io_service的op_queue_works_的内存地址在使用boost.log前后居然从63070变成了63078。查看task_io_service.hpp发现一个outstanding_works_ 的 阅读全文
posted @ 2014-02-04 18:08 李书淦 阅读(2571) 评论(0) 推荐(0) 编辑
摘要: function [optSolution,optValue,exists]=BranchBound(c,A,b)% 分支定界法% 整数规划问题标准型% min c'*x% s.t.% A*x 1e-7 %进行分枝操作,就将子问题入栈 temp_A = zeros(1,numOfVariable); temp_A(iVar) = -1; branchStack_A(len) = {[A;temp_A]};... 阅读全文
posted @ 2013-08-10 22:42 李书淦 阅读(6034) 评论(0) 推荐(0) 编辑
摘要: 有一个圆桌,无数地硬币。两个人进行游戏,游戏的规则是:1) 每人一次放一硬币到圆桌上; 2)最后找不到地方放硬币的人为输。现在如果让你放第一个硬币,你怎样才能保证你一定能赢利比赛。答:你可以将第一枚硬币放在圆桌的最中央。然后对手每放一枚,你就在对称的位置放另一枚。这样你总是有地方放硬币的。最后找不到位置放的人一定是对方。 阅读全文
posted @ 2012-09-22 16:32 李书淦 阅读(425) 评论(0) 推荐(0) 编辑
摘要: 有一个无序整数数组,其中每个数都不相同,且每个数的取值范围为[1,N]。 设计一个时间复杂度为O(N)的算法,找出满足下面两个条件的数对的个数:1) 相邻两个数的和也在这在这个数组之中;2) 这两个数本身也相邻。答: 这个数组中的数有几个特征:(1) 每个都不相同;(2) 取值范围为[1,N], 完全满足计数排序的要求。不过这里不是要排序,但是可以用相同的思想: 用一个位数组,第i位为1表示数i在数组中, 第i位为0表示数i不在数组中。这样第一个条件的验证就很简单了,只要看一个相邻两个数的和对应位是否为1即可。 下面是C++实现:#include <bitset>#include 阅读全文
posted @ 2012-09-21 18:40 李书淦 阅读(587) 评论(0) 推荐(0) 编辑
摘要: 有10瓶药丸,可以认为每一瓶的药丸有无限有颗。这其中有9瓶是好的,一瓶是坏的。坏药丸比好药丸重1g,现给你一杆称,问:1) 最多称几次可以确定那一瓶中装的是坏药丸?2) 如果事件不知道有几瓶中装的是坏的,又要称多少次可以确定哪些瓶中装的是坏的?答: 1) 1 次。 用 H(i) = 1 表示第i瓶中装的是坏药丸,H(i) = 0 表求第i瓶中装的是好药丸。从第i瓶中取出i粒药丸,则这些药丸一共重了: H(1) * 1 + H(2) * 2 + ... + H(10) * 10 = H(k) * k ( 1 <= k <= 10); 因为H(i) ( 1 <= i < = 阅读全文
posted @ 2012-09-21 18:02 李书淦 阅读(1141) 评论(4) 推荐(0) 编辑
摘要: 这里的应用层,指的是CenterServer、LogonServer、LogServer、RoomServer等几个服务器,另外还包括游戏模块的设计。不过游戏模块和前4个服务器的设计很不相同。这里先说一下服务器应用的详细设计。 这上面提到的4个服务器都需要响应客户端(这里的客户端的意思是泛指)的请求,进行数据库操作,同时还要能够配置,以及显示系统运行的状态信息等。这里会采用MVC模式来组织应用层逻辑。图1 Application层基本结构 IController从ITCPServiceObserver继承而来,会与ITCPServerService进行交互,因此它需要解析客户端发过... 阅读全文
posted @ 2012-09-16 19:41 李书淦 阅读(5969) 评论(0) 推荐(2) 编辑
摘要: 内核的几个组件被设计成Service,也就是说这几个模块都要实现如下接口:图1 IService接口 Start方法用来启动服务。 Stop 方法用来关闭服务。 IsService 方法用于查询当前服务是否正在工作。 内核中的几个Service都不能够直接创建,Applications在使用这些Service的时候首先要得到一个IServiceMgr的实例,这被实现成了一个另类地单例模式。IServiceMgr的接口定义如下:图2 IServiceMgr接口 IServiceMgr提供两类接口: 1) 获取Service的接口,这样直接得到具体的Service,是因... 阅读全文
posted @ 2012-09-16 15:07 李书淦 阅读(3414) 评论(0) 推荐(0) 编辑
摘要: 主要有3类Database: ServerInfoDB,UserInfoDB和GameDB。 ServerInfoDB主要存储的是游戏列表的信息,UserInfoDB存储玩家的全局信息,而GameDB就是积分以及积分变化情况。下面分别加以描述。1. ServerInfoDB ServerInfoDB主要存储游戏列表信息。主要有以下几个表: 1. GameTypeInfo,其主要字段为: TypeID:类型标识 ID TypeName:类型名字,例如棋牌类,休闲类 Enable:控制游戏大厅是否显示该类型,默认为 1,即为默认显示 2. GameKindI... 阅读全文
posted @ 2012-09-16 12:39 李书淦 阅读(4017) 评论(0) 推荐(0) 编辑
摘要: 先看一下,下面这张可能的部署图吧。图1 系统布署图 在这个图中,可以看到,客户端的形式多种多样,可能是pc上的一个可执行文件,也可能是通过浏览器打开的一个网页,甚至于手机客户端。它们都通过internet连接到游戏服务器。 在这个部署中有1个CenterServer,1个LogServer,3个LogonServer和很多个RoomServer(只显示了德州扑克的两个房间)。这些Server有可能分布在同一台机器上,也可以分布在不同的机器之上。这对扩容来说是极为方便地。在玩家数量增大,系统不足以承载其网络负载时,只需要买更多的机器,架设更多的RoomServer或者LogonSe... 阅读全文
posted @ 2012-09-16 00:38 李书淦 阅读(5334) 评论(1) 推荐(2) 编辑
摘要: postgresql 动态 hash 分析 阅读全文
posted @ 2012-09-13 22:02 李书淦 阅读(1361) 评论(0) 推荐(0) 编辑
摘要: postgresql堆内在的管理 阅读全文
posted @ 2012-09-12 00:01 李书淦 阅读(2527) 评论(0) 推荐(0) 编辑
摘要: 这段时间,我在用软件实现一个3D图形库,因为一些原因,想要使用c++11中的东西。被迫自己编译gcc4.7. 在这个过程中传到了很多的问题,经过不懈的努力终于是成功编译出来了,现在记录一下,算作个备份。我是在ubuntu11.10上编译的.会到了如下错误1.configure错误,说没有gmp,什么的。2.undefined reference to `lexer_line' 3. fatal error: bits/predefs.h :File or directory not found 4. ld can't find crti.o相应的解决如下:1. a... 阅读全文
posted @ 2012-02-06 10:59 李书淦 阅读(2697) 评论(0) 推荐(0) 编辑
摘要: 对于像这样一个xml文件:<?xml version="1.0" encoding="UTF-8"?><level> <begin x="80" y="415" /> <end x="720" y="415" /> <walls count="3"> <wall left="195" top="130" right="201" bo 阅读全文
posted @ 2011-10-02 10:24 李书淦 阅读(5209) 评论(0) 推荐(0) 编辑
摘要: try { FileOutputStream out = new FileOutputStream("/sdcard/pp.png"); CU.BG_BMP.compress(Bitmap.CompressFormat.PNG, 90, out); } catch (Exception e) { e.printStackTrace(); }记得要加上 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 阅读全文
posted @ 2011-10-02 10:14 李书淦 阅读(316) 评论(0) 推荐(0) 编辑
摘要: 一 使用先说一下如何使用这个framework。其基本用法和java的junit差不多,只是没那么强大而已。看一下下面所示的这个IntWraper 类:现在要给它写一个unittest ,你只要做如下工作就可以了:包含头文件: #include "FAssert.h"定义一个测试类,在这个类中使用下列宏来申明test case: DECLARE_AS_TESTER //申明一个类为tester,需要放在开头[必有] DECLARE_SETUP //申明一个setup方法[可选] DECLARE_TEARDOWN //申明一个teardown方法用于清理工作[可选] DECLARE_TES 阅读全文
posted @ 2010-12-26 12:24 李书淦 阅读(1642) 评论(0) 推荐(1) 编辑
摘要: “宏”这个玩意儿可能会触动很多人抵触的情绪,我也一样:很讨厌它。通常我不会用它进行计算,只有在合适的时候(比如能让我少打一些字,或者能增强代码的可读)才会请出它来。好了,言归正转,现在我要将一个代码片段有规律地重复N次,更具体点,就是在定义一个模板的时候,参数列表会很长,但是这些参数的名字是很有规律地:依次为typename T1,typename T2,....typename TN:在C++还没有支持模板的List参数(《C++ template》第13章)之前,我们可以利用宏来减少我们的工作量。  想一下吧,如果问题变了,现在的问题是要你写一个函数打印出上面的模板参数列表,你会怎么干?拿 阅读全文
posted @ 2010-12-18 10:23 李书淦 阅读(4357) 评论(1) 推荐(3) 编辑
摘要: 在带类的C中呆久了,还以为callback是静态或者全局函数的专利。有时为了让一个类的成员函数可以作为callback,不得不写一个静态函数,然后在这个函数的实现里面傻傻地调用一下那个成员函数。例如AnimateImage,这是一个从Widget继承下来的UI类,用来提供一种功能,定时地显示不同的图片,它的实现像下面这样.  class AnimateImage:publicWidget  {  public:   virtual void UpdateImage( void );   };  由于要求定时地更新图片,应该将UpdateImage加到一个定时器之中。在以前,我会这样来做这样事: 阅读全文
posted @ 2010-12-10 21:20 李书淦 阅读(1283) 评论(0) 推荐(1) 编辑
摘要: 在与业务逻辑相关的模块中,不同的类之间共享一些数据是再平常不过的事啦。在前两年的程序员生涯中,我主要采用过两种方式:使用数据管理类 我所在公司的应用程序框架使用的是MVC三层架构,由于历史原因,每个模板都由一个Model,一个controller加上一系列的View组成,所有要共享的数据都存在Model中,Model提供setter和访问接口: SetObject(int nObjectID,Object*pObject); Object*GetObject(int nObjectID); 这样,如果你要共享一个自定义的对象,拿AddressBook来说吧你需要做如下事情: 1) 从Obje 阅读全文
posted @ 2010-12-10 09:03 李书淦 阅读(1193) 评论(0) 推荐(0) 编辑
摘要: 我们可以细数高通给开发者带来的不便: (1)对内存没什么保护,很容易就crash啦; (2)Crash也就算了,机器都给弄死了; (3)机器死了也就死了,死了可以重启,可是重启速度超慢; (4)重启速度已经够慢了,可还得忍受连到PC机上的蜗牛速度; (5)文档不够好,比MSDN差得那不是一点点。 这样下来,开发brew程序的效率就明显要比开发其他平台程序低很多。老板可不会管你这一套,他们眼里看得到的只有money,别人在单位时间内能搞定你为什么不行。所以,为了那刚好维持生计的薪水,你就不得不加班啦。可是brew程序员也是人呐,也要休息,也要有自己支配的时间。怎么办呢?还是古语说得好:工欲善其事 阅读全文
posted @ 2010-12-06 09:36 李书淦 阅读(549) 评论(0) 推荐(0) 编辑
摘要: 我以前很排斥异步调用,一看到异步调用就觉得特别扭:同步调用多好,一步步地执行,一异步程序的运行顺序不大直观。可是近段时间有了新的体会,觉得有时异步真有它的好处。记下来,作个备忘。 先要说说那个让我觉得非得用异步调用不行的场景吧。这涉及到Command模式,为了对一个业务逻辑建模我写了一大堆Command,并把这此Command加到一个队列中。每次从这个队列中取出一个来执行。类图如下:Continue函数的实现看起来像这样: m_pCurCommand= m_queueCommands.Dequeue(); if(NULL!= m_ pCurCommand) { m_pCurCommand-E 阅读全文
posted @ 2010-12-06 09:04 李书淦 阅读(566) 评论(1) 推荐(0) 编辑
摘要: 在VS中你可以通过以下步骤选择默认编译器:Tools-Options-BrewMP,然后在ARM Compiler中选择你想使用的编译器。 郁闷的是,我使用的RVCT4.0没有出现在这个下拉列表中,仔细研究了一下,发现可以通过make命令行选项指定编译器:右键-Brew MP Properties-Arm Build-Custombuild commands.像下面这样选择: 阅读全文
posted @ 2010-10-25 10:58 李书淦 阅读(555) 评论(2) 推荐(0) 编辑
摘要: Singleton相关问题 阅读全文
posted @ 2010-10-02 19:51 李书淦 阅读(1408) 评论(0) 推荐(1) 编辑
摘要: Brew开发者的福音,现在可以用Visual Studio在真机上调试Brew程序啦!! 阅读全文
posted @ 2010-09-14 12:38 李书淦 阅读(977) 评论(1) 推荐(0) 编辑
摘要: C++程序员怎么远离野指针 阅读全文
posted @ 2010-09-06 09:16 李书淦 阅读(558) 评论(0) 推荐(1) 编辑