无法验证游戏版本用c++版本?

进行许可。 ——
游戏人生 != ( 人生 == 游戏 )
站点迁移至:
。请订阅本博的朋友将RSS修改为
posts - 62, comments - 451, trackbacks - 0, articles - 7
联系我:
2011年8月
常用链接
留言簿
随笔分类
随笔档案
文章分类
外部链接
最新随笔
搜索 积分与排名
积分 -
排名 -
最新随笔
最新评论
注意永远不要用自然语言翻译代码作为注释
--timberland boots
学习了!!
--Omega replica
看不懂
--replica chanel watches
C++ 木有学过
--replica Rolex watches
这么简单的问题,写了这么多废话,也算是人才了。。。
阅读排行榜
评论排行榜
本文同步自
最近有点忙,本来要用autoconf+automake把自己的代码梳理一下的,因为工作停了近两周。
本想看看有什么工具可以自动生成Makefile.am,***是:
。既然说的这么言词凿凿,情深意切,我想我也没有必要用shell生成Makefile.am了。
用着用着,我有点怀疑人生了:不知道什么时候需要用autoconf和automake。如果我只是平时自己写一些toy
codes的话,感觉用autoconf和automake有点大炮打蚊子的感觉,而且每次新加代码或者是移除代码、甚至是更改目录,都要重新执行
autoconf、automake(不知道我说的对与不对)。对于一个大型项目,执行一次configure和make是很痛苦的一件事,make的中
间目标文件或者库文件、执行文件倒是不一定非得完全rebuild,configure的配置检查呢?是不是也有类似机制?反正我在用ogre或者
cegui的时候,每次执行./configure是重新配置了的。
实际在开源项目里面也不可能维护两套makefile吧。
看了一下
的配置,倒是清爽的很,最大的特点是只有一个Makefile.am,这样在一个项目里面只需要维护一个Makefile.am就够了。
比较常规,每个子目录都会维护一个Makefile.am。
需要特别注意的是ogre从
开始已经开始使用
了… #8230;
请听题:管理中小型项目,你倾向于下面哪个工具?
o make:钻木取火,玩的就是个技术,编译代码,只用装B的,不用牛B的,你要是用什么cmake,你都不好意思跟别人打招呼,这么经典的东西,精通需要多久?要我说怎么着也得个把俩月吧,个把俩月?那是入门,至少半年,就这还得有Feldman的悟性,不舍昼夜;
autoconf+automake:既有群众基础,又有技术含量,你是那样拉轰的男人,不管在什么地方,就好像漆黑中的萤火虫一样,那样的鲜明,那样的
出众。你那忧郁的眼神,稀嘘的胡喳子,神乎其技的指法;既可以耻笑原始人的生产力低下,还可以鄙视现代人的不学无术。
cmake:在MSVCers面前抬不起头,在UNIXers面前似乎更抬不起头;而cmake对WINDOWS和UNIX平台的完美支持,足以让所有的
MSVCers和UNIXer在你面前抬不起头,你是公鸡中的战斗机。所以你还是可以趾高气昂的丢下一句:走NB的路,让SB说去吧。
posted @
Fox 阅读(2367) |
| 摘要: 从接触和使用make以来,前前后后写了不少Makefile(添添减减、修修补补,累计上千行是有的),今天在重新整理代码的组织结构之后,突然就想:我为什么不使用Autotools呢?
在开始体验功能强大的Autotools之前,简单(详细)回忆总结一下我使用make的经历和思考的过程,反省一下看看自己在接触这些新鲜事物的时候到底走了多少弯路。 posted @
Fox 阅读(3232) |
| 本文同步自
Writen by Fox(yulefox.at.gmail.com)
在具体讨论之前,本文先厘清UUID(Universally Unique IDentifier)与GUID(Globally Unique IDentifier)的关系。
在分布式、网络、单机环境下,为了能够使用具有某种形式的ID唯一标识系统中的任一元素,这样的ID可以不依赖中心认证自动生成,于是UUID就诞生了。
UUID标准的历史沿革和具体实现在
中均有详细描述。ITU和ISO采用的标准和RFC 4122都是在UUID的早期版本基础上完成,各版本之间具有一致性和兼容性。
因为不能保证UUID的唯一性,ITU和ISO针对UUID的使用都有
GUID一般是指Microsoft对于UUID标准的实现,UUID的实现则多见于其他系统(*NIX、MAC OS等)中。在了解了这一区别后,本文将统一使用UUID来指代对应的原理、算法及实现。
文中关于UUID的讨论全部基于RFC 4122和ITU-T Rec.
X.667以及OSF、IETF、ITU-T、ISO、FIPS的各种标准文档。而UUID的细节(如结构、表示、算法、实现等)均以ITU-T
Rec. X667为唯一蓝本,文中“本标准”即指代该蓝本。
o 介绍
UUID是长度为16-byte(128-bit)的ID,一般以形如f81d4fae-7dec-11d0-a765-00a0c91e6bf6的字符串作为URN(Uniform Resource Name,统一资源名称)。
o 动机
无须中心认证,自动生成,支持一台机器每秒生成10M次(100纳秒级,其隐含原因是指能够区分的最小时间单位为100 ,将时间作为因子时,连续生成两个UUID的时间至少要间隔100 )。方便存取、分配、排序、查找。
o 结构 76543210765432107654321076543210 + – - – = – - – = – - – = – - – +
15 | TimeLow | 12
11 | TimeMid | Version.. | 8
7 |Vari.. |Clock..| Node | 4
3 | Node | 0 + – - – = – - – = – - – = – - – +
15 – 12: TimeLow 时间值的低位
11 – 10: TimeMid 时间值的中位
09 – 08: VersionAndTimeHigh 4位版本号和时间值的高位
07: VariantAndClockSeqHigh 2位变体(ITU-T)和时钟序列高位
06: ClockSeqLow 时钟序列低位
05 – 00: Node 结点
hexOctet = hexDigit hexDigit
hexDigit =
“0″ / “1″ / “2″ / “3″ / “4″ / “5″ / “6″ / “7″ / “8″ / “9″ /
“a” / “ #8221; / “c” / “d” / “e” / “f” /
“A” / “B” / “C” / “D” / “E” / “F”
TimeLow
“-” TimeMid
“-” VersionAndTimeHigh
“-” VariantAndClockSeqHigh ClockSeqLow
“-” Node
UUID由上述6个域构成,每个域编码为若干字节,并以16进制数表示这128位的UUID,相邻域以减号“-”分隔
(VariantAndClockSeqHigh和ClockSeqLow对应的两个字节例外,如上所示)。该结构中包含版本(Version)、变体
(Variant)、时间(Time)、时钟序列(Clock Sequence)、节点(Note)信息(以无符号整型值表示)。
o 合法性
除判断variant位设置是否正确、基于时间生成的UUID时间值是否为未经分配的将来时间外,实际应用中没有其他机制可以判定UUID是否合法。
o 变体
Variant位是UUID第7字节(VariantAndClockSeqHigh)的最高3位,
7 6 5 Description
0 – – NCS向后兼容
1 0 – 本标准
1 1 0 Microsoft向后兼容
1 1 1 ITU-T Rec. X.667保留
o 版本
UUID的生成有时间、名称、随机数三种策略,以第9字节(VersionAndTimeHigh)的最高4位表示。
目前UUID定义有5个版本:
7 6 5 4 Ver Description
0 0 0 1 1 基于时间的版本(本标准)
0 0 0 0 2 使用嵌入式POSIX(DCE安全版本)
0 0 1 1 3 使用MD5哈希的基于名称的版本(本标准)
0 1 0 0 4 基于随机数的版本(本标准)
0 1 0 1 5 使用SHA-1的基于名称的版本(本标准)
o 时间
时间是一个60位的整型值(除4位版本号外的前8字节),对应UTC(格林尼治时间1582年10月15日午夜始)的100 时间间隔计数。
对于ver 4和5,该值分别对应一个随机数和一个全局唯一的名称。
o 时钟序列
对基于时间的UUID版本,时间序列用于避免因时间向后设置或节点值改变可能造成的UUID重复,对基于名称或随机数的版本同样有用:目的都是为了防止UUID重复。
如果前一时钟序列已知,通过自增实现时钟序列值的改变;否则,通过密码学(伪)随机数设置新的时钟序列值。
o 节点
对基于时间的UUID版本,节点由48位的单播MAC地址构成。对于没有MAC地址的系统,节点值为一个密码学(伪)随机数(为防止与MAC地址发生碰撞,需设置多播位)。
o 基于时间的UUID生成算法
o 确定UTC时间(60位 Time)和时间序列值(14位 ClockSequence);
o 设置TimeLow(对应Time的31-0位);
o 设置TimeMid(对应Time的47-32位);
o 设置VersionAndTimeHigh(4位版本号及Time的59-48位);
o 设置VariantAndClockSeqHigh(变体位及对应ClockSequence的13-8位);
o 设置ClockSeqLow(对应ClockSequence的7-0位);
o 设置Node(对应48位MAC地址)。
o 基于名称的UUID生成算法
o 针对相应的命名空间(如DNS、URL、OID等)分配一个UUID作为所有UUID的命名空间标识;
o 将名称转换为字节数列;
o 使用MD5或SHA-1算法对与名称关联的命名空间标识进行计算,产生16字节哈希结果;
o 设置TimeLow(对应哈希值的3-0字节);
o 设置TimeMid(对应哈希值的5-4字节);
o 设置VersionAndTimeHigh(对应哈希值的7-6字节),以相应版本号重写对应位(第9字节的高4位);
o 设置VariantAndClockSeqHigh(对应哈希值的第8字节),重写变体对应位(第7字节的高2位,本标准对应值为10);
o 设置ClockSeqLow(对应哈希值的第9字节);
o 设置Node(对应哈希值的15-10字节)。
于MD5碰撞问题,MD5只用于向后兼容的UUID生成,不再被推荐使用。由于SHA-1哈希结果为160位(20字节),本算法中,需要将FIPS
PUB 180-2中的SHA-1算法的哈希值字节顺序反转(字节内顺序不变),UUID使用其15-0字节,19-16字节被丢弃。
o 基于随机数的UUID生成算法
o 设置VariantAndClockSeqHigh的变体位值为10;
o 设置VersionAndTimeHigh的4位版本号;
o 设置剩余位为随机值。
本文中讨论的密码学随机数,主要根据系统可以提供的信息(内存、硬盘、句柄、程序运行的线程、进程、句柄、堆栈等),利用SHA-1等哈希算法得到。
其他关于密码学随机数的描述,我曾在
中简单提到。
具体算法实现可以参考文档和开源代码。
posted @
Fox 阅读(4312) |
| 本文同步自
以前曾经讨论过
,这次在对照ACE和Boost代码的时候,又重新审视了一下二者对Singleton不同的实现。其间的差别也体现了不同的编程哲学:ACE的实现更加偏重多线程中的安全和效率问题;Boost的实现则偏重于使用语言自身的特性满足Singleton模式的基本需求。
o ACE的实现
Douglas C. Schmidt在
一文中对double-check lock(一般译为双检锁)进行了详细的阐述。
ACE的Singleton使用Adapter模式实现对其他类的适配,使之具有全局唯一的实例。由于C++标准并非明确指定全局静态对象的初始化顺序,ACE使用double-check lock保证线程安全,并使之不受全局静态对象初始化顺序的影响,同时也避免了全局静态实现方式的初始化后不使用的开销。
如果你能够准确的区分以下三种实现的弊端和隐患,对double-check lock也就有了足够的了解。
// -------------------------------------------
cla Singleton
public: static Singleton *i tance (void) { // Co tructor of guard acquires // lock_ automatically. GuardMutex guard (lock_); // Only one thread in the // critical section at a time. if (i tance_ == 0) i tance_ = new Singleto return i tance_; // Destructor of guard releases // lock_ automatically. }
private: static Mutex lock_; static Singleton *i tance_;
// ---------------------------------------------
static Singleton *i tance (void)
{ if (i tance_ == 0) { GuardMutex guard (lock_); // Only come here if i tance_ // ha ’t been initialized yet. i tance_ = new Singleto } return i tance_;
// ---------------------------------------------
cla Singleton
public: static Singleton *i tance (void) { // First check if (i tance_ == 0) { // E ure serialization (guard // co tructor acquires lock_). GuardMutex guard (lock_); // Double check. if (i tance_ == 0) i tance_ = new Singleto } return i tance_; // guard destructor releases lock_. }
private: static Mutex lock_; static Singleton *i tance_;
更多详情,见Schmidt老师的原文和ACE_Singleton实现。
o Boost的实现
Boost的Singleton也是线程安全的,而且没有使用锁机制。当然,Boost的Singleton有以下限制(遵从这些限制,可以提高效率):
o The cla es below su ort usage of singleto , including use in program startup/shutdown code, AS LONG AS there is only one thread ru ing before main() begi , and only one thread ru ing after main() exits.
o This cla is also limited in that it can only provide singleton usage for cla es with default co tructors.
// T must be: no-throw default co tructible and no-throw destructible
template typename T
struct singleton_default
private: struct object_creator { // This co tructor does nothing more than e ure that i tance() // is called before main() begi , thus creating the static // T object before multithreading race i ues can come up. object_creator() { singleton_defaultT::i tance(); } inline void do_nothing() co t { } }; static object_creator create_object; singleton_default();
public: typedef T object_type; // If, at any point (in user code), singleton_defaultT::i tance() // is called, then the following function is i tantiated. static object_type &am i tance() { // This is the object that we return a reference to. // It is guaranteed to be created before main() begi because of // the next line. static object_type obj; // The following line does nothing else than force the i tantiation // of singleton_defaultT::create_object, whose co tructor is // called before main() begi . create_object.do_nothing(); return obj; }
template typename T
typename singleton_defaultT::object_creator
singleton_defaultT::create_object;
对于多数Singleton使用,Boost提供的版本完全能够满足需求。为了效率,我们有必要对其使用作出一定的限制。
而在多线程编程中,则有必要使用double-check lock降低频繁加锁带来的开销。
-------------------------------------------------------------------------------
PS: 欣赏Soft的一句话:
经得起诱惑,耐得住寂寞
posted @
Fox 阅读(3341) |
| 本文同步自
在使用IOCP时,最重要的几个API就是GetQueueCompeltionStatus、WSARecv、WSASend,数据的I/O及其完成状态通过这几个接口获取并进行后续处理。
GetQueueCompeltionStatus attempts to dequeue an I/O completion packet from the ecified I/O completion port. If there is no completion packet queued, the function waits for a pending I/O operation a ociated with the completion port to complete.
BOOL WINAPI GetQueuedCompletionStatus(
CompletionPort
LPDWORD
lpNumberOfBytes
PULONG_PTR
lpCompletionKey
LPOVERLAPPED *
lpOverla ed
dwMilliseconds
If the function dequeues a completion packet for a succe ful I/O operation from the completion port, the return value is nonzero. The function stores information in the variables pointed to by the
lpNumberOfBytes
lpCompletionKey
lpOverla ed
parameters.
除了关心这个API的in &am out(这是MSDN开头的几行就可以告诉我们的)之外,我们更加关心不同的return &am out意味着什么,因为由于各种已知或未知的原因,我们的程序并不总是有正确的return &am out。
lpOverla ed
is NULL and the function does not dequeue a completion packet from the completion port, the return value is zero. The function does not store information in the variables pointed to by the
lpNumberOfBytes
lpCompletionKey
parameters. To get extended error information, call
. If the function did not dequeue a completion packet because the wait timed out,
GetLastError
retur WAIT_TIMEOUT.
假设我们指定
dwMilliseconds
为INFINITE。
这里常见的几个错误有:
WSA_OPERATION_ABORTED (995): Overla ed operation aborted.
由于线程退出或应用程序请求,已放弃I/O 操作。
An overla ed operation was canceled due to the closure of the socket, or the execution of the SIO_FLUSH command in
. Note that this error is returned by the operating system, so the error number may change in future releases of Windows.
成因分析
:这个错误一般是由于peer socket被
closesocket
WSACleanup
关闭后,针对这些socket的pending overla ed I/O operation被中止。
解决方案
:针对socket,一般应该先调用shutdown禁止I/O操作后再调用closesocket关闭。
严重程度
轻微易处理
WSAENOTSOCK (10038): Socket operation on no ocket.
An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for
, a member of an
was not valid.
成因分析
:在一个非套接字上尝试了一个操作。
closesocket
关闭socket之后,针对该invalid socket的任何操作都会获得该错误。
解决方案
:如果是多线程存在对同一socket的操作,要保证对socket的I/O操作逻辑上的顺序,做好socket的graceful disco ect。
严重程度
轻微易处理
WSAECONNRESET (10054): Co ection reset by peer.
远程主机强迫关闭了一个现有的连接。
An existing co ection was forcibly closed by the remote host. This normally results if the peer a lication on the remote host is suddenly sto ed, the host is rebooted, the host or remote network interface is disabled, or the remote host uses a hard close (see
for more information on the SO_LINGER option on the remote socket). This error may also result if a co ection was broken due to keep-alive activity detecting a failure while one or more operatio are in progre . Operatio that were in progre fail with WSAENETRESET. Su equent operatio fail with WSAECONNRESET.
成因分析
:在使用WSAAccpet、WSARecv、WSASend等接口时,如果peer a lication突然中止(原因如上所述),往其对应的socket上投递的operatio 将会失败。
解决方案
:如果是对方主机或程序意外中止,那就只有各安天命了。但如果这程序是你写的,而你只是hard close,那就由不得别人了。至少,你要知道这样的错误已经出现了,就不要再费劲的继续投递或等待了。
严重程度
轻微易处理
WSAECONNREFUSED (10061): Co ection refused.
由于目标机器积极拒绝,无法连接。
No co ection could be made because the target computer actively refused it. This usually results from trying to co ect to a service that is inactive on the foreign host—that is, one with no server a lication ru ing.
成因分析
:在使用co ect或WSACo ect时,服务器没有运行或者服务器的***队列已满;在使用WSAAccept时,客户端的连接请求被condition function拒绝。
解决方案
:Call
WSACo ect
again for the same socket. 等待服务器开启、***空闲或查看被拒绝的原因。
是不是长的丑或者钱没给够,要不就是服务器拒绝接受天价薪酬自主创业去了?
严重程度
轻微易处理
WSAENOBUFS (10055): No buffer ace available.
由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作。
An operation on a socket could not be performed because the system lacked sufficient buffer ace or because a queue was full.
成因分析
:这个错误是我查看错误日志后,最在意的一个错误。因为服务器对于消息收发有明确限制,如果缓冲区不足应该早就处理了,不可能待到send/recv失败啊。而且这个错误在之前的版本中几乎没有出现过。这也是这篇文章的主要内容。像co ect和accept因为缓冲区空间不足都可以理解,而且危险不高,但如果send/recv造成拥堵并恶性循环下去,麻烦就大了,至少说明之前的验证逻辑有疏漏。
WSASend失败的原因是:The Windows Sockets provider reports a buffer deadlock. 这里提到的是buffer deadlock,显然是由于多线程I/O投递不当引起的。
解决方案
:在消息收发前,对最大挂起的消息总的数量和容量进行检验和控制。
严重程度
本文主要参考
************* 说明 *************
Fox只是对自己关心的几个错误和API参照MSDN进行分析,不提供额外帮助。
posted @
Fox 阅读(3460) |
| 本文同步自
周伟明老师应该是多核计算领域的老人了。
这几日因为想找找无锁(lock-free)方面的信息,就打开了
。看到
这篇文章时,觉得老师强调多核计算效率是有必要的,但拿Amdahl 定律和Gustafson定律作对比有点不恰当。
按照我的理解,这两个定律所刻画的内容是完全一致的,只是对加速比的定义不一样罢了。这里,我们都以S(n)表示n核系统对具体程序的加速比,K表示串行部分计算时间比例。
Amdahl 定律的加速比:S(n) = 使用1个处理器的串行计算时间 / 使用n个处理器的并行计算时间
S(n) = 1/(K+(1-K)/n) = n/(1+(n-1)K)
Gustafson定律的加速比:S(n) = 使用n个处理器的并行计算量 / 使用1个处理器的串行计算量
S(n) = K+(1-K)n
通俗的讲,Amdahl 定律将工作量看作1,有n核也只能分担1-K的工作量;而Gustafson定律则将单核工作量看作1,有n核,就可以增加n(1-K)的工作量。
这两个计算公式都没有将锁开销考虑在内,是理想化的。周老师提到设计不当造成并行变串行的问题与这两个公式计算无关。因为任何多核计算都存在对串行和并行的设计考量,这正是程序员在使用多核并行时最关心的事情。
总之,二者的区别只在于态度的不同:一个消极悲观,一个积极乐观,充其量是一个冷笑话,而于多核计算没有任何关联。
我说这些也与多核计算没有关联,丝毫没有质疑多核效率的意思。相反,我期待能够通过技术层面提高多核的有效负载。
最后一句题外话,周老师使用Word的水平一般:所有来自Word的截图都是在页面视图直接截,换行符和光标随处可见。
posted @
Fox 阅读(1886) |
| 本文同步自
o *__ 序 __* o
在阅读ACE代码和C++NPv1, v2, APG的时候,我意识到一个问题:虽然稍有C++和网络基础的同学都可以读懂ACE,但如果你对OS(五大管理模块都包含在内)、TCP/IP、C++、Design Patter 了解越多,你就越能体会ACE为什么需要这么庞杂,虽然它不够完美(但至少我还没有资格来批评这一点,我现在最常想做的一个动作就是五体投地)。
而且我隐约感觉到,我现在所写的很多东西在以后(对于有些人或许就是现在)看来会相当不深刻、相当不严谨,但对于一段学习历程,这个过程是必然的、必需的。
在C++NPv1中,
把原始socket及其API的缺陷有些妖魔化了,比如一段加上注释、空行在内的35行的代码,被指出有10处错误之多。这就像很多其他语言的倡导者或反传统C/C++指针者在批评指针时的说法一样。长期使用原始socket和指针的同学对此感觉很不舒服,何况socket API提供了大量错误检测的接口,至多是不够友好罢了。你好就好了,没必要抓住别人一顿痛批吧,『本是同根生,相煎何太急』。
虽然Solaris、Linux的很多版本及Windows对起源于Berkeley的socket API进行了重写,但不可否认,由于历史原因和POSIX标准的存在,对于使用者而言,我们可以无视这些API的实现差异。只是一旦我们从socket通信扩展到其他IPC通信的话,就需要正视各种I/O细节的差异了。
由于UNIX中,对于socket, file, pipe, device的大多数操作,描述符都是通用的(这一点,OS上面讲的更清楚些)。而Windows中,句柄大多不能互换(socket对于MS来说是舶来品)。系统和标准的不一致导致地址、协议和API的混杂甚至混乱。
UNIX下的描述符和Windows的句柄可以看作是同一个概念,只是应用环境不一样,所描述的内容也时常不一样,再简单了说,它们都是一个整型的ID。
ACE的源码中使用了大量预处理指令,尤其在跨平台/编译环境的部分更加明显。鉴于C/C++标准的博大胸怀,有些指令需要阅读相关编译器提供的帮助文档:
o #pragma:
o #define (#, #@, ##) :
其中有若干代码文件以.inl为后缀,里面是对部分函数的内联实现,以使代码结构看上去更加简洁。如果确定使用内联函数的话,*.inl将被包含于*.h的最后,如果不使用,则像*.h一样,包含于*.c 的头部。
ACE采用doxygen输出文档,在阅读代码注释时能够感受到差异,但基本不会影响阅读。
o * __ 关于第3章(C++NPv1)__ * o
ACE抽象的地址类ACE_Addr拥有ACE_DEV_Addr, ACE_FILE_Addr, ACE_INET_Addr, ACE_SPIPE_Addr, ACE_UNIX_Addr五个子类。对于狭义上的网络通信(TCP/IP)而言,ACE_INET_Addr对应于我们熟悉的sockaddr_in。
ACE_IPC_SAP是IPC(interproce communication)I/O操作类的root类。
从编码的角度看,这个类漂亮的地方在于示例了抽象类的另一种实现方式。
一提到抽象类,大多数人的第一反应是pure virtual function。当一个基类确定需要使用virtual function时,这是一个不错的选择。但我们都知道虚拟函数有开销。而且对于一个结构简单的抽象基类和其继承子类(尤其是大量使用时),一个虚函数表带来的开销会让整个设计显得十分蹩脚。
我们都知道如何强制让一个类无法使用default co tructor(protected)。如果对基类使用该方法,仅使子类具有public的default co tructor,这就达到了定义抽象基类的效果。
virtual destructor的意义在于防止delete父类指针(指向子类对象)时未调用子类destructor。在此例中,为避免这种情况,同样将destructor声明为protected即可。
从设计实现的角度看,相较于socket API,ACE_IPC_SAP的子类ACE_SOCK提供了编译时对句柄合法性的检测。
从逻辑功能层面划分,socket有三种角色:
o active co ection role (co ector):主动连接
o pa ive co ection role (acceptor):被动连接
o communication role (stream):数据通信
但socket API毕竟不是OOD出来的,对于一个socket描述符,也完全没有必要去限制其担负的功能,更不可能搞成三种不同的socket。而OOD的ACE则可以轻易实现对socket对象及其操作的封装。
工厂类ACE_SOCK_Co ector是一个主动创建通信端的工厂类。socket API中的co ect接口只是为一个socket建立与其它peer的网络连接,而不产生新的socket实例,也不依赖于任何其它socket。同样,ACE_SOCK_Co ector只是为一个ACE_SOCK_Stream对象(对用于数据通信的socket的封装)连接到ACE_Addr(对struct sockaddr的封装)提供接口,也不含对ACE_SOCK_Stream对象的其它操作。
工厂类ACE_SOCK_Acceptor是一个被动创建通信端的工厂类。当***到新的网络连接后,为该连接初始化一个ACE_SOCK_Stream对象。和co ector不同的是,acceptor依赖于一个已经存在的充当***功能的socket句柄(ACE_SOCK),因此,ACE_SOCK_Acceptor是ACE_SOCK的一个子类。
ACE_SOCK_Stream是只负有通信传输功能的socket,对应co ection-oriented的TCP通信格式stream,和UDP的CE_SOCK_CODgram相呼应。ACE_SOCK_Stream只是socket的通信载体,在两个工厂ACE_SOCK_Co ector和ACE_SOCK_Acceptor中初始化。这样一个类除支持最基本的数据发送(send)和接收(recv)和阻塞(blocking)、非阻塞(no locking)及定时(timed)的I/O模式外,还支持分散读取(scatter-read)和集中写入(gather-write)。
对于一个简单的『网络课程作业:写一个有连接的IM小程序』,上面这些内容已经足够了。当然即使使用对应的几个socket API也已经足够了。但我们显然更加关心如此庞大的一个库,是如何解决复杂的网络应用的,我尤其关心的是多线程并发如何更好的处理。
所以,我准备跑到第8、9章了。
posted @
Fox 阅读(2286) |
| 本文同步自
我发现我最近成了Cygwin下的小白鼠,写完
。现在又写
之前提到在Cygwin下读代码的不习惯,后来回到VS下看。没过几天,觉得VS下还是不够直观,于是就直接看
了… #8230;
doxygen好是好,用起来还是要慢慢习惯才行,需要在写注释和代码的时候注意一些,掌握的细节和技巧越多,出来的文档越丰富(当然,这和代码质量是两码事)。
我自然是把doxygen***在Cygwin下了,由于doxygen没有提供info,Info doxygen时就自动打开了doxygen的man,和man doxygen、doxygen --help一个效果。
如果希望阅读更详尽的使用方法,只有自己
在Cygwin下,doxygen采用
进行文字编码的转换,以
作为默认编码。
使用doxygen生成config-file模板后,可以在config-file中进行一些项目设置(有注释的,看的懂)。
为了支持中文,我DOXYFILE_ENCODING用的是
,但输出文档的语言OUTPUT_LANGUAGE却选了English。两点原因:
o EUC-CN(各种汉字编码知识就不在此普及了,你可以认为简体字编码都是EUC-CN)和UTF-8不同,但OUTPUT_LANGUAGE的各种语言都是使用的UTF-8,
所以两种编码不可能同时显示,当然,你可以把EUC-CN全转成UTF-8。编码不是高级的技术,但对于非英语用户绝对是一个噩梦
后来发现是我自己学艺不精,DOXYFILE_ENCODING只是配置文件的编码格式而已,而识别中文文档只需要修改INPUT_ENCODING成EUC-CN即可,OUTPUT_LANGUAGE自然设置成Chinese也不会有问题,因为doxygen采用UTF-8输出,使用中文输出不会有乱码问题
o 虽然我的英文很蹩脚,虽然我的文档中多有中文注释。但像doxygen中文输出的文档中把cla 、public都给你翻译成中文,你也受不了,这也英文水平无关。
config-file中的其他内容我现在也用不到,就没有仔细看。
会在公司里讲一下doxygen,doxygen的manual也讲的很详细,我就省点时间,不翻译文档了。
简单的一个
在这里。
posted @
Fox 阅读(1630) |
| 本文同步自
我屈服了,还是VS用的方便。
,因为阅读代码太不方便(对于一个WinEr来说),上午在VS下面花了几分钟就把ACE配好了,而且使用$(ACE_ROOT)\examples\C++NPv1的代码跟踪调试,太习惯了。
按照$(ACE_ROOT)\ACE-INSTALL.html的***说明:
o 选择并打开$(ACE_ROOT)\ace\ace_vc9.sln
o 添加config.h并加入以下内容: #define ACE_HAS_STANDARD_CPP_LIBRARY 1 #include "ace/config-win32.h"
-----------------------------------------------
OK,现在$(ACE_ROOT)\lib下面已经生成了ACEd.dll、ACEd.lib,再设置一下系统环境变量(运行程序必需)和VC++目录(调试程序必需)。可以使用了:
o 选择并打开$(ACE_ROOT)\examples\C++NPv1
for (; ; ) { F12, F9, F5, F10, F11 }
-----------------------------------------------
半个小时就搞定了当时一个星期的折腾……
结论:对于一个不忠实的Win Coder,在MinGW, Cygwin, UNIX…下面装B是要付出代价的。
当然,家里的机器就让它还一直跑Cygwin吧。
posted @
Fox 阅读(1659) |
| 本文同步自
/*--------- Hello.cc ---------*/
/** Hello.cc:
* @File: Hello.cc
* @Author: Fox yulefox at gmail dot com
* @Date: Aug. 19th, 2009
* @Brief: Test ACE log module a lication
#define ACE_***ACE 0 /// trace the calling position
#include "ace/Log_Msg.h" /// include log module
int ACE_TMAIN(int, ACE_TCHAR *[])
{ ACE_TRACE(ACE_TEXT("main")); ACE_DEBUG((LM_INFO, ACE_TEXT("%IStart\n"))); ACE_DEBUG((LM_INFO, ACE_TEXT("%IEnd\n"))); return 0;
/*--------- makefile ---------*/
BIN = hello # src &am exe file name
SRC = $(addsuffix .cc, $(BIN)) # src file suffix
LIBS = -lACE # libACE.dll under cygwin
include $(ACE_ROOT)/include/makeinclude/wra er_macros.GNU
include $(ACE_ROOT)/include/makeinclude/macros.GNU
include $(ACE_ROOT)/include/makeinclude/rules.common.GNU
include $(ACE_ROOT)/include/makeinclude/rules.nonested.GNU
include $(ACE_ROOT)/include/makeinclude/rules.bin.GNU
include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
/*--------- Compilation ---------*/
GNUmakefile: /home/fox/ace/GNUmakefile MAKEFLAGS=k
g++ -Wpointer-arith -mthreads -mtune=pentiumpro -O3 -g -pipe -pipe -I/usr/\
share/ace -DACE_HAS_EXCEPTIONS -DACE_NO_INLINE -c -o .obj/hello.o hello.cc
g++ -Wpointer-arith -mthreads -mtune=pentiumpro -O3 -g -pipe -pipe -I/usr/\
share/ace -DACE_HAS_EXCEPTIONS -DACE_NO_INLINE -Wl,--enable-auto-import -Wl,-E\
-L/usr/share/ace/lib -o hello .obj/hello.o -lACE
Compilation finished at Wed Aug 19 00:35:42
/*--------- Result ---------*/
$ ./hello.exe
(14417928) calling main in file `hello.cc' on line 13 Start End
(14417928) leaving main
-------------------------------------------------------
更多内容请参考
忙活了一晚上,终于知道怎么包含头文件了,在gcc的编译选项中用 -I或/I$(ACE_ROOT):
本例中是:-I/usr/share/ace
结果后面库又链接不上,联想以前使用OpenGL库的LIBS,终于靠一个-lACE搞定。
因为不愿意用MPC,总感觉再多花些时间去弄又只是离题更远了,有兴趣的同学自然是可以通过ACE的官网找到所有问题的***。
这样一来,
到使用也就告一段落了,后面的问题就比较easy了,无非是你用ACE做什么。而我也不会再就ACE &am am cygwin写什么心得了,总算见证了这两天的捣腾。
posted @
Fox 阅读(1605) |
| Powered by:
Copyright Fox2AA游戏组:将用C++语言完成街头篮球简易单机版
进入贴吧
贴子搜索 |
浏览贴子
吧主: 共有
2AA游戏组:将用C++语言完成街头篮球简易单机版
本次制作内容大多数基于“街头篮球”网络游戏。
使用C++中的图形界面,多以文字表达。
1、“街头篮球”中最重要的东西——能力值将一定在程序中保留。但是相比较而言,能力值的作用只会发挥于1~2个方面。例如“跑动”能力会影响到无球、有球跑动。
2、职业系统依旧存在!且仍然包括转职系统,和“街头篮球”一样是15级转职。同“街头篮球”不同的是,中锋也会有转职!目前计划分为内线强打型中锋和外线投射型中锋。内线强打型中锋相比“街头篮球”的中锋投射能力会降低,内线能力则会进一步升高。外线透射型中锋在转职时会有3分球+5,中距离投篮+15,跑动+5,篮板-5,近距离投篮-10,上篮/扣篮-10,身体对抗-5的变化!
3、升级经验与“街头篮球”完全一致!还怕升级不够快吗?游戏推出之后即将会推出“2~100倍经验”打一场球,直升10级!
4、道具系统依旧!但是相对“街头篮球”,由于没有图片所以只限于增加能力值,加不同能力值的道具会持续更新。
5、技能系统依旧!一些投篮、过人的Freestyle会根据技能情况适当增加进球率、过人率。
6、“街头篮球”单人系统完全保留!新手训练、进阶训练、热身赛、剧情模式……样样俱全!
7、比赛时,键入按键与“街头篮球”完全一样!不必再重新适应另一套按键,直接上路!
8、点券如何获得?每场比赛之后随机获得!每场10~200,完全不必顾虑!
9、完美存档系统!单独存档,支持多存档。相当于创建多个帐号!
10、1v1?2v2?3v3?都有!甚至还包括了“街头篮球”没有的5v5模式!全新的模式,全新的比赛!
11、对手强弱?职业随你挑!难度随你挑!人性化、职业化,让玩家开心!
祝:所有玩家游戏快乐!
如有意见可回帖。
2009-12-14 20:39
彷徨小爷
支持PSP不
2009-12-14 20:40
希望手感不要太差了
2009-12-14 20:41
您好!由于是exe格式,故仅限于电脑,请原谅给您带来的不便!
2009-12-14 20:41
2009-12-14 20:41
内拉祖里
2009-12-14 20:42
彷徨小爷
收费问题呢…………
2009-12-14 20:42
预定将于新年前后开发出!敬请期待~
2009-12-14 20:42
我们向玩家承诺:绝不收费!
2009-12-14 20:43
彷徨小爷
哦 不收费啊 真好 可惜我家没电脑
2009-12-14 20:46
2009-12-14 21:00
60.14.210.*
2009-12-28 18:13
请问2AA是什么
2009-12-28 18:15
那么好。。?
坐等~~~
2009-12-28 18:16
真的吗,挺期待的、
2009-12-28 18:24
2009-12-28 18:25
无游戏 无真相....
地址下载~
2009-12-28 18:37
59.173.185.*
怎么还不出啊!
2010-2-18 20:27
无图无真相
2010-2-18 20:28
毅丝不挂
2010-2-18 20:48
59.51.121.*
说好的2aa呢
2010-2-18 21:13
211.138.147.*
单机怎么玩。大概类似打NPC?还是搞个局域网比较好吧?
2010-2-18 21:14
对机器配置有要求么
会不会还是那么卡 、、?
2010-2-18 21:16
别傻 了你看他第一个 就知道他根本不可能的 跑动?
还有这款单机游戏用C++?
即使真的出了 游戏年龄在3年以上的这样的单机街头篮球如果里面不设置BOSS 是根本不可能有乐趣的 不相信自己玩玩街头篮球里面的单人模式。。
还有 真想弄这个还不如帮TL 摆平DX.10的问题 这是最主要的 当然附带 显卡驱动的问题
2010-2-18 21:20
我为什么说看他第一个就知道不可能 很简单不是他能不能的问题是他根本呢 没有深入了解街头的属性问题 持球无球一个速度要PG 干什么 ?
2010-2-18 21:21
当然了 我在发上面的回帖还没有看到他第二个 刚看了一下 如果真的出现那样的C 篮板少5点有合用? PF跟C篮板差那麽多不也照样?现在街头篮球中身体对抗问题一直很搞笑我估计如果按照现在的街头来算 减 40点无所谓很简单的问题 大家可以去新手区开 游戏帮助就是那个等级在1-15 才可以开的东西 来盖冒你就会发现 应该能盖到的却来了这样的一句话 “你的时机把握的很好 可惜缺少点运气” 大约是这样的吧
街头篮球还有运气? 。。 (我估计网络的原因是网速问题 当然了如果真有单机是不会有网络问题的 但是在多出20+身体对抗的情况下依然会被上篮的人压住。身体对抗?大家是否注意到PF压球 压不动C 但是C却可以压任何职业听起来很白痴但是 想过没有 如果这个PF比C的身体对抗高出20+ 还是压不动C呢 ? 是不是只是个职业问题而已? 当然了身体对抗不是没用 虽然很无用但是在这游戏用 还是很大很大的) 以上到第二条 属性问题就根本不可能解决 (个人认为)
2010-2-18 21:29
1-4我就不想在继续挑刺了因为他就是刺猬 现在来说5 进球率 我相信..过人率? 我估计楼主写了半天只是过年娱乐大家一下罢了
街头篮球里任何职业都可以百分是100过人当然了 这100是防守你的人位置问题 还有技能 跟你的能力值 问题 也就是
防守人位置+技能+能力=过人
很明显写的太差劲了
2010-2-18 21:34
能买衣服吗
2010-2-18 21:34
5以下的那些废话我就不想说了 很简单的一个道理 山口山 单机(个人推举大芒果版本的WOW单机 其他的我也没玩过..) 证明一切
还有别冒着杀头的危险来娱乐大家 谢谢
2010-2-18 21:36
KLZ毕业
2010-2-18 21:37
分享次数:
分享到:
发表回复
内 容:
用户名:
您目前是匿名发表
验证码:
请点击后输入验证码,达到
后本吧发贴免验证码。 Ctrl+Enter快捷发表 2011 Baidu以获取为您订制的推荐.
新客户?
. | | | | 搜索
全部分类
手机/通讯
小家电
美容化妆
运动户外休闲
珠宝首饰
个护健康
游戏/娱乐
服饰箱包
摄影/摄像
数码影音
电视/音响
电脑/IT/办公
教育音像
汽车用品
家居装修
办公用品
母婴用品
大家电 目前无货,
欢迎选购其他类似产品。 CD-R Visual C++游戏设计(附书)
[平装]
(作者) (
2条评论
目前无货,
欢迎选购其他类似产品。
购书满99元,免费得畅销书(促销优惠码:WK8OA3BC)
中国最大的网上书店,天天低价,免费送货:图书满99元就免费得畅销书一本,少儿图书、进口原版图书不参加此活动。
&rsaquo 购买此商品的顾客也同时购买 第
页, 共
- 沈大林 (
¥ 24.00
- 樊永庆 (
¥ 32.70
- 房晓溪 (
¥ 25.50
- 王晓东 (
¥ 21.30
- Frank D.luna (
¥ 33.70
- 房晓溪
¥ 29.70
基本信息
出版社:
北京科海电子出版社; 第2版 (2003年6月1日)
丛书名: 计算机游戏设计与开发系列丛书
平装:
开本:
7900107916
条形码:
9787900107916
商品尺寸:
23.2 x 18.4 x 2.8 cm
商品重量:
品牌:
科海培中
B00119DOWU
用户评分: (
2条评论
Amazon.cn销售排行榜:
图书商品里排第396,207名 (查看
商品热销中:
第77位 -
商品描述
内容简介
本书用浅显生动的语言、经典的案例带领您进入游戏设计的美妙世界,帮助您实现开发游戏的梦想。
书中参照开发大型游戏《仙剑奇侠传》所需要的技术,如:镂空动画、半透明动画、碰撞检测、斜角卷动的地图、人工智能、3D动画、3D音效等,对游戏的设计和开发过程进行了系统而又详细的介绍。使您能清楚地了解游戏设计过程中的各种知识,包括Visual C++的基本操作、游戏画面的坐标系统、规划游戏的主要架构,以及使用DirectX来设计3D游戏等。
本书理论与实例并重,讲述了多种游戏设计的思想和技巧,适合作为游戏程序设计爱好者和新鲜人士阅读,也可供多媒体开发人员参考使用。
编辑推荐
本书用浅显生动的语言、经典的案例带领您进入游戏设计的美妙世界,帮助您实现开发游戏的梦想。
书中参照开发大型游戏《仙剑奇侠传》所需要的技术,如:镂空动画、半透明动画、碰撞检测、斜角卷动的地图、人工智能、3D动画、3D音效等,对游戏的设计和开发过程进行了系统而又详细的介绍。使您能清楚地了解游戏设计过程中的各种知识,包括Visual C++的基本操作、游戏画面的坐标系统、规划游戏的主要架构,以及使用DirectX来设计3D游戏等。
本书理论与实例并重,讲述了多种游戏设计的思想和技巧,适合作为游戏程序设计爱好者和新鲜人士阅读,也可供多媒体开发人员参考使用。
卓越亚马逊服务承诺
品质保证
我们向您承诺,我们已严格审查本网站所售商品供应商或卖家的合法经营资质,以确保通过本网站向您销售的商品均为正品行货,并可提供正规***,与您亲临地面商店选购的商品享有同样的品质保证。
浏览此商品的顾客最终购买 - Frank D.luna 平装 (
¥ 33.70
的顾客看完这一页后购买了此商品
CD-R Visual C++游戏设计(附书) - 荣钦科技 平装 (
) - 王浩 平装 (
¥ 48.80 - 侯俊杰 平装 (
¥ 56.10
商品评论
2条评论
5 星: (1)
4 星: (1)
: (0) 用户平均打分
平均4.5 星
) 与其他用户分享您的观点:
按有用程度排序
平均4.0 星
2009年9月30日
评论者 -
购买过此商品
评论的商品:
CD-R Visual C++游戏设计(附书) (平装)
分为两部分,前部分讲基于mfc开发gdi游戏,后半部分讲directx。点到为止,没有深入,初学者可以看看
您的投票很重要 这条评论对您有用吗? | 平均5.0 星
非常喜欢
2011年4月5日
评论者 -
购买过此商品
评论的商品:
CD-R Visual C++游戏设计(附书) (平装)
实例讲解,简洁明了,好书!
您的投票很重要 这条评论对您有用吗? | 与其他用户分享您的观点: 查找其它相似商品
产品信息有问题吗?请帮我们
了解我们
合作信息
帮助和购物指南
| 亚马逊家族网站:
| 1999-2011 Joyo Amazon All Rights Reserved
音像制品经营许可证号京销0272号
京公网安备110105004167号
增值电信业务经营许可证:

参考资料

 

随机推荐