
编程语言
coffeecato
思从深而行从简
展开
-
控制程序的启动数量(限制游戏多开)
引言:在PC端使用软件的过程中,有时开发者会有类似限制程序启动数量的需求,如限制某程序在单一PC端的启动数量,或是为了统计PC端启动的程序数量等,显然需要一种“计数器”来统计程序的运行数量。如何对多个程序进行计数在启动多个程序时,由于程序隶属于不同的进程,常规的计数方法不能使用,那么如何统计程序的启动的数量成为了难题。下面介绍一种常用的方法——使用互斥量:#include "std...原创 2014-11-13 09:50:51 · 7270 阅读 · 3 评论 -
从C#垃圾回收(GC)机制中挖掘性能优化方案
原文地址:从C#垃圾回收(GC)机制中挖掘性能优化方案GC,Garbage Collect,中文意思就是垃圾回收,指的是系统中的内存的分配和回收管理。其对系统性能的影响是不可小觑的。今天就来说一下关于GC优化的东西,这里并不着重说概念和理论,主要说一些实用的东西。关于概念和理论这里只做简单说明,具体的大家可以看微软官方文档。一、什么是GC ...转载 2016-04-25 15:17:34 · 894 阅读 · 0 评论 -
C#中数组、ArrayList和List三者的区别
原文地址:C#中数组、ArrayList和List三者的区别 在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢。数组 数组在C#中最早出现的。在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单。 [csharp] view plain copy//数组 string[] s=new strin...转载 2016-05-09 21:22:24 · 523 阅读 · 0 评论 -
C#中如何判断当前线程是否为主线程
转自:C#中如何判断当前线程是否为主线程/ Do this when you start your applicationstatic int mainThreadId;// In Main method:mainThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;// If called i...转载 2016-11-25 16:44:21 · 11539 阅读 · 1 评论 -
利用out关键字向函数传递List<T>参数遇到的问题
引言今天使用out关键字向函数传递List参数遇到了一点问题,做个记录。之前只是大概了解out关键字就是作为引用传递。遇到的问题今天先写了如下代码:using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1{ class Program原创 2016-12-28 22:35:49 · 3298 阅读 · 0 评论 -
C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)
原文地址:C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)前言 之前对几个没什么理解,只是简单的用过可空类型,也是知道怎么用,至于为什么,还真不太清楚,通过整理本文章学到了很多知识,也许对于以后的各种代码优化都有好处。 本文的重点就是:值类型直接存储其值,引用类型存储对值的引用,值类型存在堆栈上,引用类型存储在托管堆上,值类型转为引用类型叫做转载 2017-01-12 15:35:24 · 463 阅读 · 0 评论 -
C# 中的委托和事件
C# 中的委托和事件原文地址:C# 中的委托和事件C# 中的委托和事件C# 中的委托和事件C# 中的委托和事件C# 中的委托和事件文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错,解决办法是显式的创建一个委转载 2017-02-22 10:50:54 · 1008 阅读 · 2 评论 -
C#之玩转反射
coffeecato写在前面:另一篇文章详解C#中的反射,对于反射的类比非常形象:两个现实中的例子:1、B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况。这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体内发射B型超声波,当超声波遇到内脏壁的时候就会产生一定的“回音”反射,然后把“回音”进行处理就可以显示出内脏的情况了(转载 2017-06-28 16:49:36 · 478 阅读 · 0 评论 -
C#的不安全代码和指针
coffeecato写在前面: 本文来自《果壳中的C# C#5.0权威指南》 第四章 C#高级特性 4.14不安全代码和指针。由于C#中对于指针的使用有诸多不便,翻到了上面这本书,特别介绍了unsafe及fixed关键字的使用。这里做一摘录,方便日后查阅。不安全代码和指针C#支持通过标记为不安全和使用/unsafe编译器选项编译的代码块中的指针直接进行内存操作。指针类型主要用来与C语言API进行互转载 2017-07-07 15:20:20 · 1973 阅读 · 0 评论 -
SVN cleanup 失败的解决方法
Cleanup failed to process the following paths: xxxxxx,database is locked,executing statement 'RELEASE s0'原创 2014-10-09 15:39:30 · 6143 阅读 · 0 评论 -
游戏配置文件加密工具(附源码)
引言:这是开发PC游戏《海战世界》时用到的配置文件加密工具,游戏开发难免要用到配置文件,而其中某些数据开发者并不期望用户获知或是修改,通常会对一些配置文件进行加密。一般是用一个批量的加密工具,统一对配置文件进行加密。考虑到加密、解密的效率及对安全性的需求,选择了最常用的XOR算法,以下是加密工具的源代码:(windows环境下基于XOR算法,带有图形界面的文件批量加密工具)源代码:...原创 2014-12-07 18:52:57 · 3340 阅读 · 0 评论 -
Lua中的三目运算符
0x00 三目运算 熟悉C/C++的老司机都知道三目运算a?b:c,这种写法替换简单的条件判断语句可以在不增加阅读难度的情况下,使代码尽量保持简洁。 int a, b, ret; //if-else if (a > b) ret = a; else ret = b; //三目运算符 ret = a > b ? a : b;原创 2017-08-25 01:20:06 · 17955 阅读 · 4 评论 -
【学习Lua】函数的多重返回值
调用Lua函数时提供的实参数量可以与形参数量不同。Lua会自动调整实参的数量,以匹配参数表的要求。“若实参多余形参,则舍弃多余的实参;若实参不足,则多余的形参初始化为nil”。栗子:function f(a, b) return a,b endlocal a,b = f(3) print(a,b) -- 3 nila,b = f(3,4)print原创 2017-08-16 23:43:41 · 2140 阅读 · 0 评论 -
windows环境下如何区分单击和双击
引言今天在工作中遇到一个需求:要求按下按键A的时候触发事件1,连续按下两次按键A时触发事件2。(同时不触发事件1)如何实现双击?简单的说,要实现双击,只需设置一个最小间隔事件_IntervalTime,当两次按键的时间间隔小于_IntervalTime时,即触发双击事件。实际的使用中往往包含一些别的检测,例如两次点击区域的偏差应该在一个允许的偏差范围之内。(Windows的鼠标事件响应...原创 2015-09-15 22:03:19 · 2920 阅读 · 0 评论 -
Failed to run the WC DB work queue associated with 错误的解决
今天在svn下删除一个文件夹时,出现了"Failed to run the WC DB work queue associated with..."错误,提示我进行clean up,而clean up又提示失败,再次删除,提示clean up。陷入了尴尬的境地,上网查解决方案,发现了两种svn环境下的解决方法:使用命令行版本svn的同学可以看这里:【我的Android进阶之旅】解决...转载 2017-01-16 20:05:15 · 3920 阅读 · 1 评论 -
最全Tortoise SVN Clean up失败的解决方法合集
前言svn又一次出现问题,cleanup 失败,真是一年不出现,出现就要命啊,还记得我上次写文章记录出现的问题还是在2014年,请看SVN cleanup 失败的解决方法。 工作环境工作版本:TortoiseSVN 1.9.4, Build 27285 - 64 Bit , 尝试方法每个人svn的版本不同,工作环境也不同,如果不想重新checkout整个项目,建议大家各...原创 2017-02-14 18:52:55 · 61063 阅读 · 12 评论 -
范型(Generics)学习笔记
0x01引言之前没有研究过C#中的泛型,最近在整理项目代码时发现了一些用法,这里做一个集合整理。0x02object(C# Reference)object是了解泛型绕不过的一个入口,泛型的接口的参数不少都与此相关。下面是翻译MSDN上对泛型的描述:object是.Net中对于Object的别名。在未定义的C#类型系统中,所有类型,预定义,用户定义,引用类型,值类型都是直...原创 2018-09-05 19:58:32 · 527 阅读 · 0 评论 -
Lua中对table进行排序
0x00 table.sort lua的table中实现了table.sort()方法,可以对table进行排序。这种情况适用于直接以table存储的元素为依据进行的排序。local tbl = {1,2,4,5,3}function sortGT(a, b) return a > bendprint('before sort.')print_r(tbl)table.s原创 2018-01-20 23:41:54 · 17095 阅读 · 2 评论 -
矩阵的前世今生
coffeecato写在前面:在游戏开发的过程中总会遇到矩阵相关的问题,而我自从大学《线性代数》蒙混过关之后,就很少再去了解这方面的东西。总对矩阵这东西讳莫如深,搞不懂,却躲不掉。今天在理解矩阵,矩阵背后的现实意义 发现了孟岩前辈于10年前写的文章,一口气读完,连我这种数学渣都能在大脑中对矩阵有了大概的认知。游戏开发,尤其涉及到图形学方面,很多时候不只是公式的堆砌,更多的时候需要理解公式背后的几何转载 2018-01-25 19:43:17 · 1160 阅读 · 0 评论 -
编写高性能的Lua代码
coffeecato写在前面:很多tips都很实用,很容易应用到实际工作当中去。代码写的越多,堆积的技术债就越多,就越有冲动去发掘每一行代码背后的奥义,奈何惰性使然,不能洞悉每一行代码背后的深意,那么就站在前人的肩膀上,写更优美的代码吧!本文是Tim翻译的文章,感谢Tim,当然也感谢Roberto Ierusalimschy.转载 2017-12-07 10:25:05 · 503 阅读 · 0 评论 -
【学习Lua】ipairs函数和pairs函数之间有什么区别?
变长参数(variable number of arguments) Lua函数中传递参数可以使用(…)来表示不确定数量的参数。一个函数要访问变长参数,需要借由{…}形式来访问,此时变长参数被转化为了一个数组。function add(...) local s = 0 for i,v in ipairs{...} do s = s + v end原创 2017-08-21 20:24:11 · 4135 阅读 · 0 评论 -
Lua爬坑手记
0x00 爬坑说明书 最近编写游戏的客户端逻辑,部分以Lua为主,介于使用的Lua的经验尚浅,也就边写边看《Lua程序设计》。书中有些知识点真的是过目即忘,发现Lua还是有一些坑,下面权当作是Lua的爬坑笔记。0x01 Lua的类型 最近一次在处理UGUI中ScrollView控件动态生成的对象时,利用动态生成的对象后缀来作为后续计算的索引。代码类似:function ConvertGameOb原创 2017-09-12 21:33:52 · 948 阅读 · 0 评论 -
LUA简明教程
原文地址:LUA简明教程文章来自:酷 壳 – CoolShellcoffeecato写在前面:最近在学习Lua,看了陈浩大侠的文章还是觉得收益良多,重要的知识点都有提炼出来并加以简单的栗子。本文做一份简明的回顾是一篇很好的材料。只可惜对于Javascript不甚了解,陈浩大侠在文中类比Javascript之处无法感同身受。转载 2017-09-14 18:34:34 · 654 阅读 · 0 评论 -
关于树
最近无意中发现了《啊哈!算法》这本书,读来挺有意思。仅做一些记录。关于树大学时数据结构,接触过一些,后来工作忙着造轮子,疏于回顾最基础的部件,借着这本书,暂且做一小段回顾。定义树是指任意两个结点间有且只有一条路径的无向图。或者说,只要是没有回路的连通无向图就是树。一个结点没有子结点,那么这个结点称为叶结点。一个结点既不是根节点也不是叶节点,则称为内部结点。深度是原创 2016-10-17 23:25:10 · 475 阅读 · 0 评论 -
常见C++内存池技术
原文地址:常见C++内存池技术总结下常见的C++内存池,以备以后查询。应该说没有一个内存池适合所有的情况, 根据不同的需求选择正确的内存池才是正道.(1)最简单的固定大小缓冲池 适用于频繁分配和释放固定大小对象的情况, 关于这个内存池,我这里总结过:一个高效的内存池实现(2)dlmalloc 应该来说相当优秀的内存池, 支持大对象和小对象,并转载 2015-09-17 11:27:26 · 560 阅读 · 0 评论 -
大O表示法算法复杂度速查表(Big-O Algorithm Complexity Cheat Sheet)
(转自:大O表示法算法复杂度速查表(Big-O Algorithm Complexity Cheat Sheet))原文网址:http://bigocheatsheet.com/Word文档下载:http://download.youkuaiyun.com/detail/anshan1984/5583399Searching(搜索算法)转载 2015-09-17 16:01:03 · 7123 阅读 · 0 评论 -
XML文件的编码问题
这两天在项目处理一个解析编码格式为ANSI的xml文件时,遇到了一些问题,现将分析过程总结如下。通过win7自带的记事本或者notepad++创建一个xml文件test_source: coffeecat "测试"可以看到在xml文件的第一行,声明编码格式为utf-16,也就是unicode,使用IE浏览器打开test_source失败,通过Ultra Edit将上述已原创 2014-06-06 00:50:06 · 14312 阅读 · 0 评论 -
字符串指针与字符数组的区别
用字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题:1. 字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。2. 对字符串指针方式char *ps="C Language";转载 2014-03-05 21:58:48 · 907 阅读 · 0 评论 -
不调用库函数,实现自己的strcpy(使用时的注意事项)
#include #include using namespace std;char *strcpy(char *strDest, const char *strSrc){ assert((strDest != NULL) && (strSrc != NULL)); char* address = strDest; while ((*strDest++ = *strSrc++)原创 2014-03-05 21:41:26 · 2018 阅读 · 0 评论 -
写一个函数,将其中的/t都转换成4个空格。(C++版)
很老的一道面试题,网上没有看到正确的C++版本,遂自己写一个。#include #include using namespace std;string ReplaceTab(string& strSrc){ for (size_t i = 0; i < strSrc.size(); ++i) { if (strSrc[i] == '\t') { strSrc.er原创 2014-03-05 15:37:32 · 1911 阅读 · 0 评论 -
函数指针(1)
一旦函数被编译并载入计算机中执行,它就会占用一块内存。这块内存有个地址,因此函数也有地址。因而可以通过指针使用函数地址,就像可以使用变量的地址一样。1.定义一个函数指针 void (*funcPtr()) ();这个函数指针指向一个无参数无返回值的函数。2.使用函数指针#include "iostream"using namespace std;void原创 2013-09-18 09:24:11 · 778 阅读 · 0 评论 -
C/C++程序中致命的内存分配问题
原文:http://blog.youkuaiyun.com/liangbopirates/article/details/8729045你是否曾经这样定义过变量: int a[50]; ?或许你会说,这是一句再普通不过的代码了。那么 int a[1000000]; 呢?int a[512][512]; 呢?用了这么久的VC,直到今天才发现,自己连最基本的东西还没弄清楚。请看下面的这篇文章:转载 2013-09-05 14:36:12 · 996 阅读 · 0 评论 -
char*,const char*和string的相互转换
原文:http://blog.sina.com.cn/s/blog_5436b2f40100pjzz.html好久没写东西啦,发表学术文章一篇,hiahia~近日和小佳子编程时遇到很多转换问题,很麻烦,在网上查了很多资料。为了以后查找方便,特此总结如下。如果有不对的地方或者有更简单的方法,请指出~~1. string转const char* string s = "ab转载 2013-09-05 14:50:29 · 1163 阅读 · 0 评论 -
判断string为空时遇到的小问题
本文仅作记录调试中碰到的一个小问题。string str = "";对于上述定义,在调戏代码时发现一个str在调试时鼠标悬浮的信息str "",而对该变量进行正常的判空时会失败。后来调用了str.size()函数发现str的长度为1,颇为费解。后来通过调用win32的API OutPutDebugString将str的内容打印到调试器中才发现字符串的实际内容。模拟的测试代码如原创 2013-09-04 01:45:13 · 1155 阅读 · 0 评论 -
static函数与普通函数
原文:static函数与普通函数全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的转载 2013-09-10 10:47:30 · 3392 阅读 · 2 评论 -
C++ struct内存分配大小
C++ struct内存分配大小一 原则:1 所有字段在内存中出现顺序与声明顺序一致 (理论上,译器可以随便放置各个字段)2 由于性能原因,大多数编译器实际上会将struct 的各个字段对齐放置在合适的内存边界。具体细节随着语言编译器和CPU的不同而不同。在80X86体系中,符合Intel应用二进制接口(ABI Application Bianry Interface)的编译器会将转载 2013-09-01 18:18:07 · 3136 阅读 · 0 评论 -
如何实现程序的重新启动(windows环境下)
背景:在游戏程序的开发中,经常会碰到这样的情况,运行游戏更新程序后需要重新启动更新程序,在游戏内修改视频等相关设置后需要重新启动游戏程序,这样的操作该如何实现呢?解决方案:一种解决方案是通过等待来启动新的程序,但是这样的实现方式在极端情况下会出现问题,假设某游戏程序每次在一个物理机上只允许启动一个进程,如果关闭旧的进程因为一些原因而造成延迟,那么启动新的进程时会失败,试想游戏更原创 2014-10-22 09:39:32 · 8757 阅读 · 1 评论 -
网络游戏中的(低精度)时间同步
对于网络游戏来说,从物体的移动、攻击到最基础的计时等等,都需要客户端与服务器保持时间的相对一致,那么服务器与客户端同步便是一个必须要解决的问题。通常,网络游戏都会利用心跳来进行同步,那么当客户端并不需要如此精度的同步时,有没有其他方法呢?这里主要讨论低精度的时间同步(精确到秒)。工作中接触过3种简单的时间同步方法:首先,定义时间同步类/// 32位操作系统typedef unsi原创 2014-10-16 21:56:17 · 4403 阅读 · 0 评论 -
如何判断两个日期在一周内
由于原有的方法无法处理两个日期在不同月份的情况,现更新LaTaio的方法如下:// 摘要:// 获取此实例所表示的日期为该月中的第几天。//// 返回结果:// 日组成部分,表示为 1 和 31 之间的一个值。public int Day { get; }这个方法可能更直观,直接贴代码,我是从周一开始算这周的第一天的,所以代码如下:bool IsSameWeek(DateTime b...原创 2014-10-01 21:49:04 · 6156 阅读 · 1 评论 -
BloomFilter基本概念和实现原理
写在转帖前面的话:对bloomFilter最简洁的解读:处理大数据,比如hbase中常常会提到bloom filter 的概念。这个精简的数据结构是干嘛的呢? 他的作用就是判断某个元素是否属于这个集合。方法是:对于集合A ,设置一个m位的位数组b。并给定k个hash函数。 for i in 0...k for elem i转载 2015-09-17 11:05:54 · 822 阅读 · 0 评论