大规模高性能网络服务器编程 大型游戏服务器编程


大规模高性能网络服务器编程 大型游戏服务器编程 完成端口模型 TCP UDP P2P 网络编程

           C++博客 | 首页 | 发新随笔 | 发新文章 | 联系 | 聚合 | 管理

              

     摘要: 这里设计了一个类,通过4个字节存储日期,8个字节存储DateTime,并添加了一些跟时间日期相关的函数, 如:星期几查询,特定日期之后多少天是几号, 两个日期之间相隔多少天等等。对于一般的用途,基本上够用了头文件: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter....  阅读全文
posted @ 2010-09-02 16:28 iKusamba 阅读(1929) | 评论 (4)编辑 收藏
导读:国产网游正在漫漫成长起来,这其中,有很多具有代表性的国产网游特色的设定,虽然表面上看是方便玩家,但深究起来,这些设定也有可能是毁掉国产网游毒瘤。  

      一、自动寻路
说到最具代表性的中国特色的网游设定,自动寻路当仁不让。这一设定美其名曰是简化玩家操作、完善游戏体验,实则对游戏是种很大的伤害。一般来说,网游 多是MMORPG,这种游戏旨在构建一个架空世界,玩家从中获取一种异样人生的体验。对这个世界的探索,照理来说应是游戏乐趣的一大来源,但赶路和找人确 实件烦人的事情。国外的设计师们为了解决这一问题,就把游戏地图探索变得更有趣,把游戏中的移动变得更多样化,以此来弥补玩家的枯燥旅途。但中国设计师明 显要聪明得多,所以他们做出来了“自动寻路”这样的设置——只不过这种做法,实际上是在鼓吹玩家急功近利的浮躁心态,和践踏游戏原本的乐趣。

     二、自动打怪
有时候你不得不承认中国是片神奇的土地,无论看起来多么不可思议的事情,在这里都有可能发生。比如说外挂,本来是所有游戏厂商应该深恶痛绝并必欲除之 而后快的,但在中国,游戏厂商们自己开发起了外挂,为了以示区分,这种由厂商自己开发的挂机系统被称之为“内挂”。当然中国的策划们是不会这么直白地叫的 ——人嘛,毕竟都要点脸面的——他们将此功能演示成“自动打怪”,真是光明正大极了。
网游跟单机的一大区别就是,网游最大的乐趣在于交流,这个交流不光是指玩家之间的聊天,包括如组队、偶遇甚至是抢怪等各种交互行为,都是交流。但自动打怪出来后,你在游戏里再也看到的不是再是一个活生生的人,而是临时性的NPC。这对国产游戏,能有什么好处?

    三、替身宝宝
判断一款网游优劣的标准很简单,就是看它有没有卖替身宝宝,如果有,那么你应立即放弃它。所谓替身宝宝,就是指即便玩家的角色下线了,也可以利用这个 宝宝来继续练级,仍然可以获得经验。每个游戏对这种设定的叫法不一样,但有一点却是共同,那就是肯定要花钱。因此从这个意义上来说,替身宝宝,实际上就是 游戏官方在赤裸裸地卖经验值,卖人物等级。
运营商自己出售人物经验值,这么匪夷所思的事情竟然也能想得出来,实在叫人佩服中国网游策划的绝顶聪明。

      四、开箱子
“开箱子”不必多说,这个就是个赌博系统。据说在这系统出来之后,澳门人后悔不迭:早知道还开什么赌场。开箱子已经是被国家明令禁止的设定,现在又有死灰复燃之势,只不过现在开的不再是箱子,而是袜子包子什么的了,总之只要你给钱,就是让开游戏策划的脑子他们也肯做。

      五、无限制PK
PK,绝对是网游中最重要的系统之一。与人竞技的乐趣,总是能刺激玩家们的分泌出新鲜的肾上腺激素。但并不意味着,PK可以是无限制的,可以是随心所 欲的。国外主流网游中,对PK都或多或少有一定的限制,比如最经典的设定“红名”,你在杀人的同时,你自己也将成为追杀的对象。但国产网游的主流却似乎是 在鼓励玩家这样做,至少说,看不到什么限制。很多国产网游,允许一个高等级的玩家,闯入低等级玩家的活动区,肆无忌惮地大开杀戒。这种对PK不加任何限制 的设定,实际上是在鼓励玩家滥杀无辜欺凌弱小,以方便游戏商趁机出售这种“恃强凌弱”的权力。
这样的游戏,会培养出什么样的玩家?这样的玩家,会造就一个什么样的游戏环境?这样的游戏环境,能为国产游戏带来什么样的希望?

     六、结婚系统
虽然说中国有3700万光棍,但我依然认为在网游里开设一个虚拟的“结婚”系统,是最为不能接受的设定。网游或许本来就是个交友平台,但你不能把它做 成一个婚介所!如果说仅仅是为玩家提供一个虚拟的游戏内的结婚仪式也就罢了,可恨的是有些网游还推出夫妻才有的技能、坐骑、道具……等等等等,简直就是逼 着玩家去泡女生,哪怕是人妖也行。现在不少网游更进一步,推出了“结婚生子”系统,这只能称之为脑残了。
结婚、生子,这些设定让国产网游散发出一股浓重的荷尔蒙味。

    七、仇人名单
仇人系统也是国产网游的一大特色,它与“无限制PK”是兄弟:假如你被人杀了,系统会自动将其加入你的仇人名单。加进来做什么?肯定不是叫你提防着对 方,而是要玩家牢记这个“仇人”,等将来等级高了好复仇。这基本上就是在挑拨玩家之间的人际关系,是在强化仇恨和报复。明显的是,游戏商会从玩家的复仇行 为中获取不少利润,比如说出售一种道具,能把你传送到你仇人的身边,这样无论他逃到哪里,你都能对其进行锲而不舍的追杀。
但这样一来,游戏环境势必恶化,因为系统本身是在放大玩家的阴暗面。更何况,挑拨和教唆他人就是作恶,而我还没见过谁作了恶,还敢称自己赚的钱是干净的。
posted @ 2010-09-01 17:47 iKusamba 阅读(364) | 评论 (2)编辑 收藏

代码:uniobj.h
 1 /************************************************************************
 2 *
 3 * Created by kusamba@126.com at 2009-2-12 16:37
 4 */
 5 
 6 #ifndef _uniobj_23593953_h_
 7 #define _uniobj_23593953_h_
 8 
 9 #include <WTypes.h>
10 #include <assert.h>
11 
12 /**
13 * Universal Object Declare
14 */
15 #define UNIOBJ_DECL(theClass)                \
16   public:                                    \
17   static theClass* Get()                     \
18   {                                          \
19     assert(NULL != ms_pk##theClass);         \
20     return ms_pk##theClass;                  \
21   }                                          \
22   static theClass* Create()                  \
23   {                                          \
24     assert(NULL == ms_pk##theClass);         \
25     return ms_pk##theClass = new theClass(); \
26   }                                          \
27   static void Destroy()                      \
28   {                                          \
29     if (NULL != ms_pk##theClass)             \
30     {                                        \
31       delete ms_pk##theClass;                \
32       ms_pk##theClass = NULL;                \
33     }                                        \
34   }                                          \
35   publicbool Initialize();                 \
36   private:                                   \
37     theClass();                              \
38     virtual ~theClass();                     \
39     static theClass* ms_pk##theClass;
40 
41 /**
42 * Universal Object Implement
43 */
44 #define UNIOBJ_IMP(theClass)                \
45     theClass* theClass::ms_pk##theClass = NULL;
46 
47 
48 #endif//_uniobj_23593953_h_

如何使用:
头文件:
1#include "uniobj.h"
2
3class ATestSingleTon
4{
5public:
6
7UNIOBJ_DECL(ATestSingleTon)
8}

cpp文件:
1UNIOBJ_IMP(ATestSingleTon)
2
     ATestSingleTon::ATestSingleTon()
    {}

    ATestSingleTon::~ATestSingleTon()
    {}

3bool ATestSingleTon::Initialize()
4{
5    return true;
6}

main.cpp
 1int main()
 2{
 3  ATestSingleTon* pk = ATestSingleTon::Create();
 4  if (NULL == pk)
 5  {
 6    return 0;
 7  }

 8
 9  //mainloop
10
11  ATestSingleTon::Destroy();
12}

分析:
1,singleton的构建在程序入口,析构在程序的结尾,可以避免相当多的多线程问题
2,这里的singleton对象均为程序必须要用到的对象,跟传统singleton定义有些出入
3,定义了initialize()函数只为对象的初始化提供一个接口,如果不需要可以直接return true


PS:可以参考看看如下资料
1,细说Singleton模式:创建、多线程与销毁 http://developer.51cto.com/art/200908/143492.htm
posted @ 2010-08-31 15:56 iKusamba 阅读(1460) | 评论 (10)编辑 收藏


_MSC_VER 定义编译器的版本。

下面是一些编译器版本的_MSC_VER值
 
  MS VC++ 9.0 _MSC_VER = 1500
     MS VC++ 8.0 _MSC_VER = 1400   
        MS VC++ 7.1 _MSC_VER = 1310   
        MS VC++ 7.0 _MSC_VER = 1300   
        MS VC++ 6.0 _MSC_VER = 1200   
        MS VC++ 5.0 _MSC_VER = 1100

给一段跟编译器相关的代码:

 1char* UStrcpy(char* pcDest, size_t stDestSize, const char* pcSrc)
 2{
 3#if _MSC_VER >= 1400
 4    strcpy_s(pcDest, stDestSize, pcSrc);
 5    return pcDest;
 6#else // #if _MSC_VER >= 1400
 7
 8    _ASSERT(stDestSize != 0);
 9
10    size_t stSrcLen = strlen(pcSrc);
11    _ASSERT(stDestSize > stSrcLen); // > because need null character
12
13    size_t stWrite;
14
15    if (stDestSize <= stSrcLen) // stDestSize < stSrcLen + 1
16        stWrite = stDestSize;
17    else 
18        stWrite = stSrcLen + 1;
19
20    char *pcResult = strncpy(pcDest, pcSrc, stWrite);
21    pcResult[stDestSize - 1= '\0';
22    return pcResult;
23#endif // #if _MSC_VER >= 1400
24}

 

说明:
Visual C++ 1.0,集成了MFC 2.0,是Visual C++第一代版本,1992年推出,可同时支持16位处理器与32位处理器版,可算是Microsoft C/C++ 7.0的更新版本。

Visual C++ 1.5,集成了MFC 2.5,增加了“目标文件链接嵌入 (OLE)2.0和支持MFC的开放式数据库链接(ODBC)。这个版本只有16位的,也是第一个以CD-ROM为软件载体的版本。这个版本也没有所谓“标准版”。它是最后一个支持16位软件编程的软件,也是第一个支持基于x86机器的32位编程软件。

Visual C++ 2.0,集成了MFC 3.0,第一个只发行32位的版本。这个版本提前发行了,几乎成了一个“丢失的版本”。这是因为那个时候Windows 95(开发代码为"Chicago")还没有发行,而Windows NT又只占有很小的市场份额。该版本用户可以通过微软公司的订阅服务(Microsoft Subscription Service)升级至2.1和2.2版本。微软公司在这个版本中集成并升级了Visual C++ 1.5,作为2.0版本(Visual C++ 1.5升级后版本号:1.51)以及2.1版本(Visual C++ 1.5升级后版本号:1.52)的一部分。Visual C++ 2.x附带了16位和32位版本的CDK,同时支持Win32s的开发。Visual C++ 2.2及其后续版本不再升级Visual C++ 1.5(尽管它一直被集成至Visual C++ 4.x)。尽管出生的比Windows 95早,这个版本的发行日期还是非常接近Windows 95,可是当Windows 95发行时,Visual C++ 4.0也已经发行了。因此很多程序开发者直接从1.x过渡到4.0,把2.x跳过去了。

Visual C++ 4.0,集成了MFC 4.0,这个版本是专门为Windows 95以及Windows NT设计的。用户可以通过微软公司的订阅服务(Microsoft Subscription Service)升级至4.1和4.2版本(此版本不再支持Win32s开发)。

Visual C++ 5.0,集成了MFC 4.21,是4.2版以来比较大的一次升级。

Visual C++ 6.0,集成了MFC 6.0,于1998发行。发行至今一直被广泛地用于大大小小的项目开发。但是,这个版本在Windows XP下运行会出现问题,尤其是在调试模式的情况下(例如:静态变量的值并不会显示)。这个调试问题可以通过打一个叫“Visual C++ 6.0 Processor Pack”的补丁来解决。奇怪的是,这个网页强调用户也必须运行Windows 98、Windows NT 4.0、或Windows 2000。

Visual C++ .NET 2002(也即Visual C++ 7.0),于2002年发行,集成了MFC 7.0,支持链接时代码生成和调试运行时检查。这个版本还集成了Managed Extension for C++,以及一个全新的用户界面(与Visual Basic和Visual C#共用)。这也是为什么Visual C++ 6.0仍然被广泛使用的一个主要原因。

Visual C++ .NET 2003(也即Visual C++ 7.1),集成了MFC 7.1,于2003年发行,是对Visual C++ .NET 2002的一次重大升级。
eMbedded Visual C++,用于Windows CE操作系统。Visual C++作为一个独立的开发环境被Microsoft Visual Studio 2005所替代。

Visual C++ 2005(也即Visual C++ 8.0),集成了MFC 8.0,于2005年11月发布。这个版本引进了对C++/CLI语言和OpenMP的支持。

Visual C++ 2008(也即Visual C++ 9.0),于2007年11月发布。这个版本支持.NET 3.5。

Visual C++ 2010(也即Visual C++ 10.0),于2010年发布,是目前最新的版本。Visual C++开发团队考虑使用SQL Server Compact格式的数据库来存储源码的相关信息[1].本版也加入了现代化的C++并行运算库-Parallel Patterns Library,部分支持C++0x。本版建构于.NET 4.0之上,但仍支持机器码的编译。

posted @ 2010-08-31 15:25 iKusamba 阅读(1388) | 评论 (0)编辑 收藏

makefile在windows之外的系统中广泛使用,大多数程序员依赖于vs的IDE; 掌握使用makefile,对于自动化构建很有用

vs使用nmake.exe作为构建的工具,有别于linux的make

nmake.exe在vs的安装目录下,

vs2005的默认目录是:C:\Program Files\Microsoft Visual Studio 8\VC\bin 或者 C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin (通常情况下这两个目录下该文件为同一个)
vs2003的默认目录是:C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin 或者 C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin

打开DOS窗口,输入nmake,可能会出现如下错误提示:


这是因为在vs的安装过程中,没有注册vs的环境变量,可以通过如下方法查看自己是否已经注册好vs的环境变量:

在DOS窗口中输入set path, 则会看到如下提示:


我这边已经注册好环境变量了,如果你没有看到,可以将vs的bin目录添加到系统环境目录的path里


重新打开DOS窗口,输入nmake,如果提示如下,则说明环境目录注册成功:


这时,可以开始我们的编译了,打开DOS窗口,导航到源代码目录,执行nmake,注意nmake对应的编译为makefile(无后缀名)

如果你系统里面有好几个vs版本,建议不要将环境变量添加到path里,我的做法是这样的:
1,在C:\下面新建目录utils,并将该目录添加到path的环境变量中
2, 将vs2005的bin目录下的vcvars32.bat和vs2003的vcvars32.bat分别copy到C:\Utils目录下,重命名为vc8.bat和vc7.bat
3,执行nmake前先执行vc7.bat(使用vs2003编译)或者vc8.bat(使用vS2005编译)

posted @ 2010-08-26 17:34 iKusamba 阅读(10887) | 评论 (1)编辑 收藏
仅列出标题
共4页: 1 2 3 4 

公告

导航

随笔分类

最新随笔

最新评论

阅读排行榜