- 博客(258)
- 资源 (7)
- 收藏
- 关注
转载 网络编程:Reactor与Proactor的概念
1、标准定义两种I/O多路复用模式:Reactor和Proactor一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理
2015-12-24 01:04:19
703
原创 redis时间处理的bug
redis 3.0int aeProcessEvents(aeEventLoop *eventLoop, int flags)中以最小时间阻塞在 // 处理文件事件,阻塞时间由 tvp 决定 numevents = aeApiPoll(eventLoop, tvp);但是aeCreateTimeEvent中在添加时间事件的时候并没有做任何的处理如
2015-11-29 00:00:02
1217
转载 四叉树优化碰撞检测
游戏中碰撞检测分为两个阶段:broad phase 和 narrow phase。接下来要介绍的就是broad phase。在broad phase这个阶段,我们的主要任务是将屏幕上的物体进行筛选,筛选出最可能发生碰撞的物体集合。试想想,屏幕上有N个物体,如果我们对每两个物体都进行碰撞检测,那时间复杂度就有N^2。但实际上,在游戏画面中,并不是每两个物体都需要进行碰撞检测,比如一个在屏幕右
2015-05-26 00:32:15
15709
7
转载 GFlags 使用详解
GFlags - 老牌的PageHeap配置工具,有命令行和GUI两种操作方式,功能比较全,包含在Windbg调试器安装包内。同样在Windows 2000 Professional SP2 以上可用。一些使用GFlags命令行的例子:配置正常页堆:"C:/Program Files/Debugging Tools for Windows (x86)/gflags.
2015-03-21 19:51:04
6669
转载 骨骼蒙皮动画(Skinned Mesh)的原理解析
骨骼蒙皮动画(Skinned Mesh)的原理解析(一) 一)3D模型动画基本原理和分类 3D模型动画的基本原理是让模型中各顶点的位置随时间变化。主要种类有Morph动画,关节动画和骨骼蒙皮动画(Skinned Mesh)。从动画数据的角度来说,三者一般都采用关键帧技术,即只给出关键帧的数据,其他帧的数据使用插值得到。但由于这三种技术的不同,关键帧的数据是
2015-03-09 00:13:06
1084
转载 2D动作游戏开发与实现(翻译)
原文太长,所以将翻译与原文分成了两部分, 主要是讲2D游戏瓦片规则及不规则渲染与角色碰撞原理的。因为单纯的2D游戏开发过于简单,所以本文尝试结合不同的2D平面游戏并将之归类,列出他们的优缺点,然后讨论下一些实施的细则。长远目标是在2D平面游戏开发方面的指导做的十分全面。如果有任何建议,更正,要求或者补充,请留言!声明:有些文章的信息是通过反编译引擎的,并不是通过代码或者编程者本
2015-02-24 14:05:23
1564
转载 C++实用技巧
复杂的东西写多了,如今写点简单的好了。由于功能上的需要,Vczh Library++3.0被我搞得很离谱。为了开发维护的遍历、减少粗心犯下的错误以及增强单元测试、回归测试和测试工具,因此记录下一些开发上的小技巧,以便抛砖引玉,造福他人。欢迎高手来喷,菜鸟膜拜。 之前的文章讲了指针和内存的一些问题,今天说一下单元测试的问题。如果在团队里面没有对单元测试的框架有要求的话,其实我们可以
2015-01-14 22:17:40
862
转载 高性能服务开发之定时器
在开发高性能服务器中,定时器总是不可或缺的。 常见的定时器实现三种,分别是:排序链表,最小堆,时间轮。 之前用的定时器是基于最小堆的,在定时器数量不多时可以使用, 目前公司用的框架中的定时器是基于简单时间轮的,但是为了支持大范围的时间,每个齿轮的所维护的链表为有序链表,每次插入时先mod出spoke,再从头遍历链表以便将定时器插入到合适位置, 所以本质上还是基于有序链表的。时间复杂度并未减少。
2014-12-30 11:01:53
743
转载 Lua源码剖析-GC
这次主要来分析lua的gc。首先lua中的数据类型包括下面9种,ni, Boolean, number, string, table,user data, thread , functions 以及 lightusedata.其中 string, table,thread , function 是会被垃圾回收管理的,其他的都是值存在。因此我们来看对应的GC数据结构.
2014-12-22 01:06:05
1196
转载 探索Lua5.2内部实现:Garbage Collection(2)
原文:http://blog.youkuaiyun.com/yuanlin2008/article/details/8684869GCObjectLua使用union GCObject来表示所有的垃圾回收对象:[cpp] view plaincopyprint?182 /* 183 ** Union of all collecta
2014-12-21 19:18:16
853
转载 探索Lua5.2内部实现:Garbage Collection(1)
Lua5.2采用垃圾回收机制对所有的lua对象(GCObject)进行管理。Lua虚拟机会定期运行GC,释放掉已经不再被被引用到的lua对象。基本算法基本的垃圾回收算法被称为"mark-and-sweep"算法。算法本身其实很简单。首先,系统管理着所有已经创建了的对象。每个对象都有对其他对象的引用。root集合代表着已知的系统级别的对象引用。我们从root集合出发,就可以访
2014-12-21 18:18:24
700
转载 协程coroutine资料更新
以前有一个 http://sunxiunan.com/?p=1949 这里加上一些新看到的内容,也许有重复。http://sdiehl.github.com/coroutine-tutorial/ coroutine-tutorialhttp://www.chiark.greenend.org.uk/~sgtatham/coroutines.htmlhttp://blog.
2014-12-21 00:36:23
1108
转载 Coroutines in C
by Simon TathamIntroductionStructuring a large program is always a difficult job. One of the particular problems that often comes up is this: if you have a piece of code producing data, and anothe
2014-12-20 21:26:24
934
转载 游戏中分层状态机的实现
状态机的实现方式有很多种,一般都使用比较简单的switch case方式来实现对事件的处理和状态的转移,如下所示:[html] view plaincopyvoid ProcessEvent(Event event) { switch(state) { case StateA:
2014-10-25 01:21:51
3059
转载 Object Orientation Tutorial
Lua is not really an object-oriented language, and it doesn't have a built-in concept of classes. But it is easily possible to create your own class system using tables and metatables.Simple metat
2014-09-26 23:16:48
722
转载 windows下捕获dump
一般要捕获异常只需要两个函数:SetUnhandledExceptionFilter截获异常;MiniDumpWriteDump写dump文件。但是由于CRT函数可能会在内部调用SetUnhandledExceptionFilter(NULL),解除我们程序设置的异常处理,这导致我们的程序无法完整捕获崩溃。另外,还有一部分非异常的CRT错误,不属于SEH异常捕获的范畴,需要通过_set_inval
2014-08-10 19:48:18
871
转载 Lua 中实现面向对象
这里提供 Lua 中实现 OO 的一种方案:local _class={} function class(super) local class_type={} class_type.ctor=false class_type.super=super class_type.new=function(...) local obj={} do local cre
2014-07-31 03:17:40
838
转载 lua gc和weaktable
关键字:lua,c,gc,weaktable----------------------------------如果你对lus语言的中weak table不明白的话,那这篇文章应该对你有帮助。所有脚本语言几乎都有垃圾回收器(GC),当然lua也有。不明白GC不要紧,下面让我来解释:这一切要先从现代编程语言的鼻祖 — C语言开始。
2014-04-29 10:20:06
1439
原创 Tolua++技术文档
Tolua++技术文档1.简介Tolua++是一个编程语言文本转换工具,主要用来将C/C++文件转化成lua需要的接口形式。即把大量的函数转成static int XXX(lua_State* tolua_S)形式,以供注册到lua里面。Tolua++通过pkg文件来导出需要的类型,函数,对象。Tolua –o test.c tarray.pkgtarray.pkg里面是对应的
2014-04-28 23:33:57
13644
转载 splice系列系统调用
关注splice系列系统调用(包括splice,tee和vmsplice)已经有一段时间了,开始的时候并未能领会splice的意义所在,致使得出了“splice系列系统调用不怎么实用”的错误结论。随着内核研究的深入,才逐渐懂得:splice对于其中一个文件描述符必须是管道的要求并不是阻碍其应用的障碍,并且恰恰相反,它正是splice的本质所在。splice主要通过去除在内核空间和用户空间之
2014-04-06 21:38:48
2374
原创 引用技术接口的几个问题?
有个网络通信类,主要执行是在另外一个线程。但是在线程执行的时候,对象很可能已经析构了。所以接口设计为class PostCallBack:public base::RefCountedThreadSafe{public:virtual void ProcessData(string data,string flag)=0;virtual BrowserThread::I
2014-03-25 09:39:02
790
转载 Epoll在LT和ET模式下的读写方式
在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK)从字面上看, 意思是:EAGAIN: 再试一次,EWOULDBLOCK: 如果这是一个阻塞socket, 操作将被block,perror输出: Resource temporarily unavailable总结:这个错误表示资源暂
2014-03-24 17:33:10
752
转载 浅谈 non-blocking I/O Multiplexing + poll/epoll 的正确使用
在前面的文章中曾经粗略讲过poll,那时是用阻塞IO实现,在发送和接收数据量都较小情况下和网络状况良好的情况下是基本没有问题的,read 不会只接收部分数据,write 也不会一直阻塞。但实际上poll IO复用经常是跟非阻塞IO一起使用的,想想如果现在内核接收缓冲区一点数据没有,read 阻塞了,或者内核发送缓冲区不够空间存放数据,write 阻塞了,那整个事件循环就会延迟响应,比如现在又有
2014-03-19 15:36:12
924
原创 收藏的好文章
1.并发锁方面http://www.cl.cam.ac.uk/research/srg/netos/papers/2007-cpwl.pdfhttp://www.drdobbs.com/parallel/choose-concurrency-friendly-data-structu/208801371?pgno=1http://www.drdobbs.com/parallel
2014-03-13 10:27:08
711
转载 syn flood 原理及防护
一、为什么Syn Flood会造成危害这要从操作系统的TCP/IP协议栈的实现说起。当开放了一个TCP端口后,该端口就处于Listening状态,不停地监视发到该端口的Syn报文,一旦接收到Client发来的Syn报文,就需要为该请求分配一个TCB(Transmission Control Block),通常一个TCB至少需要280个字节,在某些操作系统中TCB甚至需要1300个字节,并返回一
2014-02-23 21:09:33
1573
转载 为什么TCP连接需要三次握手分开需要四次握手?
TCP的三次握手和四次断开TCP是一个面向连接的服务,面向连接的服务是电话系统服务模式的抽象,每一次完整的数据传输都必须经过建立连接,数据传输和终止连接3个过程,TCP建立连接的过程称为三次握手,下面看一下三次握手的具本过程TCP三次握手过程1 主机A通过向主机B 发送一个含有同步序列号的标志位的数据段给主机B ,向主机B 请求建立连接,通过这个数据段,主机A告诉主机B 两件事
2014-02-23 16:54:21
22532
1
转载 一个写优先的读写锁实现
/* g++ -Wall -o rwlock rwlock.cpp -lpthread** 一个写优先读写锁的实现,多线程频繁读,多线程少量写,同时写优先,性能极佳。* 当写锁(独占锁)lock成功的必要条件是:* 1. 将写锁计数++;* 2. 会阻塞后续对读锁(共享锁)的读;* 3. 等待读锁的计数为0;* 4. 等待写锁的计数为1;**/#includ
2014-02-23 16:28:55
1458
转载 Linux下的I/O
Linux的I/O机制经历了一下几个阶段的演进:(1)同步阻塞I/O: 用户进程进行I/O操作,一直阻塞到I/O操作完成为止。(2)同步非阻塞I/O: 用户程序可以通过设置文件描述符的属性O_NONBLOCK,I/O操作可以立即返回,但是并不保证I/O操作成功。(3)异步阻塞I/O: 用户进程可以对I/O事件进行阻塞,但是I/O操作并不阻塞。通过select/poll/epoll等函数
2014-02-21 16:50:18
808
转载 设计模式- 主动对象(Active Object)
译者注:1. 对象分为主动对象和被动对象,主动对象内部包含一个线程,可以自动完成动作或改变状态,而一般的被动对象只能通过被其他对象调用才有所作为。在多线程程序中,经常把一个线程封装到主动对象里面。2. 在翻译过程中,发现的原文不妥处被更正。3. 原文中许多内容一再重复,颇有蛇足之感,取精用宏,删繁就简。4. 尝试更高程度的意译。关键词这个文章
2014-02-18 19:06:12
1536
1
转载 CGI的一些知识点
CGI(Common Gateway Interface)是能让web服务器和CGI脚本共同处理客户的请求的协议。它的协议定义文档是http://www.ietf.org/rfc/rfc3875。其中Web服务器负责管理连接,数据传输,网络交互等。至于CGI脚本就负责管理具体的业务逻辑。Web服务器的功能是将客户端请求(HTTP Request)转换成CGI脚本请求,然后执行脚本,
2014-02-17 18:58:11
890
原创 网络编程中的reactor与proactor
首先,他们都解决了等待多个事件发生的问题,对多个事件源进行了多路分解。效率上面:reactor在缓冲区与内核的拷贝上面比proactor多了好几次,reactor在事件发生的时候是串行执行的,而proactor支持异步操作。引用别人的一个说法:reactor完成的时候只是告诉你有可读或者可写等消息,proactor已经帮你读到你要的缓冲区里面了。reactor比
2014-02-13 20:12:00
1034
转载 使用异步过程调用(APC)实现模块注入
摘自:windows编程循序渐进 异步过程调用是一种能在特定线程环境中异步执行的系统机制。往线程APC队列添加APC,系统会产生一个软中断。在线程下一次被调度的时候,就会执行APC函数,APC有两种形式,由系统产生的APC称为内核模式APC,由应用程序产生的APC被称为用户模式APC。 每个线程都拥有自己的APC队列。应用程序可以使用函数把APC添加到指
2014-02-13 19:40:07
810
转载 Decorators详解
Python中的Decorators表面看起来很像C#的Attribute,其实不然,Python的Decorators和C#的Attribute完全是两个东西。Python的Decorators让我想到了设计模式中的装饰者模式(Decorator Pattern)。Decorator PatternAttach additional responsibilities to a
2014-01-30 12:43:30
1511
转载 Python *与** 参数问题
问题: Python的函数定义中有两种特殊的情况,即出现*,**的形式。 如:def myfun1(username, *keys)或def myfun2(username, **keys)等。解释: * 用来传递任意个无名字参数,这些参数会一个Tuple的形式访问。 **用来处理传递任意个有名字的参数,这些参数用dict来访问。*应用:
2014-01-29 12:45:08
1341
转载 Python yield 使用浅析
初学 Python 的开发者经常会发现很多 Python 函数中用到了 yield 关键字,然而,带有 yield 的函数执行流程却和普通函数不一样,yield 到底用来做什么,为什么要设计 yield ?本文将由浅入深地讲解 yield 的概念和用法,帮助读者体会 Python 里 yield 简单而强大的功能。5 评论:廖 雪峰, 软件工程师, HP2012
2014-01-29 12:33:25
702
转载 外观模式
动机(Motivate): 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?意图(Intent): 为子系统中的一组接口提供一个一致的界面, Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
2014-01-24 14:04:48
831
转载 黑板模式
黑板架构模式简介编辑黑板模式是一种常用的架构模式,应用中的多种不同数据处理逻辑相互影响和协同来完成数据分析处理。就好像多位不同的专家在同一黑板上交流思想,每个专家都可以获得别的专家写在黑板上的信息,同时也可以用自己的分析去更新黑板上的信息,从而影响其它专家。2黑板模式的应用场景编辑黑板模式的应用场景是要解决的任务可以分为多个子任务。解决方案如下图所示:3黑板模式的优
2014-01-17 10:25:32
1642
转载 数字证书原理
文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用。接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的管理,最后演示使用makecert生成数字证书。如果发现文中有错误的地方,或者有什么地方说得不够清楚,欢迎指出! 1、基础知识 这部分内容主要解释一些概念和术语,最好是先理
2013-12-25 10:50:38
740
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人