- 博客(245)
- 收藏
- 关注
原创 事件监听模型于游戏业务中的实践
背景 随着版本的开发迭代,游戏开发者难免会面对一些业务扩展维护方面的难题。 由于游戏业务具体开发周期短,需求灵活多变,开发量多,模块间逻辑关联度大,容易出bug等特点,开发者往往很难同时兼顾开发效率和代码质量。而导致代码往糟糕趋势发展的原因,其中很重要的一点是,各系统模块间存在网状的调用关系,代码极易产生大量耦合,牵一发而动全身。这时候,如果项目中缺少一些统一的业...
2020-01-17 10:10:34
1143
原创 分布式游戏服务器全服匹配玩法设计
背景 如今的社交类游戏,大多采用分布式服务器架构,也就是说所有区服的数据存储在一个集群中,玩家可以无阻碍交互,一同游玩。再谈游戏中的匹配,多数匹配玩法都属于在线匹配,属于非常实时的一种匹配,匹配节点会根据玩家的操作(开始匹配,报名, 匹配完成等) 动态插入删除。这也就保证了匹配池的节点数量会维持在可控的范围内。而如果游戏中有海量的小团体, 要求每隔一定周期为全服所有团体分配一个实...
2019-06-22 20:55:08
6286
2
原创 C++实现轻量级的关键词查找系统
多数游戏中,都会提供关键词查找的功能,即通过输入一个子串,最终返回所有包含该子串的记录;具体的应用场景包括:陌生人查找, 公会查找,消息记录查找等等。对于这类需求,查找的数据范围往往会很广,如果是采用遍历字符串匹配的方式查询,时间开销会非常大。而如果存储方面使用的是类似于mysql这种支持like子句模糊搜索的数据库,实现起来简单,但具体的计算压力也全都交给了DB。那么项目中如果没...
2018-12-31 20:35:33
3374
原创 c语言实现c++继承模型
要用c语言实现c++继承模型,首先需要回顾一些关于类,继承相关的理论知识:1. class的本质仍是struct, 在内存中class依旧可以看作变量的集合,每个对象有独立的成员变量,所有对象共享类中的成员函数, 类中的成员函数位于代码段中。2. 运行时的对象退化为结构体的形式 ,访问权限关键字在运行时失效, 访问权限控制是编译期的限制。3. 调用成员函数时对象地址作为参数隐式传递 (函数编程=》...
2018-05-01 21:14:38
1166
原创 python多线程的具体应用-批量处理服务器列表
对于批量处理服务器的任务,通常的解决方案是在服务器内网部署一台中转机, 中转机通过一些途径获得所有单服的信息. 再使用ssh,rsync等指令和具体服务器交互完成工作。简略代码如下:#!/usr/bin/env python# -*- coding: utf-8 -*-import timeimport sysdef SwitchOption(ipInfo, option, server...
2018-03-11 19:53:27
1133
原创 实验楼-小时赛第1期 linux练习
1 服务管理安装并运行samba:sudo apt-get updatesudo apt-get install sambasudo service samba restart2 提取文本中的信息用脚本提取给定文档中以png和jpg结尾的图片链接:grep "http.*\.\(jpg\|png\)" $1 grep "http.*\.\ ( jpg \ | png
2018-01-16 16:45:50
781
原创 观察者模式和事件监听模式的区别
说到事件监听模式,很容易将它和观察者模式联系在一起。实质上这两者完成同类型的工作。依个人理解,事件监听模式更像是观察者模式的进阶。 用一张图来方便描述它们的区别:观察者模式中,‘主题’会在特定逻辑下通知所有‘观察者’。如果这个通知不包含任何信息,那么这种实现就是通常的观察者模式。class Subject{protected: voi
2017-12-14 15:50:00
10669
1
转载 linux screen用法教程
一、背景系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。二、简介GNU Screen是一款由GNU计
2017-07-19 17:09:37
2837
转载 CMake使用教程
最大的Qt4程序群(KDE4)采用cmake作为构建系统Qt4的python绑定(pyside)采用了cmake作为构建系统开源的图像处理库 opencv 采用cmake 作为构建系统...看来不学习一下cmake是不行了,一点一点来吧,找个最简单的C程序,慢慢复杂化,试试看:例子一单个源文件 main.c例子二
2017-07-19 14:15:57
1032
原创 游戏服务器中应对各种外挂/作弊的策略
在游戏开发过程中,游戏本身是十分脆弱的,在复杂的网络环境中,犹如一叶小舟,如果没有好的防守,可能说翻车就翻车。对于游戏开发者来说,与破坏者的斗争是长期的,艰苦卓绝的,也是一个斗智斗勇的过程,力量对比往往是此消彼长。所谓是道高一尺,魔高一丈,对于游戏守护者来说,要往往要做到的是魔高一尺,道高一丈。我们不可能完全避免作弊,只是在尽量增加作弊的成本。游戏作弊的一般方式主要有以下几种常见的:一
2017-04-09 21:24:05
4286
2
原创 C++使用protobuffer的一些坑
服务器用protobuffer (之后简称pb)做协议包体使用了两个月, 确实体验到了很多方便的地方(接口代码易写易维护, 内部编码高效,传输快等)但不可否认的是C++在使用它的时候存在一些很难发现的坑。c++ pb包体序列化/反序列化的方法有三种,分别是(从输入流, 文件流, 和string)中序列化对于网络传输的话, 用到只可能是string序列化/反序列化也就是在正常网络编程中用到的接口函
2017-03-22 17:55:43
7700
2
原创 Unity从网络/本地异步获取图片(微信头像)
最近在写获取微信头像的代码, 通过微信开放平台SDK授权登录后, 个人信息请求中会返回一个微信头像的url, 类似于这种形式:"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqx
2017-03-21 21:31:11
7257
原创 关于unity接iosSDK(微信登录) 的一些坑
1. 编译报错: duplicate symbol XXX.a官方文档中提到:[4] 在你的工程文件中选择Build Setting,在"Other Linker Flags"中加入"-Objc -all_load",在Search Paths中添加 libWeChatSDK.a ,WXApi.h,WXApiObject.h,文件所在位置(如下图所示)。但实际上, 因为
2017-03-19 00:20:20
5733
原创 unity接微信androidSDK,一个供参考测试的Demo
首先 搭建环境的工作我不多说, 网上可以搜到一大堆;然后 需要用到的请求还得读一读官方文档文档: 微信授权后http请求接口文档:分享给好友,朋友圈这个是微信登录授权后拉取到的用户信息unity代码部分经过简单的封装unity 调androidSDK 首先需要 _GetCurrentAndroidJavaObject
2017-03-07 22:12:52
7134
5
原创 [unity]实现切水果游戏
初学unity, 通过查阅资料以及自己的一些见解完成了自己做的第一款游戏. 现在把代码分享出来, 仅供参考,不足之处还请指正。游戏中有三个场景,主要用到六个c#脚本: 脚本 作用 buttonClick.cs 控制游戏中所有的按钮 appearFruits.cs 控制所有水果出现 cutFruit.cs 判断水果被切以及产生其他对象
2016-12-13 16:06:03
12605
3
原创 Unity 脚本生命周期流程图
可见Unity脚本从创建到销毁是具有一个完整的生命周期的,主要的调用顺序如下: 其中OnGUI函数会在每帧上多次被调用,因为要时刻准备相应里面的GUI事件(第一次布局,第二次重绘, 接下来准备各种事件)。渲染部分:OnPreCull: 在相机剔除场景之前调用此函数。输入事件。相机可见的对象取决于剔除。OnPreCull
2016-12-08 16:31:51
1969
转载 深入理解红黑树
本文参考:I、 The Art of Computer Programming Volume III、 Introduction to Algorithms, Second EditionIII、The Annotated STL SourcesIV、 WikipediaV、 Algorithms In C Third EditionVI、 本人写的关于红黑树的前三
2016-10-04 11:56:48
1360
转载 shell编程 快速入门
简单的说shell就是一个包含若干行Shell或者Linux命令的文件。对于一次编写,多次使用的大量命令,就可以使用单独的文件保存下来,以便日后使用。通常shell脚本以.sh为后缀,第一行一定要指明系统需要哪种shell解释用户的shell程序,如:#!/bin/bash 、#!/bin/sh等。在这里我们使用#!/bin/bash。通常shell由Linux命令(外部命令)、Shell
2016-09-21 10:48:55
842
原创 vector迭代器失效解决方法 及 内存原理
迭代器失效vector是个连续内存存储的容器,如果vector容器的中间某个元素被删除或从中间插入一个元素, 有可能导致内存空间不够用而重新分配一块大的内存。这个动作将导致先前获取的迭代器,,第一层和第二层均失效。造成失效的两个函数:
2016-09-20 17:11:16
6611
1
原创 epoll实现高并发聊天室
关于epoll,请看上一篇文章: epoll详解本代码包含三个文件: utility.h client.cpp server.cpp 可实现局域网内多主机异步通信效果图:1. 开启服务端:2. 开启两个客户端:客户端1: 客户端2: 服务端的提示消息: 3. 消息传送:客户端1: 客户端2: 服务端的提示消息并广播: 代码://utility.h
2016-09-15 17:47:16
3483
1
转载 epoll详解
什么是epollepoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll。当然,这不是2.6内核才有的,它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linux kernel 2.5.44),它几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。 epol
2016-09-13 20:58:51
1117
原创 网络编程服务器端绑定ip设置
在使用socket编写服务器程序时,设置服务器绑定的sockaddr_in结构往往会困扰很多同学,sockaddr_in结构中sin_famliy和sin_port(注意要使用htons转换为网络序)就不说了,相信大家已知道。sin_addr是要设置的监听地址。sin_addr类型为: struct in_addr { in_addr_t s_addr;
2016-09-12 15:43:25
4375
原创 linux-socket tcp客户端服务器编程模型及代码详解
上一篇文章介绍了 TCP/IP相关协议,socket通信流程和涉及到的各种函数:Socket简单理解本篇将具体解释tcp客户端服务器编程模型相关的代码文章分为4个部分:1. TCP客户端服务器编程模型流程图2. 网络字节序与主机字节序3. TCP编程的地址结构4. 详细案例代码及解释一: TCP客户端服务器编程模型流程图 上面两张图片将整个流程已经说明的很清楚了;二: 网络字节序与主机字节序字节序
2016-08-23 21:12:25
8295
转载 gcc "undefined reference to" 问题解决方法
最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误:(.text+0x13): undefined reference to `func' 关于undefined reference这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助。1. 链接时缺失了相关目标文件(
2016-07-25 17:54:59
11011
原创 CentOS vi 配置文字高亮,缩进,以及生效方法
首先介绍一些vim配置文件中基本的属性设置: set nocompatible "关闭vi兼容模式,可以启用方向键和Backspace syntax on "自动语法高亮 set number "显示行号 set cursorline " 突出显示当前行 set rul
2016-07-24 19:16:47
3356
原创 c++11多线程 生产者-消费者模型/条件变量condition_variable
在工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。在生产者与消费者之间在加个缓冲区,我们形象的称之为仓库,生产者负责往仓库了进商品,而消费者负责从仓库里拿商品,这就构成了生产者消费者模式。结构图如下:下例中我们通过队列来模
2016-07-20 21:18:48
6320
原创 gdb core的使用
有些时候我们在一段C代码的时候,由于对一个非法内存进行了操作,在程序运行的过程中,出现了"段错误"。呵呵,这种问题我想很多人会经常遇到。遇到这种问题是非常无语的,只是提示了"段错误",接着什么都没 有,如果我们一味的去看代码找太疼苦了,因为我们都相信自己写的代码没问题,现实就是现实。下面介绍一种方法,可以有效的定位出现"段错误的地方"。当我们的程序崩溃时,内
2016-07-18 21:54:30
702
原创 数组指针和指针数组 原理 及 异同
#includeint main(){ char c[][4] = {"123","456","789"}; //数组指针 (二维数组) char (*p)[4]; //数组指针 p=c; //一个指针 指向一个 至多有4个字符 的 字符串数组 该数组保存在栈区 //该字符
2016-07-18 17:40:21
852
原创 指针遍历二维数组的三种方式
#includevoid func1(int p[][3], int row, int col){ //第一种遍历方式 传递 二维数组名(行指针) //通过下标遍历 简单明了 for(int i=0; i<row; ++i){ for(int j=0; j<col; ++j) printf("%4d", p[i][j] );
2016-07-18 16:47:03
7837
1
原创 c++11多线程 互斥量
下面有一段两个线程同时输出的代码#include#include#includeusing namespace std;void func(){ for(int i=0;i<10;i++) cout<<"in func:"<<i<<endl;}int main(){ thread t1(func); t1.detach(); for(int i=0;i<10;i++)
2016-07-13 19:40:45
933
原创 C++11 多线程入门与示例
c++11中stl 提供了(目前)五个头文件以支持多线程: (提供原子操作功能) (线程模型封装) (互斥量) (条件变量) 只使用win32的c++程序员可能对提供的线程库感觉很陌生。事实上,它看起来的确是pthread_xx的c++封装。1 创建线程:
2016-07-13 08:55:41
1357
原创 vs2012 最常用快捷键
1.代码补全强迫智能感知:Ctrl+J; (补全函数名 变量名)强迫智能感知显示参数信息:Ctrl-Shift-空格; (补全参数名)2.注释注释选定块:Ctrl+K,Ctrl+C取消注释块:Ctrl+K,Ctrl+U
2016-06-07 12:43:55
607
原创 简单百科爬虫 python
本爬虫的目的是截取某百科下的所有相关链接的标题和简介,最终以html表格的形式呈现爬虫整体架构爬虫整体流程代码部分调度端- baike_spider:# coding:utf-8from baike_spider import url_manager, html_downloader,
2016-05-18 20:39:37
3252
原创 python正则表达式 详解与实例
1. 正则表达式基础 简单介绍正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是不常用的部分。如果已经在其他语言里使用
2016-05-15 12:00:40
1267
原创 Session详解与应用(java,js)
Session机制在学习session之前,我们首先要了解一下保存在客户端的会话跟踪机制cookie-------cookie详解与应用除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。1 什么是Session
2016-05-04 14:39:43
4331
原创 Cookie详解与应用(java,js)
1 Cookie机制在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。而Web应用程序是使用HTTP协议传输数据的。HTT
2016-05-02 20:25:24
3918
原创 Socket简单理解
TCP/IP要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何再它们之间传输的标准,从字面意思来看TCP/IP是TCP和IP协议的合称,但实际上TCP/IP协议是指因特网整个TCP/IP协议族。不同于ISO模
2016-04-27 20:14:17
3242
原创 c++primer(第五版) 第十五章 面向对象程序设计习题答案
纯原创 转载请注明出处:http://blog.youkuaiyun.com/axuan_k略过书上有现成代码的题目15.1 15.215.1虚成员是基类中的概念基类中的某些函数希望它的派生类能够重新定义自己的版本则基类中这样的函数被称为虚函数(虚成员)15.2private的成员:只有本类的对象或友元函数或友元类的对象能调用它protected的成员:除上述之外,
2016-04-14 11:56:34
1458
原创 大鱼吃小鱼游戏代码 基于java-swing
上周是数据库课程设计周,学校为了让我们做出一个真正能用(能看见框体)的东西,同时为毕业设计做准备,找来了培训机构的老师,讲解了两天java-swing图形界面的东西虽然swing算是过时了的东西,但学起来还是挺开心的,毕竟终于能自己用图形界面写出东西来了.不过代码思路主要还是老师提供的,逻辑功能实现图这是最后给同学更改了部分参数贴上图片后
2016-04-10 12:05:30
14426
6
原创 c++primer(第五版) 第十四章 重载运算与类型转换习题答案
14.1---14.4#include#include#include#include"Sales_data.h"using namespace std;int main(){// 14.1 重载版本与内置版本拥有相同的运算符优先级和结合律的时候 --相
2016-04-06 21:04:56
1476
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人