- 博客(59)
- 资源 (4)
- 收藏
- 关注
原创 实现了一个AOI模块
在场景服务中,如果有一个人A的行为想要被其他人看得到,就必须将A的数据包进行转发给其他人。最KISS的办法,就是直接把A的数据包直接在场景服务内组播。但是在一个场景服务中可能有成百上千个人,如果直接在服务进程内进行广播,数据流量会大到一个很夸张的地步,至少以目前的网速来讲是不现实的。因此,往往场景服务都为人物设计一个视野半径,即只将数据包转发给在我视野内的人,这样可以极大的降低数据的转发流量。而A
2017-07-23 11:46:26
2187
原创 一个高可伸缩的游戏服务器架构
一个高可伸缩的游戏服务器架构原文连接:http://blog.gotocoding.com/archives/827设计完socket通讯协议后,就面临着服务器架构设计了。我希望他是一个去中心化且具有高可伸缩性的集群架构。水平扩展是高可伸缩的首要条件,因此,在设计之初就必须考虑好水平扩展考方案。事实上这一部分几乎花了我1整个月的时间来设计,在此期间我重写了3版才总算确定下来我认为可用的方案。第一版设
2017-07-07 14:05:33
2155
原创 关于网络协议封装的一些新想法
最近业余时间在写一个小游戏。在为客户端封装socket层时头脑一热,有了一些新的想法, 在这里记录一下。客户端使用的是Unity3d引擎。而在Unity3d中,基础的socket库只提供两种模式,一种是阻塞模式,一种是异步callback模式。一般都需要基于这两种模式下进一步封装,才可以更方便的使用。咨询了几个做客户端的并搜了一下,发现大家的惯用手法都是开一个线程去使用socket阻塞去读,然后把
2017-05-28 18:17:10
1853
原创 给silly增加热更新
最新抽了点时间给Silly增加了了一个silly.patch模块,用于对热更新提供一些有限的支持。热更新最麻烦之处莫过于“数据迁移”, 即怎么使新函数(要更新的函数)以“运行时数据”的状态运行。其实http这类无状态协议是最为简单的,因为他们不需要“数据迁移”的过程。http的这种架构,使得所有的函数都是无副作用的,所有的数据在请求结束给出Response的
2017-04-18 13:18:55
530
原创 使用缓存优化数据请求
继上一篇场景之后,事情还没有完。我有一堆struct obj对象(数量级可能为千级), 客户端需要频繁拉取这些信息中的一部分去显示(比如,当切换标签页时)。由于这一操作可能会很频繁,而struct obj对象并不算小,如果每一次都重新拉取全部数据,有点让人不舒服,而且对流量也是一种很大的浪费。因此就琢磨着怎么去优化整个过程,以使在此过程中使数据传输量最小。
2017-04-18 13:13:43
562
原创 如何恢复全局INDEX
一般来说,当需要分配全局惟一id时,一般都会有一个变量来记录当前最新的id值,比如叫INDEX变量。每次需要分配id时,只要简单的自增一下INDEX变量,然后INDEX的值即为当前分配出去的ID的值。为了最大可能的延迟复用已经分配过的id,一般来说不会去特殊处理INDEX变量,即每次自增INDEX,并允许回绕情况的发生。但是最近碰到问题就
2017-04-18 13:10:05
520
翻译 消除弱表中的循环
消除弱表中的循环(Eliminating Cycles in Weak Tables)作者:Alexandra Barros, Roberto Ierusalimschy译者:重归混沌摘要:弱引用 为与垃圾回收器交互提供了一种优雅的机制。弱引用 的大多数典型应用都是通过弱表来实现的(例如:Java中的WeakHashMap)。 然而大多数弱表都有一个很苛刻的
2017-04-12 10:14:44
481
原创 silly的一次大规模重构
最近一个月都在重构silly, 包括其工作模式以及一些扩展库的实现基本上都被重写了。其实coding的时间并没有想象中的那么长,只是在重构过程中碰到很多取舍情况,大部分时间都耗费在了纠结的时间上。当初实现silly的初衷是首先满足类似gameserver这类业务模型的需求,然后尽可能多的兼顾其他类型的server。然而以这两年的工作经验来看,master-worker模式由
2017-04-12 09:52:54
496
原创 关于silly
自从写了第一个假server之后, 我就一直在想真正的处理高并发的server是如何做的。然后我就研究了skynet, nginx, Node.js这些服务器程序框架。这些框架除了skynet, 另外两个框架则仅仅是从使用上进行了了解, 并没有去通读他们的源码。所以基本了解下来,skynet是一个基本actor模式,Node.js则为纯异步模式, nignx则使用了master-wor
2017-04-12 09:42:38
391
原创 我的公众号
TL;DR: 我的公众号二维码看公众号的注册日期就知道,这个号其实注册很久了,一直没开启就是因为我想通过程序自动把我的blog搬过来.去年是因为懒得去支持https,然而经过我昨天夜里不懈的奋斗终于支持了https发现,这压根就不是https的事,我的个人账户就没有使用api的权限.so,妥协了,手动复制粘贴吧...ps. 以后公众号会与blog同步更新
2017-03-02 09:26:27
396
转载 解决 “无法安装 Visual Studio 2010 Service Pack 1,因为此计算机的状态不支持”
解决办法:32 位系统删除:HKEY_LOCAL_MACHINE\Software\Microsoft\VSTO Designtime Setup\64 位系统删除:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VSTO Designtime Setup\ 注:本文转载自:http:/
2013-04-08 17:21:18
1166
原创 Win7下VS2010不能链接问题
重装系统后,就没用过VS2010,今天想用VC2010写个小工具,结果新建的工程,一行代码不写都不能链接通过。出错提示如下:fatal error LNK1123: failure during conversion to COFF。网上Google一下很多人都说是嵌入式表单设置为NO或者是资源ID冲突问题。都不能解决我的问题。搞了大半天终于搞定了,将办法记下来,省得下次用到。经过google
2013-04-08 14:44:39
6349
转载 UcosII 就绪表的理解
为了保证系统的实时性,在就绪表这一块,内核设计者设计了一种算法,这个算法在O(1)的时间里完成查找就绪表中最高优先级的任务(遍历就绪表来查找最高优先级的做法是不能保证实时性要求的)。关于就绪表,这里涉及到四个数据结构,分别是:OSRdyGrp、OSRdyTbl[]、OSMapTbl[]和OSUnMapTbl[]。前两者是全局变量(INT8U),OSRdyTbl[]数组的大小取决于OS_LOWEST
2012-09-16 10:59:47
1011
原创 关于stm32 APB总线上的"接口时钟使能"与"外设时钟使能"
今天看>上的RTC时钟,发现他没有使能APB1的上BKP时钟,就能读出BKP寄存器里的内容.很是不解,又看了一遍发现APB总线上的时钟使能分为两种,一种是时接口时钟一种是外设时钟.又仔细观查了一下时钟树发现在APB外设时钟使能寄存器上表现为接口时钟的都已经有了自己的时钟,再经实验证明所有这种不需要在APB上使能就有自已时钟的外设(即在APBxENR的某一位上代表的是这个外设的接口时钟的外设)在
2012-07-17 15:37:35
3576
原创 stm32的窗口看门狗的一点发现
今天看stm32的窗口看门狗,突然发现很不正常,于是做了各方面的实验得出以下结论,由于只是实验了得出的结论没有官方结论,所以如果有人有理论依据请告知我,非常感谢11.一旦使能窗口看门狗的时钟,SR寄存器的EWIF位就会被置12.一旦在定义的窗口范围外喂狗就会复位3.在没有使能窗口看门狗定时器的情况下(即CR寄存器的WDGA寄存器置1来使能看门狗),SR不能被软件清0结论:所以必须把
2012-07-15 11:08:47
2290
1
原创 XP下JDK不能安装的解决办法
运行 cmd , 执行 "msiexec /unregserver" 然后 再执行 "msiexec /regserver"
2012-07-13 16:21:16
1463
原创 读The C programming language的新发现
1.C语言标准中的各类型长度,及指针长度并没有明确指定是多长,只是有一个长度限定。还有建议字节数,但这绝不应该成为我们写程序时的标准。因此,我们每到一个新平台的话就最好先搞清楚各类型是多长!2.C语言中char ,signed char,unsigned char,是3种类型,因为char 到底是signed char 还是char依赖于编译器的实现,K&R建议,为了便于移植,如果我们放的是非
2012-05-22 17:50:23
867
原创 ~/.fvwm/fvwm.stroke
#strokes#window list without dragStroke 0 0 R N WindowList#button 3 guesture with Ctrl starts programs in any context#"r" like guestures starts rxvt#Stroke N5456 0 A C Exec exec xkill#Stroke N6
2012-04-22 13:39:27
1017
原创 ~/.fvwm/.fvwm2rc
ImagePath +:/usr/share/icons:/usr/share/pixmaps:/usr/share/icons/hicolor/48x48/apps:/usr/local/share/fvwm/icons:$HOME/.fvwm/iconsEdgeResistance 250 100EdgeScroll 100 100EdgeThickness 10ColormapFoc
2012-04-22 13:26:40
2020
2
原创 我的debian下安装 spb16.3的经历
网上大多数都是在redhat系列机器的安装的,我始终不成功:整了好几天总算能启动了:额外的安装步骤如下: 1.安装csh,ksh 2. cd /usrln -s /tmp tmp 3.cd /binln -s /usr/bin/basename basename 4.将教程中的./pubkey -d
2012-04-21 12:00:29
1203
原创 我的.Xresources
经过无数次的尝试,我终于在rxvt下vim中的desert配色方案中达到与gnome-terminal相似的结果!Rxvt.colorIT: magentaRxvt.underlineColor:cyanRxvt.tintColor: grayRxvt.cursorColor: whiteRxvt.shading: 100xvt.backgrou
2012-04-19 19:27:51
1560
原创 Fvwm.desktop内容
## /etc/dm/Sessions/Fvwm.desktop ##[Desktop Entry]Name=FvwmComment=FvwmExec=fvwm2Terminal=FalseTryExec=fvwm2Type=Application[Window Manager]SessionManaged=true##此文件应该在在
2012-04-17 17:00:07
595
转载 getopt得用法
getopt被用来解析命令行选项参数。#include extern char *optarg; //选项的参数指针 extern int optind, //下一次调用getopt的时,从optind存储的位置处重新开始检查选项。 extern int opterr, //当opterr=0时,getopt不向stderr输出
2012-04-05 10:05:50
748
原创 C语言编程好习惯(持续更新)
1.编程好习惯之变量定义: 定义变量时总是按变量类型所占空间大小来排序是最好的! 如果是只有某个函数使用些变量,而且你又需要在函数让函数退出时不被销毁,那么就使用static吧2.编程好习惯之函数定义: 如果我们定义的C函数仅在此C文件中被调用那么加上static吧(适用于多文件编程) 如果我们想躲避C函数参数的类型检查,那 么K&R的函数定义声明方式还是很不错的!3.编程
2012-04-03 17:38:37
3148
原创 关于stm32的USB学习笔记之usbcore.c
#include #include "usbreg.h"#include "usbcore.h"#include "usbuser.h"#include "usbcfg.h"#include "usb.h"#include "usb_hw.h"#include "usbdesc.h"#include "hid.h"#include "hiduser.h"#define _D
2012-03-26 19:43:31
6330
原创 关于stm32的USB学习笔记之USB_HW.c
#include #include #include "usbreg.h"#include "usbuser.h"#include "usbcore.h"#include "usb_hw.h"#define _DEBUG_#include "debug.h"#define USB_EP_NUM 4/*端点缓冲区的开始地址 *因为每个缓冲块都需要一个端点描术表 *而所有的端
2012-03-14 20:01:11
7345
转载 使用STM32的USB模块中后对USB缓冲区的认识
最近在使用STM32的USB模块开发个项目,还以为挺简单,结果搞了快两天才把USB的包缓冲区的访问搞定,在此做个小总结吧。 STM32的USB模块包缓冲区有512B,但是在STM32的参考手册中的存储器映像中却表明0x40006000-0x400063ff,整整多了512B,怎么会这样呢,同时在尝试着编程时也遇到了一个问题:在usb_core.c文件的Setup0_Process(voi
2012-03-14 16:07:21
8873
原创 关于linux0.12临界资源的一点理解和猜测
今天看代码时突然发现,好像看到linus在写代码时的一些准则了,再根据赵博士的一句话"内核开发者不可能总是关注这些细节问题的!“,然后参照自己的理解总结出来一些准则,本人初学,如果有问题还请留言指正。 1.在关于锁的操作上,希望是原子操作,所以不管什么先关中断再说 2.在互斥资源上,如果下面可能睡眠,那么先上锁再说,这点可以从inode.c中的read_inode函
2012-03-12 20:00:33
1265
原创 关于linux0.12文件系统目录大小的一个发现
今天看到empty_dir函数发现他并不是比较i_size==32来判断是否为空,而是去读所有的块来判断是否为空,然后就觉得很奇怪,不过总觉得事出必有因,翻来覆去的找了一下,终于有了点发现,去看了一下add_entry和sys_rmdir这两个函数终于发现了一个事实!那就是目录文件的大小只会增大不会减小。下面是实验的截图:在这个实验里我们可以看到当我建立了test2 test3 test4
2012-03-11 15:38:14
897
原创 关于linux0.12中的add_entry中bread中的些猜测
今天看到文件系统namei.c中的add_entry部分了,发现一个问题 block = create_block(dir,i/DIR_ENTRIES_PER_BLOCK); if (!block) return NULL; if (!(bh = bread(dir->i_dev,block))) { i += DIR_
2012-03-08 16:03:23
1378
转载 uid gid euid egid详解
由于用户在UNIX下经常会遇到SUID、SGID的概念,而且SUID和SGID涉及到系统安全,所以用户也比较关心这个问题。关于SUID、SGID的问题也经常有人提问,但回答的人一般答得不够详细,加上曾经回答过两个网友的问题,还查了一些资料,决定整理成本文,以供大家参考。限于本人的水平问题,文章中如果有不当之处,请广大网友指正。一、UNIX下关于文件权限的表示方法和解析SUID 是
2012-03-07 21:33:41
21157
原创 linux0.12中文件系统的一些理解
在看文件系统始终觉得有点理解不了,今天偶有所悟还是赶紧记下来为好!看文件系统时要搞清以下几点:1.文件系统是用专门的工具来格式化的,也就是说内核中文件系统的代码是不含文件系统的初始化的。其实所谓的操作系统安装就是通过一个工具来制作文件系统然后将系统文件拷入最后再加个引导,但是这个过程比单纯的格式化要麻烦许多,因为安装时要制作根文件系统而不是仅仅格式化,但原理相似!2.要搞明白在设备中,各种
2012-03-04 20:55:22
1184
原创 我的初级muttrc配置
#设置邮件的编辑器set editor="vim"#设置邮件的发送程序set sendmail="/usr/sbin/exim4"set check_new = yesset timeout = 60#将各个邮箱分类存储set record="/home/findstr/.mail/sent" #发件箱set postponed="/home/finds
2012-03-01 15:29:14
3704
原创 latex初学者的经验
1.一定要及时换行,要不然latex是不会替你自动换行缩进的,相反如果我第几十个字来换一次那么它就会替我自动缩进下换行。2.关于中文首段缩进问题可用 \usepackage{indentfirst} + \setlength{\parindent}{2em} 来实现3.\setcounter{section}{-1}可使章节从0序号开始4.\usepackage[top=25mm,le
2012-02-24 15:40:12
9673
原创 关于重新编译内核后VirtualBox不能使用的问题
编译完内核后进入linux3.0内核后,习惯性的打开virtualbox,然后突然发现virtualbox提示错误,然后又出现一个对话框,上面写着:Nevertheless, there is no shortage of changes, such as the auto grouping of processes within a session, which has caused a l
2012-02-19 20:30:53
5570
转载 initrd与initramfs的区别
boot loader装入kernel, 然后kernel需要执行/sbin/init, 读取这个文件就必须先mount根文件系统, 早期是通过启动时的root=参数告诉内核根文件系统在哪个设备上, 随着硬件和技术的发展,现在根文件系统可能位于一个网络存储如NFS上, 可能由于RAID而散布于多个设备上, 可能位于一个加密设备上需要提供用户名和密码,这时root=参数就显得不
2011-11-19 13:23:50
2114
转载 ramdisk与 initrd、initramfs的关系
1、ramdisk、initrd是什么?ramdisk是一种基于内存的虚拟文件系统,通常用于放置内核的中间数据。而initrd全称为"boot loader initialized RAM disk",也就是由启动加载器所初始化的RamDisk设备,它的作用是完善内核的模块机制,让内核的初始化流程更具弹性;内核以及initrd,都由bootloader在机子启动后被加载至内存的指定位置,主
2011-11-19 13:22:17
5895
原创 vim写程序常用技巧
1.我们可以使用gf快捷键来进入任意一个被#include 的头文件. 2.使用ctrl+O来回到使用gf之前的文件中。 3.找到的一个不错的vimrc修改了一下可以自动更新ctags文件 4.增加了对系统头文件进行ctrl+]来查找的功能 5.增加了对splint进行代码检查的快捷键映射 6.如果想编译时自动定位到出错的地方,那么写一个Makefi
2011-11-13 11:43:29
3390
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人