自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(113)
  • 资源 (1)
  • 收藏
  • 关注

原创 游戏服务端架构简析

文档主要记录一些流行的服务端架构,并以FPS游戏架构为例,谈谈一些游戏服务端开发可能遇到的问题。

2023-07-26 11:19:49 2357

原创 SQL语句使用笔记

一、where和having的区别where字句在聚合前从数据表中的字段直接进行的筛选,也就是说作用在group by字句前。而 having子句在聚合后对组记录进行筛选,即对于group by筛选的字段再筛选。所以类似where count(*) > 0这种句子就会报错。因为在where执行的时候,还没有聚合结果。同样的,select a, b from table having a = "1"不会报错,但select b from table having a = "1"就会报错,因为sel

2020-12-06 20:30:13 178

原创 c++ switch的一些神奇用法

一、switch作用域switch中,如果写成下面这样会报错switch(i) case 1: int a = 0; break; case 2: break;因为case中的变量属于整个switch块结构,编译器认为如果不执行case 1,a会未经初始化就使用,所以编译通不过,需要加一个作用域如下,将a的作用域局限在case 1中即可switch(i) case 1: { int a = 0; } break; case 2: break;二、swi

2020-08-28 15:05:43 2569

原创 用do while进行复杂的宏定义

在很多比较复杂的宏定义中,经常可以看到整个接口被一层do while(0)给包了起来#define Foo(x) do{\ printf("first statement\n");\ printf("second statement\n");\}while(0) 这样定义的是一个非复合语句,可以确保在类似下面这种情况if(xxx) Foo(x) else ... 可以顺利展开,展开后的结果被do while包了起来if(xxx) do { print

2020-07-20 19:15:16 337

原创 Nginx初次使用笔记

一、简介nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器正向代理:到达WEB服务器之前所加的代理,比如使用代理软件访问谷歌。对于正向代理来说,用户可以感知使用了代理,但服务器无法感知是否使用了代理。用户VPN等正向代理服务器反向代理:到达WEB服务器之后所加的代理,比如访问百度。中间有个负载代理服务器,用于指向实际的服务器。对于反向代理来说,用户无法感知使用了代理,但服务器可以感知使用了代理。用户服务器的反向代理server 1server 2s

2020-07-12 22:28:17 242

原创 C++11多线程与并发控制

C++11中封装了一套跨平台的线程库以及配套的并发控制库,这里一起记录一下一、Thread库C++11中封装了一套线程库,位于thread文件中,具有基本的线程需要的各类函数。如下显示了一个基本的线程操作流程:#include <thread>#include <iostream>>using namespace std;void ThreadFunc...

2020-02-19 21:07:38 717

原创 muduo学习(二):TcpServer、TcpConnection、TcpClient等主要成员

在上节介绍的EventLoop基础上,就可以正式开发网络库需要的面向外部的接口。网络库主要包括TcpServer,TcpConnection,Acceptor,Connector,TcpClient。前三者用于服务端,后两者用于客户端。此外还有一个用于封装socket api的Socket类一、服务端成员:TcpServer是服务器的基础。一个TcpServer包含一个主loop、一个线程池...

2020-02-16 14:19:00 241

原创 muduo学习(一):EventLoop与EventLoopThread

这段时间都在学习muduo网络库,这里整理一下这段时间的学习笔记一 、Reactor模式:muduo也是一种基于reactor模式开发的网络库,关于reactor模式网上已经有很多内容,这里不赘述,muduo使用的是主从模式的reactor,即一个mainReactor线程负责监听端口,任何连接的套接字都会被转到subReactor所属的线程中进行处理,暂时还没看到muduo的subReact...

2020-02-11 21:29:16 403

原创 大并发服务器架构介绍

一、对于大并发服务器,其架构大致可以划分成下面几层:用户任务服务器1任务服务器2应用服务器1应用服务器2应用服务器3缓存1...nDAL数据访问层数据库1、任务服务器 —— 应用服务器:用户的主要业务逻辑放在应用服务器执行,真正的数据库只进行辅助操作。在用户和应用服务器之间有一个任务服务器,主要负责应用服务器的负载均衡,可以主动监视应用服务器的状态,也可以应用服务器完成当前任务后主动去任务...

2020-02-08 17:45:10 400

原创 UE4:用C++的方式在UE中添加一个Sequence蓝图函数库

在尝试Sequence的开发中,发现下面这个蓝图函数找不到C++中对应的接口,因此自己添加一个C++的蓝图函数库,通过传入的字符串名返回对应的Sequence的bind ID具体步骤如下:第一步,引擎资源浏览器选择添加C++类,然后引擎会根据你选择的模块位置自动帮你生成cpp和h文件其中公有还是私有取决于你要不要把这个类用到其他Module第二步,因为我用的是源码版的引擎,因此添加完...

2019-09-29 18:52:50 2297 1

原创 UE4:如何将角色A的外表拷贝到另一个蓝图生成的对象中

在游戏开发中,有时我们需要根据A对象生成一个新的B对象,两者的逻辑不一样因此用的是不同蓝图,但我们希望B能完全复制A的外观。这时我们要做的工作就是把A的mesh组件(character对象必有)复制到B中一、创建并拷贝旧mesh首先将A对象的mesh通过下面的方法拷贝到B的mesh中。第一步是指定需要拷贝的mesh,第二步是设置mesh相对于挂接的父项的偏移量,第三步是由于每个mesh可能会有...

2019-09-03 19:42:27 2352

原创 C++静态成员变量的定义与初始化注意事项

静态(statis)变量只在第一次被调用时声明并初始化,此后保存在堆上。而对于类的静态成员来说,同样是所有类共享一个静态成员,需要注意的是静态成员的初始化如下面代码class A{ public: static int a; // static int a = 1; // ERROR};int A::a = 1;int main(){ cout &l...

2019-08-19 20:31:07 5030 4

原创 linux中调用send时不阻塞的问题

如果用默认方式创建socket,则是以阻塞的方式创建,但在linux中,即使我们用阻塞的方式创建了socket,但调用send时的表现感觉并没有阻塞如下面代码// Serverwhile(true) { int nMaxSendLen = 1024; char szSend[nMaxSendLen] = "hello internet"; ...

2019-07-28 21:11:29 709

原创 UE4:行为树切换、条件判断、task返回

一、行为树切换在UE4的AI系统中,如果需要指定ai使用的行为树,可以在aicontrol中通过run behavior tree节点启动但有时候,我们需要在行为树中运行另一个行为树,如吃饭的时候,碰到其他人,需要聊天。如果直接用aicontrol切换行为树,那么会导致,我聊天完切换回吃饭,要从头执行,即从头开始吃饭。这样显然是不方便的,因此,可以使用行为树中的run behavio...

2019-07-25 14:25:44 3847

原创 UE4:文件删除与重定向

在删除UE蓝图文件时,如果其他蓝图资源曾有引用、继承等操作指向过该蓝图,那么就会留下一个其他资源指向该蓝图的引用,此时删除文件会出现下图的提示。可以选择替换引用,将其他资源中的该蓝图替换成其他蓝图。通过此操作,虽然将实际的蓝图方法替换,但会保留一个重定向,使每个指向该蓝图的资源引用重新指向另一个资源。但此时仍然不能在文件夹中删除掉该蓝图资源,因为这个重定向指针仍储存在蓝图中。...

2019-07-25 14:18:40 4565

原创 Unity学习笔记(二)

1、导入的图片资源形状不对因为默认的导入其texture type属性默认为texture(状态栏里显示为default),将其改为sprite就行另外,如果导入jpg等图片是没法直接用的,同样需要改texture type属性。2、socket网络通信,消息遗失用receive接收服务器的消息会阻塞,如果接收之前判断一下socket.available即可判断是否能接收。...

2018-07-05 22:46:44 652

原创 Unity学习笔记(一)

1、layermask的作用通过LayerMask.GetMask(“LayerName”),可以获得对应层的掩码(mask)。这样可以使得,如用摄像机投影射线时,求出其投影到指定层后的碰撞点。即可以指定碰撞器2、Time.deltaTime的作用官方解释是:你加上或者减去一个值,那你很可能应该乘以Time.deltaTime。当你乘以它以后,你实质上的表达是:我想让这个物体以每...

2018-06-08 00:33:21 767

原创 关于vs2015无法添加外部工程引用的解决办法

有时候,vs2015中右键项目,选择添加引用时,会没有显示,如下图:这时候解决办法也很简单,把项目属性-&gt;常规的“公共语言运行时支持”,按如下图设置:设为公共语言运行时支持,就能正常添加引用了...

2018-02-08 16:54:27 6838

原创 direct3d中资源视图与多重采样

1、direct3d中的资源视图:纹理等资源可以被绑定到渲染管线的不同阶段,但实际上,用于绑定的不是资源本身,而是与资源关联的资源视图。因此需要先创建资源,再创建资源视图,最后将视图绑定到渲染管线。需要注意的是,如果在创建资源时,没有指定对应的绑定标志值,那么就无法创建对应的视图。如:在创建资源没有使用D3D11_BIND_DEPTH_STENCIL绑定标志值,那么就无法为该资源创建ID3...

2018-01-19 11:21:02 491

原创 python tkinter界面居中显示的方法

由于tkinter没有直接提供居中显示的api,因此,要想将tk的对话框居中显示,需要用到tk自带的设定位置的方法geometry()nScreenWid, nScreenHei = tkLogin.maxsize()nCurWid = tkLogin.winfo_reqwidth()nCurHeight = tkLogin.winfo_reqheight()tkLogin.geom

2018-01-08 18:27:12 14255

原创 Python字符串中,raw字符串与repr的区别

在Python中,对于一个字符串,设原字符串为:str1 = '''{...quote = " \" "...}'''如题,如果处理时直接读取字符串,那么quote对应的\"字符将会被转义为一个”,这可能不是我们想要的结果。为了保存\"两个字符,考虑对该字符串用raw和repr,得到的结果是不同的使用repr(str1),得到的结果将会把所有的转义字符都保留

2017-12-18 17:54:32 975

原创 Python numpy中数组(ndarray)的运用

numpy的主要数据类型是ndarray初始化方法可以通过等号赋值,也可以如下所示:a = np.arange(15).reshape(3, 5)print aarray([[ 0,  1,  2,  3,  4],       [ 5,  6,  7,  8,  9],       [10, 11, 12, 13, 14]])a = np.array([2

2017-11-20 20:42:44 896

原创 将博客搬至CSDN

校园网连接新浪博客一直有问题,所以在此对新浪博客进行搬家请前往CSDN查看博主最新动态:http://blog.csdn.net/bloodfeast

2017-09-05 12:36:31 201

原创 visual&nbsp;studio无法查看局部变…

这两天发现VS2013一直没法查看局部变量,最后发现,是解决方案那里选择的是Release而不是Debug,调回来之后一切OK。这一股蛋疼的感觉。。。

2017-09-05 12:36:28 281

原创 C++虚函数的内存管理

这几天在复习多态性和动态绑定,看到一篇不错的博文:https://blog.twofei.com/496/这里记录一下。动态绑定实现关键就在于C++的虚函数,虚函数的内存管理由虚函数表实现,下面几张摘自博文的图很好地说明了虚函数的内存:1、当子类没有虚函数时,直接采用父类虚函数表(虚函数表由指针vfptr指向),如果有虚函数,同名的会覆盖,不同名的接在后面[0][1]的后面。2、

2017-09-05 12:36:25 363

原创 leetcode:Simplify&nbsp;Path+Edit…

Simplify Path:题目本身不难,模拟linux的文件路径,如../表示上一级目录,用栈的思想即可。不过我的方法用了一堆if,最关键的是,我是逐个读取字符,看了大神的代码,直接getline(ss,tmp,'/'),tmp就是两个/之间的字符串。Edit Distance:用替换、删除、插入三种方法,把字符串s1转为s2。典型的动态规划,关键还是要想到状态转移方程:dp[i][

2017-09-05 12:36:23 209

原创 linux中$*&nbsp;$@&nbsp;以及各自…

为了方便,这里记录一下实验结果,方便以后查询实验程序如下:#!/bin/bashecho '$@'for i in $@do       echo $idoneecho '"$@"'for i in "$@"do       echo $idoneecho '$*'for i in $*do       echo $idoneecho '"$*"'fo

2017-09-05 12:36:20 714

原创 leetcode:Pow(x,&nbsp;n)&nbsp;+&nbsp;N-Quee…

Pow(x, n):就是实现指数函数。其实自己已经想到边了,类似于pow(n/2)*pow(n/2),但一直在纠结这样其实也要算两次。其实只要换个角度,pow(x,n)=pow(x*x,n/2)即可。另外,要注意java和c++的差别,-2147483648(int型最大负数)这个数转为正数,在c++会溢出,java可能因为有自动处理机制,所以会正常转换。人生第一次抄答案(java版)还W

2017-09-05 12:36:17 239

原创 用已有的caffemodel和python脚本进…

2月13日更新:在使用python脚本之前,首先需要在根目录makepycaffe,同时确保环境变量PYTHONPATH是指向当前caffe/python这一子目录下的,如果指向其他版本caffe的python目录,可能导致程序无法运行==========================================================当已有caffemodel之后,

2017-09-05 12:36:14 628

原创 leetcode:Permutations1+2&nbsp;+&nbsp;Rotat…

Permutations1:给定数组如[1,2,3],找出所有排列。用回溯法即可,关键在于迭代器的应用,我们可以用迭代器暂时把入栈的元素从数组中删除,这样就能很方便的用深搜来遍历数组了。Permutations2:数组中这次有了重复元素,解决方法很简单,在入栈之前做个判断,如果等于上一个元素,说明不用考虑(这种情况已经遍历过了)。关键是验证了一种方法,迭代器可以加减常量:ite==*(

2017-09-05 12:36:11 257

原创 leetcode:Multiply&nbsp;Strings&nbsp;+…

eMultiply Strings:依然是模拟题,求两个字符串表示的大数乘积。其实只要模拟乘法的过程即可:数一第i位和数二第j位的乘积,是累加到答案的第i+j位。感觉模拟题还是要多点耐心,想清楚问题的关键即可。Jump Game:一开始想到用DP,从尾部开始往前,dp[i]=true的条件是它能到之后的任一true的位置。时间复杂度o(n),大数据测试时超时。换了用贪心,从后往前,每次

2017-09-05 12:36:08 205

原创 leetcode:Longest&nbsp;Increasing…

Longest Increasing Subsequence:经典题目,最长上升子序列。这个比较容易想到DP正常思路是:dp[i]表示以i结尾的最长子序列长度,所以dp[i]=max(dp[i],dp[j]+1),其中j对应的num[j]转移方程混乱。所以以后还是不要贪多,转移方程最重要的是表示子问题的状态,重要的是精准而不是广泛First Missing Positive:找到无序

2017-09-05 12:36:06 149

原创 leetcode:Maximum&nbsp;Subarray+Find&nbsp;M…

Maximum Subarray:又遇到了经典问题,最大子段和。这里记录一下,其实这个问题难点就在于,不能用一个状态方程表示,而需要两个:end作为以第i个元素结尾,能取得的最大值,dp作为,前i个元素能取得的最大值end[i]=max(end[i-1]+nums[i],nums[i]);dp[i]=max(end[i],dp[i-1]);然后可以优化成两个变量,使空间复杂度降为O(1

2017-09-05 12:36:03 217

原创 leetcode:Gray&nbsp;Code&nbsp;+&amp;n…

Gray Code:这道题说白了就是求1-n对应的格雷码,只要知道gray[i]=i^(i>>1)这个基本公式即可。Lexicographical Numbers:给出小于n的所有数字的字典序数组,如[1,10,11,12,13,2,3,4,5,6,7,8,9](n=13)。这道题我用的是深搜,不过看discuss,更快的是用迭代,直接循环n次,每次把数字按指定规律变化即可Binar

2017-09-05 12:36:00 171

原创 leetcode:&nbsp;Best&nbsp;Time&amp;nb…

Best Time to Buy and Sell Stock with Cooldown:这道题从中学到最重要的就是,当发现一个DP怎么也无法表示完全时,考虑多个DP方程本题一共需要用三个DPbuy[i] = max(rest[i-1]-price,buy[i-1]) sell[i] = max(buy[i-1]+price,sell[i-1]) rest[i] = max(sel

2017-09-05 12:35:58 256

原创 caffe使用图片数据作为输入

caffe输入图片数据其实很简单,把层类型改成ImageData,source改成指向图片信息的文件(其中每行指向一张图片)即可。最主要记得,如果提示错误信息:F0629 09:46:54.935997 18325 image_data_layer.cpp:49]Check failed: !lines_.empty() File is empty原因很可能是,要把原来写在data_par

2017-09-05 12:35:55 2975 2

原创 leetcode:LongestRepeatingCharac…

Longest Repeating Character Replacement:给一个字符串,只能替换其中k个字符,求能替换出的最长相同字符的子串。这个是用滑动窗口来解,算是遇到的第一个这种类型的题目。i作为右窗口,不断右移直到s.size()-1。子串减去已出现的最多的字符数,如果超过k,说明此时需要替换的字符数量已经超过了k,要把左窗口右移。右移之后还要减少相应的字符数量Maximu

2017-09-05 12:35:52 172

原创 c++使用杂录(一)

一、如何去掉string类的最后一个字符a[a.size()-1]='\0';二、去掉容器中重复的且长度大于n的字符串(n在之前给定)list_1.unique( [n](const string a,const string b){ returna==b&&a.size()>n; } );即:使用lambda表达式,如果相邻的两个字符串相等且长度大于n,则删掉。注意:要先用sort

2017-09-05 12:35:49 240

原创 leetcode:Reconstruct&nbsp;Original&nbsp;D…

Reconstruct Original Digits from English:给定一组乱序的字符串,是由zero、one、two......到nine的所有字母乱序组成,求对应的升序数字串。如给定,owoztneoer,对应012。这道题是我自己想复杂了,想着找到每个数字的uniquenumber,然后贪心搜索。其实先把几个有独一无二字符的数字找出来(如:six的x即是独一无二),然后

2017-09-05 12:35:46 180

原创 leetcode:Bulb&nbsp;Switcher&nbsp;+&nbsp;K…

Bulb Switcher:给n个灯泡,第i轮关掉每i个灯泡,问n轮之后还剩几个灯泡。如果用数组模拟肯定要超时,仔细想了想DP也是要超时的。其实这道题就是道数学题,如果第i盏灯亮着,那么必定是个某个k的平方,因为只有这样它才会在第k轮被点亮,又没有对应的i的因子(i/k)来把它灭掉。Kth Smallest Element in a BST:搜索二叉排序树中第k小的元素。这道题证明了,

2017-09-05 12:35:44 174

Javascript与网络cookie

JavaScript的cookies相关介绍

2013-11-05

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除