<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[zhoumf的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/zhoumf</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; zhoumf]]></copyright><item><title><![CDATA[Lua中使用module时踩过的坑]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/148012617</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/148012617</guid><author>zhoumf</author><pubDate>Fri, 16 May 2025 17:34:47 +0800</pubDate><description><![CDATA[在Lua中，使用module或package.seeall定义的模块会创建独立的环境表（_ENV），模块内的“全局变量”实际上存储在该模块的环境表中，而非全局环境_G中。因此，当在一个模块中执行LDataUser = nil时，只会将该模块环境表中的LDataUser置为nil，而不会影响其他模块或全局环境中的同名变量。例如，在A.lua中定义的LDataUser与在B.lua中定义的LDataUser是相互独立的，修改其中一个不会影响另一个。这种机制确保了模块之间的变量隔离，避免了全局变量的污染。]]></description><category></category></item><item><title><![CDATA[VS Code配置Lua调试环境]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/144196683</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/144196683</guid><author>zhoumf</author><pubDate>Mon, 02 Dec 2024 19:54:09 +0800</pubDate><description><![CDATA[如何在VS Code环境下部署EmmyLua调试环境]]></description><category></category></item><item><title><![CDATA[The AssetBundle ‘xxx‘ can‘t be loaded because another AssetBundle with the same]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/108263253</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/108263253</guid><author>zhoumf</author><pubDate>Thu, 27 Aug 2020 16:35:02 +0800</pubDate><description><![CDATA[The AssetBundle 'journeyweekend3_2.asset' can't be loaded because another AssetBundle with the same files is already loaded。

   项目在调用AssetBundle.LoadFromFileAsync接口时报了上面的错误.

   上面这种错误提示，网上很多说法是不同目录下存在同一个assetbundle文件，两个都加载时会报上面的错误，但是我在项目中确...]]></description><category></category></item><item><title><![CDATA[深入浅出垃圾回收算法]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/108047724</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/108047724</guid><author>zhoumf</author><pubDate>Mon, 17 Aug 2020 02:02:40 +0800</pubDate><description><![CDATA[这篇文章介绍几种垃圾回收算法，以使用我们更好的理解内存回收的原理、性能以及优缺点。

术语

为了后面叙述方便，首先明确以下几个名词的含义：

Collector，用于进行垃圾回收的线程
	Mutators，应用程序的线程，可以修改 heap
	MS，mark-sweep 算法的简写
	MC，mark-compact 算法的简写
	RC，reference-counting 的简写
	liveness，一个对象的可到达性
MS 基本流程

首先来回顾下追踪类 GC 最基本的mark-and-sweep ..]]></description><category></category></item><item><title><![CDATA[FlatBuffers学习笔记三——解析二进制流文件]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/106986118</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/106986118</guid><author>zhoumf</author><pubDate>Sat, 27 Jun 2020 18:31:53 +0800</pubDate><description><![CDATA[上一篇文章讲了如何生成二进制流文件，本篇文章来讲一下如何解析FlatBuffers生成的二进制流文件，已达到我们游戏中使用数据的目的。

   其实解析数据是最简单的了，主要代码段如下：


    public static void Decode()
    {
        FileStream fileStream = new FileStream("./Assets/DataFlatBuffer/Monster.bytes", FileMode.Open, FileAcce...]]></description><category></category></item><item><title><![CDATA[FlatBuffers学习笔记二——生成二进制流文件]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/106985184</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/106985184</guid><author>zhoumf</author><pubDate>Sat, 27 Jun 2020 18:21:23 +0800</pubDate><description><![CDATA[很早之前我已经讲了如何生成表格解析代码点这里，本次讲一下如何将表格数据生成二进制流。



一、添加FlatBuffers插件

   如果我们要使用FlatBuffers技术，那么必须向工程中添加FlatBuffers插件，步骤很简单，我们新建一个Unity3D的空工程，然后在Asset目录下新建Plugins文件夹，并且将之前生成的FlatBuffers.dll文件放到此目录下即可。



二、设计数据表格

   我们做开发游戏项目时，经常要为策划设计表格，然后由策划...]]></description><category></category></item><item><title><![CDATA[OpenGL初探-Win10+VS2017+freeglut+glew+gltools开发环境搭建]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/106749136</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/106749136</guid><author>zhoumf</author><pubDate>Sun, 14 Jun 2020 22:32:36 +0800</pubDate><description><![CDATA[最近在研究OpenGL，主要看的书是《OpenGL超级宝典（第5版）》，学习编程自然少不了从环境搭建开始，然后写一个Demo，运行成功即告开篇成功，本篇文章将使用书本中的2.5章节《第一个三角形》的Demo为例进行说明。

一、准备

   学习OpenGL，那么需要事先下载几个库，因为他们是基础库，我们写的有关OpenGL程序都是基于这几个库的API，分别是reeglut、glew、gltools，缺一不可，我在学习的时候没用使用编译好的lib文件，而是下载的源代码，自己编译...]]></description><category></category></item><item><title><![CDATA[游戏开发中常用的两种同步模式：状态同步和帧同步]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/106736017</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/106736017</guid><author>zhoumf</author><pubDate>Sat, 13 Jun 2020 18:10:44 +0800</pubDate><description><![CDATA[一、同步

所谓同步，就是要多个客户端表现效果是一致的，例如我们玩王者荣耀的时候，需要十个玩家的屏幕显示的英雄位置完全相同、技能释放角度、释放时间完全相同，这个就是同步。就好像很多个人一起跳街舞齐舞，每个人的动作都要保持一致。而对于大多数游戏，不仅客户端的表现要一致，而且需要客户端和服务端的数据是一致的。所以，同步是一个网络游戏概念，只有网络游戏才需要同步，而单机游戏是不需要同步的。



二、状态同步和帧同步的区别

最大的区别就是战斗核心逻辑写在哪，状态同步的战斗逻辑在服务端，帧同步的战斗逻辑在客户端.]]></description><category></category></item><item><title><![CDATA[小议C#引用类型对象在循环引用时会不会内存泄漏]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/106151526</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/106151526</guid><author>zhoumf</author><pubDate>Fri, 15 May 2020 23:11:34 +0800</pubDate><description><![CDATA[循环引用指的是A引用了B，而B又引用了A。在写代码的时候，都难免会这样写：地图引用了战斗单位，战斗单位又引用了地图。。

如图：（来源于国外大神的解释）



当A没有再被其他类引用，则A，B，C都应该被垃圾回收。如果判断该对象是否需要被回收的依据是基于引用计数的，那上面代码就会是这样：B被C和A引了，引用计数为2，C被B引了，引用计数为1，这样内存就泄露了。



所以C#的GC并没有用引用计数。GC有一些“根”，对象都挂在上面。从“根”往其子结点进行遍历，就可以标注出哪些对象是被使用的。A对象没有被..]]></description><category></category></item><item><title><![CDATA[Unity里面Resources.Load之后为什么需要Instantiate？]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/106150330</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/106150330</guid><author>zhoumf</author><pubDate>Fri, 15 May 2020 21:58:06 +0800</pubDate><description><![CDATA[一个是加载到内存里，一个是实例化到场景中

   这是unity的一个缺陷，本来一个gameobject加载之后，只需要addToScene就可以了，但它却选择做一次copy，然后在这个操作内附带addToScene。

   它这样做的理由无非是，运行修改物体后，原来资源的那一份不会变化，还可以再次使用。所以就强制每次用必须复制。

然而，gameobject复制其实是一个相当耗时的操作，而且必须占用主线程，成为了一个重要的卡顿点。

   预设(Prefab)是资源...]]></description><category></category></item><item><title><![CDATA[VS Code隐藏Unity工程中meta文件以及将后缀为lua.txt或者lua.bytes识别为lua的方法]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/88982675</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/88982675</guid><author>zhoumf</author><pubDate>Tue, 02 Apr 2019 22:18:38 +0800</pubDate><description><![CDATA[现在我们使用Unity开发手游时，Unity会生成大量的meta文件，以及Unity无法识别后缀为.lua的文件，所以一般将.lua文件再加一个后缀.txt或者.bytes来解决Unity无法识别的问题。编辑lua代码时很多人都喜欢使用VS Code，即微软大名鼎鼎的Visual Studio Code工具，此为很轻量级编辑器，并且提供了大量的插件供程序员使用，非常受程序员的欢迎。
...]]></description><category></category></item><item><title><![CDATA[Unity中GameObject.SetActive函数和Component.enabled属性的区别]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/87978402</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/87978402</guid><author>zhoumf</author><pubDate>Wed, 27 Feb 2019 16:53:23 +0800</pubDate><description><![CDATA[       我们在Unity项目里对某个GameObject进行隐藏时，用gameObject.SetActive(false)可以达到目的，也可以对enabled属性赋值false达到同样的目的，那么这两者究竟有何区别呢，今天我特意写了一个Demo进行了验证。

       为了方便验证，我特意写了一个继承自Image的自定义Class，在主要的生命周期函数里输出Log来进行验证，这里我使用...]]></description><category></category></item><item><title><![CDATA[FlatBuffers学习笔记一——初识FlatBuffers]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/87909786</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/87909786</guid><author>zhoumf</author><pubDate>Mon, 25 Feb 2019 00:30:39 +0800</pubDate><description><![CDATA[一、文件下载

1.下载flatc.exe工具和FlatBuffers源码，链接请点我；
2.用Visual Studio打开源码/net/FlatBuffers/FlatBuffers.csproj项目，编译输出类库文件FlatBuffers.dll；
3.查看官方说明文档请点我；
4.官方C#示例代码可见源码/tests/FlatBuffers.Test工程



二、工具介绍

1....]]></description><category></category></item><item><title><![CDATA[MODEM AT指令全集]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/5069595</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/5069595</guid><author>zhoumf</author><pubDate>Thu, 24 Dec 2009 15:21:00 +0800</pubDate><description><![CDATA[MODEM AT指令全集说明1.基本指令 A/ 重复执行上次指令，主要应用于重拨上次的电话号码。 ＋＋＋跳离（Escape）指令，由数据模式跳到指令模式。  AT 指令 本指令由AT或at开头，在AT之后，字串将决定执行何种指令。  A应答指令 ATA MODEM收到A指令，立即摘机，进入应答状态（Answer Mode）。  Bn 规定 MODEM 操]]></description><category></category></item><item><title><![CDATA[VC窗口启动隐藏时闪烁问题解决方法(原创)]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/5069558</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/5069558</guid><author>zhoumf</author><pubDate>Thu, 24 Dec 2009 15:16:00 +0800</pubDate><description><![CDATA[VC窗口启动隐藏时闪烁问题解决方法(原创)       最近由于项目需要，做了一个VC托盘程序，让该程序在后台执行，当程序启动时我需要将窗口隐藏，但总是在隐藏前会闪烁一下再隐藏，于是我跟踪代码到MFC类库里终于发现问题给解决了。       下面都是针对创建的单文档程序而讲的，因为我创建的是单文档工程，其它的类型工程我没试过，多文档工程应该也可以用下面的方法，好了，开始讲解了。  ]]></description><category></category></item><item><title><![CDATA[vs.net应用程序图标以及制作安装程序快捷方式图标设置]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/3402031</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/3402031</guid><author>zhoumf</author><pubDate>Fri, 28 Nov 2008 13:46:00 +0800</pubDate><description><![CDATA[       我们通常在开发软件完毕后需要打包制作安装程序，这个时侯一般都会需要设置应用程序的图标，使用默认的图标一般都比较难看，那么我们应该怎样设置自定义的图标呢？       我现在要讲的图标设置有两种情况，一种是应用程序界面左上角显示的图标，另一种是安装程序后快捷方式显示的图标，lets go!vs.net环境下应用程序中界面左上角显示的图标设置：             方法]]></description><category></category></item><item><title><![CDATA[vs.net环境如何生成dll和exe文件]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/3401055</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/3401055</guid><author>zhoumf</author><pubDate>Fri, 28 Nov 2008 11:39:00 +0800</pubDate><description><![CDATA[        今天发现一个奇怪的问题，我注意到同是windows应用程序的引用，但是.net环境编译程序之后，有的引用编译后生成的是dll文件(搭档做的模块)，而有的引用编译后生成的是exe文件(我自己做的模块)，我觉得这个应该是可以设置的，带着疑问我请教了我的搭档。        问他之后，果真是可以设置的，略讲如下。       vs.net环境如何生成dll和exe文件的设置：]]></description><category></category></item><item><title><![CDATA[vs.net打包程序时设置自动检测环境并安装.net framwork]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/3401042</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/3401042</guid><author>zhoumf</author><pubDate>Fri, 28 Nov 2008 11:37:00 +0800</pubDate><description><![CDATA[        vs.net打包程序或者制作安装程序时自动检测环境并安装.net framwork的设置方法之前我看过文档也做过，但是过一段时间又忘了，现在终于又找到方法了，还是把这个方法写下来吧，方便自己也方便大家将来查询用。       vs.net打包或者制作安装程序时进行自动检测环境并安装.net framwork的设置方法：            1. 新建一个“安装和部署”的项]]></description><category></category></item><item><title><![CDATA[与DataTable有关的数据导入导出]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/3225394</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/3225394</guid><author>zhoumf</author><pubDate>Wed, 05 Nov 2008 12:40:00 +0800</pubDate><description><![CDATA[         最近的项目要频繁将数据导入导出，有将DataTable中的数据导出为txt或者csv文本文件以及EXCEL文件的，也有将txt或者csv文本文件以及EXCEL文件的数据读取到DataTable中的，在这里我把代码写出来供大家参考谈论一下吧。        将DataTable中的数据导出到文本文件，代码如下：        private void dataTable]]></description><category></category></item><item><title><![CDATA[查询数据库名表名字段名的SQL语句]]></title><link>https://blog.youkuaiyun.com/zhoumf/article/details/3225367</link><guid>https://blog.youkuaiyun.com/zhoumf/article/details/3225367</guid><author>zhoumf</author><pubDate>Wed, 05 Nov 2008 12:34:00 +0800</pubDate><description><![CDATA[ 最近项目需要用到如下知识，自我感觉挺有用的，拿出来晒一晒吧~~~1. C#中获取SQL Server服务器上的所有数据库名称，方法如下：        先连接到master库中，执行 select name from master..sysdatabases 就可以了。        sp_helpdb也可以列出数据名，但不是全部，sp_helpdb是会根据当前用户角色找出相应的]]></description><category></category></item></channel></rss>