<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[monkeycat520的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/monkeycat520</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; monkeycat520]]></copyright><item><title><![CDATA[双链表运用于SLG游戏领土删减性能优化]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/117045158</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/117045158</guid><author>monkeycat520</author><pubDate>Wed, 19 May 2021 21:12:32 +0800</pubDate><description><![CDATA[公司的SLG项目上线运行挺久的，军团领土这一块一直没大问题，大概玩法就是玩家可以创建军团，军团长可以在世界上创建军团基地，玩家可以占领相邻的格子，变为军团领土，增加所有军团成员的收益。如果放弃某个格子，或者由于被其他军团抢夺而失去，则会检查不与基地相连的领土，全部失去。

直到去年一月份一个大版本的更新：军团领土上限变多了很多，并且由于奖励的机制，玩家原本块状的军团领土变成了线条性。更新后玩家群反馈是不是无法操作，类似断网的体验。问题来了，那就开查根据服务器日志，很快定位到卡顿点：但军团失去领土，服务器会因]]></description><category></category></item><item><title><![CDATA[洪水填充算法用于slg类型游戏的自动寻路]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/116950697</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/116950697</guid><author>monkeycat520</author><pubDate>Tue, 18 May 2021 13:04:31 +0800</pubDate><description><![CDATA[先上总结：为啥不用A*用这个洪水填充，是因为这次的需求是确定终点，不确定起点（可能有多个，找最优解），于是从终点出发，找到最近的起点，就选择用这个洪水填充算法了。

首先介绍下前提：

slg世界地图上有各种对象，并且有玩家的军团的军团领土
	玩家可以手动派遣部队前往占领与已有的军团领土相邻的地块变为自己的军团领土，也可以抢夺其他军团的军团领土
	部分对象占用的格子不可以占领
然后再介绍下需求：

当玩家点击某个与已有的军团领土不相邻的地块时，需要支持玩家自动把军团领土铺过去（简称自动铺路）
	自动铺路遵循]]></description><category></category></item><item><title><![CDATA[可定制xml2lua]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/116950212</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/116950212</guid><author>monkeycat520</author><pubDate>Mon, 17 May 2021 21:42:41 +0800</pubDate><description><![CDATA[先总结一波：这次介绍的xml2lua是使用tinyxml的C++开源代码，加上自己定制的内容，再一起封装成exe可执行文件。

通过编写一个bat文件，我们可以实现在实行exe的时候把读取路径、生成路径传进程序。定制部分是核心优化点，下面详细介绍下思路：

首先基础功能是后序遍历读取路径下的所有文件内的xml文件，逐个打开并访问第一个sheet的所有内容，由第二行内容决定使用何种解释器（例如i对应数值解释器，s对应字符串解释器，t对应列表解释器），由第一行决定key名，生成具有key-value的lu...]]></description><category></category></item><item><title><![CDATA[Error: Unable to connect to a repository at URL搭建svn服务器解决方案]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/116905016</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/116905016</guid><author>monkeycat520</author><pubDate>Sun, 16 May 2021 23:17:09 +0800</pubDate><description><![CDATA[Error: Unable to connect to a repository at URL搭建svn服务器解决方案

这个问题是在搭建svn服务器的时候遇到的，如果是客户端遇到该问题，请跳过

这周末在家装了VisualSVN Server，打算在本地建个代码库。装服务器，启动，很简单，跟着网上教程走半小时内就下好装好，并且可以使用svn客户端本地检出了。

下一步，用第二台电脑检出下，结果遇到了上述报错，具体如下：



在网上找了挺久的解决方案，无果。后来想起公司的svn是用id的形式访问的，于是将]]></description><category></category></item><item><title><![CDATA[python协议传输时的类型报错]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/83178627</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/83178627</guid><author>monkeycat520</author><pubDate>Fri, 19 Oct 2018 11:21:40 +0800</pubDate><description><![CDATA[想起之前遇到一个有趣的bug，非常值得记录下来。

项目使用的协议需要指定参数类型，出错协议的某个参数设为int，传参时该参数默认为（1&amp;lt;&amp;lt;32 - 1），大部分时候不会用到默认数值，但万一的情况出现了，然后就报错了。

分析：（1&amp;lt;&amp;lt;32 - 1）这个运算过程中，优先计算（1&amp;lt;&amp;lt;32），这时超出int的范围，python源码将此变量自动转换为long，再减去1...]]></description><category></category></item><item><title><![CDATA[网游的跨服玩法是如何实现的？“跨域体系”架构设计思路]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/83051472</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/83051472</guid><author>monkeycat520</author><pubDate>Sun, 14 Oct 2018 21:57:20 +0800</pubDate><description><![CDATA[虽然游戏市场竞争激烈，产品格局变动较大，但游戏产业一直处于稳步增长阶段，无论是在端游，页游，手游还是已经初露端倪的HTML5游戏。可以预见，游戏类型中，MMOARPG游戏仍然会是引领市场的主流趋势，贡献着大部分流水，市场上也仍然在不断涌现精品。研发团队对MMO游戏的探索从来未间断过，从付费模式的改变，到题材多元化，次时代的视觉效果，更成熟的玩法及数值体系，本文主要针对跨服玩法上的探索和实现做一些思...]]></description><category></category></item><item><title><![CDATA[python使用protobuf]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/82939386</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/82939386</guid><author>monkeycat520</author><pubDate>Thu, 04 Oct 2018 18:31:43 +0800</pubDate><description><![CDATA[当然首先你得安装好python和protobuf，之前的一篇博客有介绍：

https://blog.youkuaiyun.com/monkeycat520/article/details/81592905

接下来需要定义一个.proto文件。例如testProtobuf.proto：


syntax = &quot;proto2&quot;;

message Person{
	required int32 nID = 1...]]></description><category></category></item><item><title><![CDATA[客户端主循环的几种方案]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/82934876</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/82934876</guid><author>monkeycat520</author><pubDate>Wed, 03 Oct 2018 23:38:42 +0800</pubDate><description><![CDATA[游戏主循环是每个游戏的心跳，输送着整个游戏需要的养分。不幸的是没有任何一篇好的文章来指导一个菜鸟游戏程序员如何为自己的程序供养。不过不用担心，因为你刚好不小心看到了这篇，也是唯一一篇给予这个话题足够重视的文章。

由于我身为游戏程序员，我见过许许多多的手机小游戏的代码。这些代码给我展示了五彩缤纷的游戏主循环实现方法。你可能要问：“这么简单的一个小玩意还能做到千奇百怪？” 事实就是这样，我就会在此文...]]></description><category></category></item><item><title><![CDATA[StarUML——一款在MAC上的UML软件]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/82934795</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/82934795</guid><author>monkeycat520</author><pubDate>Wed, 03 Oct 2018 23:19:50 +0800</pubDate><description><![CDATA[直接上链接：

https://blog.youkuaiyun.com/yangmingqian/article/details/50126907

建各种图的选项在这，建几个新图玩下基本就能上手。



 ]]></description><category></category></item><item><title><![CDATA[lua os.clock可能会返回负数]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/82841013</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/82841013</guid><author>monkeycat520</author><pubDate>Tue, 25 Sep 2018 16:21:59 +0800</pubDate><description><![CDATA[上周在客户端里增加了一个os.clock对按钮进行控制，防止短时间内连续点击，结果出现了不能点击的情况，后来才知道os.clock可能会返回负数（溢出的情况），需要在获取之后再作处理才能使用。

附上一篇介绍的非常详细的文章：

https://www.jianshu.com/p/46e0d70746cc...]]></description><category></category></item><item><title><![CDATA[赛车类游戏的计时问题]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/82629750</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/82629750</guid><author>monkeycat520</author><pubDate>Tue, 11 Sep 2018 17:47:58 +0800</pubDate><description><![CDATA[最近在线上项目增加了一个赛车类小游戏，三条赛道，除了敌对的物品还有宝箱和buff。昨天开启之后今天就发现了一个严重的刷成绩的问题——玩家将客户端退到后台，过数分钟重新打开游戏，发现已经跑出很长的距离，并且没结束（一般很难跑到这么远的距离），玩家通过这样的方式一直刷游戏一直解释不了。

这个bug出现的原因有两个：一是游戏做了一个后台恢复机制，客户端退到后台之后游戏的定时器都会中止，等到重新打开客户...]]></description><category></category></item><item><title><![CDATA[lua函数之搜寻变量]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/82534423</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/82534423</guid><author>monkeycat520</author><pubDate>Sat, 08 Sep 2018 23:19:50 +0800</pubDate><description><![CDATA[ lua中的每个函数会被lua虚拟机解析保存在FuncState结构体中（一个lua文件本身也会对应一个FuncState结构），每个FuncState有一个prev指针指向它的父函数（最高层是某个lua文件，即全局环境，改层的prev指针为NULL）。

lua的变量分三种类型：全局变量、局部变量和UpValue。

有了以上的认识之后，我们来看看lua函数是怎么获取它需要用到的变量，以一下代码...]]></description><category></category></item><item><title><![CDATA[lua元表实现原理读后感]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/82262364</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/82262364</guid><author>monkeycat520</author><pubDate>Fri, 31 Aug 2018 21:49:16 +0800</pubDate><description><![CDATA[lua虚拟机从一个表中查询数据的过程：

如果查询对象是表，则尝试根据key在表中查询数据，若有则返回结果；若结果为空，且无__index成员，则返回空结果；若结果为空且有__index，则设查询对象为__index，进行下一层深度的查找；
	若查询对象不是表，则尝试获取对象的metatale[&quot;__index&quot;]（usedata可能有此成员），设为查询对象并进行下一层深度的查找；
	逐层深度向下...]]></description><category></category></item><item><title><![CDATA[有违开闭原则的功能实现]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/82109300</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/82109300</guid><author>monkeycat520</author><pubDate>Mon, 27 Aug 2018 11:19:59 +0800</pubDate><description><![CDATA[先简单说说开闭原则的定义：


			开闭原则(Open-Closed Principle, OCP)：一个软件实体应当对扩展开放，对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
			
		上周我实现一个功能扩展时就违反了这条原则，具体是我通过修改部队行军的类型达到自己的扩展需求。在打包前审代码的时候，一老人发现，立马把我添加的代码屏蔽，然后再让我改。

在功能扩展的需求中，策划...]]></description><category></category></item><item><title><![CDATA[带新人上路有感]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/81843630</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/81843630</guid><author>monkeycat520</author><pubDate>Mon, 20 Aug 2018 00:20:09 +0800</pubDate><description><![CDATA[去年就试过在职场带新人，不过和这次带一个零基础的家伙入门，感觉还是很不同。

职场带新人，往往是告知下需要去看哪些模块，搁下一句有什么问题找我，然后继续做自己事情。到了熟悉项目之后试手修bug做小功能，工作流程规范点的，就需要走下审代码和提出修改方向的流程。毕竟大家在同个项目，大家写出来的代码风格一致，遵循某种命名规范，能提高不少看代码的效率和沟通成本。不一一细说。

而带一个零基础的家伙（全过程...]]></description><category></category></item><item><title><![CDATA[虚拟机初认识]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/81843520</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/81843520</guid><author>monkeycat520</author><pubDate>Sun, 19 Aug 2018 23:27:42 +0800</pubDate><description><![CDATA[一般的编译型语言，经过编译后生成的都是与当前硬件环境相匹配的汇编代码；而脚本语言经过编译器处理生成字节码，而后在对应的虚拟机中执行。

每个脚本语言都有自己的一套字节码，与硬件平台无关（差异都由虚拟机解决），实现了跨平台
	字节码不能像汇编代码那样直接有极其执行，所以运行速度相对较慢
虚拟机需要完成的工作：

将源代码编译成虚拟机可以识别执行的字节码
	为函数调用准备调用栈
	内部维持一个指令指针...]]></description><category></category></item><item><title><![CDATA[Mac安装protobuf，并配置python的protobuf扩展包]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/81592905</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/81592905</guid><author>monkeycat520</author><pubDate>Sun, 12 Aug 2018 01:43:32 +0800</pubDate><description><![CDATA[1.下载对应的版本

https://github.com/google/protobuf

2.终端进入下载好的protobuf文件，开始编译

./autogen.sh

./configure

make

make install

此时我们已经编译好protoc

下面是第二步的参考文章，里面有几个步骤的说明：

https://www.cnblogs.com/cyzhou/p/6860...]]></description><category></category></item><item><title><![CDATA[leveldb原理及应用]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/81592526</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/81592526</guid><author>monkeycat520</author><pubDate>Sat, 11 Aug 2018 23:50:30 +0800</pubDate><description><![CDATA[直接上链接：

https://blog.youkuaiyun.com/qq_26499321/article/details/78063856

使用方面，leveldb直接支持C++,python和java，使用其他语言的就要做些额外工作了。

本人用python，直接pip install leveldb，之后就可以用了，非常方便。...]]></description><category></category></item><item><title><![CDATA[《冰气时代》--游戏老鸟体验后有感（剧透慎点）]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/81519026</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/81519026</guid><author>monkeycat520</author><pubDate>Thu, 09 Aug 2018 00:55:06 +0800</pubDate><description><![CDATA[《冰气时代》

一、初体验

说实话好久没玩到一个能让我热血沸腾满身冒汗的游戏了！没有战争，只有满屏的冰雪。

在《这是我的战争》之后，11 bit studios再次把人们推向末日深渊，让我们质问自己——你的底线在哪里？为了生存你是否可以不择手段？

想起我的战争，我试探性地去打扰那对老夫妇，老妇人跪地求饶让我懊恼到不得不回档。这次体验冰气时代我体验一波之后没选择让儿童去工作，出人意料的是可以让...]]></description><category></category></item><item><title><![CDATA[lua表取长度操作]]></title><link>https://blog.youkuaiyun.com/monkeycat520/article/details/81286677</link><guid>https://blog.youkuaiyun.com/monkeycat520/article/details/81286677</guid><author>monkeycat520</author><pubDate>Mon, 30 Jul 2018 16:09:38 +0800</pubDate><description><![CDATA[在5.1上运行这个例子，尝试解释下这里的神奇现象：



30行代码我直接让nil夹在数组的非空值之间，按照lua5.1的手册描述，如果数组有一个“空洞”（夹在非空值之间的nil），那么#t可能是指向任何一个nil值前一个位置的下标。这是因为取长度操作的具体代码，并不会遍历数组的每一个元素，而是跳跃着检查，于是出现不可控的结果。

而31-36行，表a是逐步插入元素的，这涉及lua表的插入元素算法...]]></description><category></category></item></channel></rss>