摘要: (begin (load "ex1.scm") ;(define (make-rat n d) (cons n d)) (define (numer x) (car x)) (define (denom x) (cdr x)) (define (print-rat x) (display (numer x)) (display "/") (display (denom x)) (newline)) ;ex 2.1 (define (positive? x) (> x 0)) (define ... 阅读全文
posted @ 2013-05-22 22:08 sniperHW 阅读(368) 评论(0) 推荐(0)
摘要: (begin (load "util.scm") ;ex 1.16 计算b的幂 (define (_expt product b n maxn) (if (= n maxn) product (if (<= (* n n) maxn) (_expt (* product product) b (+ n n) maxn) (_expt (* product b) b (+ n 1) maxn)))) (define (fast-expt b n) (if (<= n 0) 1 (_expt... 阅读全文
posted @ 2013-05-22 22:07 sniperHW 阅读(352) 评论(0) 推荐(0)
摘要: 大型网络游戏服务器的逻辑大多采用单线程设计,典型的就是一个线程处理一个区域(地图),跨区域通过跳转实现,这样,不同区域的对象在逻辑上是不发生交互的。这样在一台服务器上开启N个线程就可以处理N个区域。但一个线程处理一个区域毕竟有其瓶颈,如果一个区域内挤进了过多的玩家就会导致为那个区域服务的线程不负重和,表现就是那个区域中的玩家发现操作响应变得不及时.最近一段时间在思考如何能并行的利用多进程多机器为同一片区域服务,这样可以通过多开几个进程提升单区域的承载量。一种方式是类似bigworld全分布式设计,同一区域中的对象可以分布在N个进程/机器中。以一个玩家为例,在一个进程中其是主动对象,所有对这个玩 阅读全文
posted @ 2013-01-07 22:28 sniperHW 阅读(3316) 评论(2) 推荐(0)
摘要: 首先本文并不打算详细的介绍A*算法,要想大致的了解A*算法可参看下面两篇文章:http://wenku.baidu.com/view/d39faba1284ac850ad02425d.htmlhttp://wenku.baidu.com/view/eaa14f11f18583d049645992.html其次,不用太纠结算法的效率,例如remove_min_pnode函数使用线性探索寻找最小值,实际上可以使用二叉堆或别的方法提高执行效率.本文的目的是提供一个较通用的A*框架,用于解决游戏中的寻路问题.首先看下结构的定义://一个地图块节点struct map_node{};//路径节点stru 阅读全文
posted @ 2012-12-21 15:43 sniperHW 阅读(8236) 评论(2) 推荐(1)
摘要: 网游服务器的逻辑一般来说比较复杂,而且在很多情况下还使用了多线程,因此使用基于引用计数的智能指针能很大程度的减少内存泄漏和对象失效等问提.但是基于引用计数的指针在很多情况下也会产生另一种情况的泄漏,例如:网游中有一个代表角色的类型character,角色的对象在网游中可以说是最常见的对象之一了,与几乎所有的游戏逻辑都有关系,因此,一个角色对象可能会存在于很多容器,或被其它的对象所持有,为了保证角色对象的有效性,常常会使用基于引用计数的智能指针来存放角色对象。问题由此产生了,例如当一个角色离开地图,我们就需要把所有指向这个角色的智能指针清0,稍有不甚,漏掉一个都会导致资源无法释放,而且要找到具体 阅读全文
posted @ 2012-12-07 23:27 sniperHW 阅读(2329) 评论(6) 推荐(1)
摘要: 前面的文章介绍了一个基于微线程的调度器框架,并测试了使用微线程实现远程调用的效率。本文将微线程和网络事件框架结合起来,在微线程中处理所有的事件(网络消息,用户定时器事件),这样,在事件回调函数中可以放心的发起远程调用而不用担心阻塞整个线程,只要还有未被阻塞的微线程,就可以切换到那个微线程上去执行,继续等待在事件队列上处理新到的事件.typedef struct coronet{ netservice_t nets; msg_loop_t msgl; sche_t coro_sche; uint32_t last_check... 阅读全文
posted @ 2012-12-04 17:34 sniperHW 阅读(3562) 评论(4) 推荐(2)
摘要: 续第一篇,前两天对核心存储做了些修改,以前只打算与关系数据库的行与表做对应,value类型只能使array或list,现在把7种基本类型也加入到value支持的类型中,以使得数据库更通用.当然,这都不是本文的核心,本篇主要介绍一个测试前端,以及测试的远程调用协议.先贴出测试前端的服务器代码:#include "netservice.h"#include "msg_loop.h"#include "datasocket.h"#include "SysTime.h"#include "db_protocal. 阅读全文
posted @ 2012-11-08 10:08 sniperHW 阅读(3431) 评论(9) 推荐(4)
摘要: 前面有几篇文章介绍过一个基于linux epoll的网络接口,但并未将接口组合成一个方便使用的网络框架。下面先简单介绍下以前发布过的网络接口:首先是基本接口:KendyNet.h KendyNet.c https://github.com/sniperHW/kendylib/blob/master/include/KendyNet.h此接口提供了最简单的单线程网络收发模型,并未提供封包解包等功能,使用者可在此之上根据自己的需求封装出合适的网络框架第二组接口在第一组接口上提供了封包和解包:Connection.h Connectionchttps://github.com/sniperHW/ke 阅读全文
posted @ 2012-11-01 14:09 sniperHW 阅读(6776) 评论(14) 推荐(5)
摘要: 为了在各线程之间高效的传递消息,必须设计一种高效率的消息队列,传统的做法是mutex加queue,这种做法在每次执行push和pop时都要加锁,效率相对较低。其次还有使用循环队列,可以做到完全无锁,但只能实现1:1的消息传递。还有一些lock-free队列的实现,但基于其实现的相对复杂性,我不打算使... 阅读全文
posted @ 2012-10-18 16:22 sniperHW 阅读(6758) 评论(13) 推荐(5)
摘要: AOI服务作为网络游戏中的中的一个重要组件,用于为地图中的对象根据当前坐标更新关注列表.对于玩家而言,在A关注列表中的对象,其状态发生改变时,需要通知A,这样A才能看到在视野内其它对象的移动,战斗等。对于NPC而且,关注列表中的对象表示在自己一定范围内的对象,可作为AI选择的攻击目标。典型的AOI算法包括格子,十字链表等,关于十字链表法可参考:http://www.codedump.info/?p=388本文介绍一种基于格子的算法.本算法实现的目标是支持可变长视距,根据视距半径,计算出一个包围这个视野圆的最小正方形,然后计算出这个正方形包含在哪些格子中,这些格子中的对象都有可能是可见对象.首先 阅读全文
posted @ 2012-09-29 08:28 sniperHW 阅读(6319) 评论(5) 推荐(1)