C#
narlon
这个作者很懒,什么都没留下…
展开
-
C# Winfrom窗体双缓冲,解决dataGridView卡顿的问题
public FrmSearch() { //设置窗体的双缓冲 this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint, true); this.UpdateStyles(); InitializeComponent().转载 2020-06-03 14:15:03 · 919 阅读 · 0 评论 -
持续集成工具ccnet部署
ccnet一直在用,这次因为系统迁移,重新换了一个环境部署,方向过程还是有点艰辛的,记录下来,供后人参考。拷贝一份老的CruiseControl.NET服务端目录到新的服务器硬盘,或者下载安装CruiseControl.NET-.8.5.0-Setup.exe(可以自行baidu)并安装 修改目录下的ccnet.config,如果有老文件,基本挪过来适配下新项目的盘符路径就行了。没用过的话可...原创 2018-12-12 16:00:43 · 293 阅读 · 0 评论 -
如何实现一个游戏地图编辑器
参与的一个项目,策划使用类似csv的格式进行配置数据填写。csv数据格式相比于excel格式虽然有可以merge,读写简单的优点,但也有不少缺点(不支持公式存储,不支持注释,添加图片等等)。于是,我们觉得需要一个地图编辑器,来协助策划完成数据的填写工作,以提高数据填写的效率和正确率。读书时,接触过一些网游私服的编辑器,但印象最深的还是war3地图编辑器。所以,我的直觉就是是不是可以实现一个...原创 2018-12-26 16:09:47 · 7300 阅读 · 0 评论 -
比较2两个xlsx文件(SVN differ等)
通过乌龟svn看两个excel文件的differ挺痛苦的,一个格子红一个不红的,很不直观。我们的目标是,希望可以和查看TXT文件一样来查看两个excel文件的差异。思路①先把xlsx文件转为csv文件②通过第三方的对比软件展示差异化内容(比如TortoiseMerge.exe)XLSX转CSV这一步通过类库比如EPPLUS或微软的库,都可以做到。我这边使用的EPPLUS...原创 2019-01-25 14:09:39 · 2379 阅读 · 1 评论 -
nlua的基本配置使用
近来想测试服务器增加热更新能力,考虑加入lua热更新。目前鹅厂的xlua也是基于nlua的早期版本开发的,黑历史可以参考(https://www.oschina.net/news/80638/c-net-lua-unity3d)nlua官网(http://nlua.org/)nlua的前身是LuaInterface,2.0.3版后改名为nluaLuaInterface只具有简单的函...原创 2019-01-09 17:01:16 · 8081 阅读 · 0 评论 -
C#使用ENV代替ARG传递进程参数
ARGV参数传递的问题是,参数一旦多了之后,不论是调用方还是程序本身,都会很麻烦(或者说很不直观)。一方面的原因是ARGV是一个数字索引式的参数访问,而不是KEY-VAL索引式的参数访问。于是,我们想到是不是可以使用ENV来代替ARGV传递一些调试参数(或者一些不常用的配置参数)。这在C#里是很容易实现的 static void Main(string[] args)...原创 2019-01-28 14:25:04 · 317 阅读 · 0 评论 -
通过ENV来控制资源文件的读取路径
ENV的读取可以参考之前的文章https://blog.csdn.net/narlon/article/details/86676894在开发过程中,读取资源/配置文件往往很头疼。如果通过args参数传递给程序的话,会有一些缺点。首先,args参数数量如果多了,很容易出错。其次,无法永久绑定一个目录关系,必须每次传args参数(如果读取一个配置文件,那么这个配置文件在哪里,又是一样的问题了)...原创 2019-03-27 11:29:52 · 1010 阅读 · 0 评论 -
C#使用protobuf简述
编译依赖项首先,创建一个C#4.5以上project,因为最新的protobuf依赖于C#5.0的语言特性。然后,我们通过nuget,为项目添加对protobuf的引用,搜索protobuf就可以开始安装了。安装完成后,可以编译一次工程,在bin/debug目录下就可以拿到Google.Protobuf.dll了。然后,我们就可以卸磨杀驴了,在nuget里卸载掉这个安装项(因为,我...原创 2019-04-19 14:25:20 · 1524 阅读 · 0 评论 -
多个游戏进程服务器的管理
多进程VS多线程在之前的文章中,已经提到了目前服务器的主流框架是多进程或者多线程的架构(游戏服务器的中心节点)。多进程服务器可以分布式部署,总体会更加灵活。此外,多进程的情况下,我们可以更加肆无忌惮的使用静态数据;但多线程情况下,静态数据访问要么加锁,要么就只能尽量避免。另外,多进程如果发生异常崩溃等突发情况,不至于整个服务器组玉石俱焚。所以,一般我还是推荐使用多进程的架构。但是多进程...原创 2018-11-02 19:12:48 · 607 阅读 · 0 评论 -
游戏数据表的数据驱动
前言之前博文介绍过了,一种代码导出的工作方式《如何让你的程序加载Excel配置文件》。但这种方式存在一些弊端,比如如果想在运行时替换数据(Reload),就会比较困难(解释执行语言例外)。但在目前的游戏架构中,不论是客户端还是服务器,都强烈的具有这种需求。主要思想此时,我们的思路是,分离类定义和数据本身,类定义必须生成为导出语言的代码,以方便IDE识别。数据导出成自动生成类型可以识别的...原创 2018-11-09 19:25:49 · 674 阅读 · 0 评论 -
C#单例的几种写法
恶汉式单例(鼓励的写法) internal class MonsterManager { private static MonsterManager instance = new MonsterManager(); public static MonsterManager Instance { get { ...原创 2018-09-30 15:19:15 · 423 阅读 · 0 评论 -
ZZ: C# LAZY OBJ说明
“Lazy Instantiation” defers creation of an object till the time it is actually accessed.The process of object creation is always expensive as it involves allocation of memory on the heap.So Lazy Insta...转载 2018-06-20 13:56:36 · 134 阅读 · 0 评论 -
通过C#导出,学习Thrift RPC的工作方式
什么是Thriftthrift最初由facebook开发用做系统内各语言之间的RPC通信 。2007年由facebook贡献到apache基金 ,08年5月进入apache孵化器 。支持多种语言之间的RPC方式的通信:php语言client可以构造一个对象,调用相应的服务方法来调用java语言的服务 ,跨越语言的C/S RPC调用 。thrift的相关下载地址http://thrift.apach...原创 2018-07-05 14:04:33 · 552 阅读 · 0 评论 -
委托的作用和性能讨论delegate
委托绝对算是C#中一个非常重要和新颖的概念。可以直观的理解成一个安全的函数指针。delegate实际是如何工作的呢?delegate int MyDelegate(int x, int y);//生成自动化的类代码如下sealed class MyDelegate : System.MulticastDelegate{ public int Invoke(int x,i...原创 2018-07-29 10:58:03 · 4736 阅读 · 0 评论 -
序列化在游戏开发中的运用
为什么需要序列化?在服务器内部,大部分数据都是以对象的形式存储的,那么如果可以直接发一个对象发送给客户端或是其他进程来完成通信,既会非常直观方便,也不同意出现不一致等问题。序列化和反序列化直观上就完成了对象->字节流以及字节流->对象的转化过程。一般情况下,以下几种情况下,需要用到序列化跨设备/跨进程,比如服务器和客户端之间的通信,服务器组内部的通信服务器和存储进程...原创 2018-08-12 15:08:21 · 549 阅读 · 0 评论 -
服务器热更新的讨论
我们之前的服务器是多进程纯C#架构的服务器。最近游戏上线,遇到有时候需要线上修bug的问题。之前对代码热更新预料不足,导致在线上出了一些bug时非常被动,往往需要重启服务器解决问题,影响前期的体验。我们的游戏类型是一个RPG卡牌游戏,操作偏向于单机向,大量依赖于广播的操作比较少。这周的时间里,也考虑了几种方案,下面对比下思考的结果。嵌入动态脚本首先,C#+python或者lua的游...原创 2018-08-25 19:55:30 · 4500 阅读 · 0 评论 -
关于服务器日志的记录
日志库类似于log4net,log4j这样的日志库功能早已经十分强大,所以类似如果format,如果输出到一个指定的device之类的问题,早就不需要广大程序员思索。所以本章讨论不会涉及这些内容。多进程服务器日志多进程的情况下,如果日志是采用写文件的方式,一般推荐每个进程单独写一个文件(即使log模块可以解决文件句柄竞争问题,也会存在性能损耗)。另一种方式,就是干脆不写文件,直接通过类...原创 2018-09-01 16:11:42 · 3219 阅读 · 0 评论 -
如何封装一个服务器的网络库
为什么需要封装隐藏TCP数据黏连 隐藏TCP参数(超时时间,连接等待时间) 方便支持高级功能(心跳,重连,统计,加密,压缩,错误日志) 让对象关系更加明确(而不是一个Socket打遍天下无敌手)绝对不应该封装的内容序列化,这不应该归网络库来管,很容易把两者耦合起来,设计时必须要考虑 服务器架构网络的代码。比如,服务器组之间的数据通信,用来建立起服务器网络的握手或是服务器组内部的消...原创 2018-09-11 16:28:00 · 393 阅读 · 0 评论 -
游戏服务器架构中的中心节点
议会制 Vs 君主制分布式的服务器架构有点像议会制度,每一个节点都可以参与制定管理策略,进行一部分工作(征税,作战或是处理游戏逻辑,存储)。中心集中式的服务器(比如比较古老的单进程服务器架构),则把所有工作集于一身,自己爱干嘛就干嘛,毫无约束。他们的缺点也很明显,对于议会制,关键时刻谁说了算,会不会出现僵持;对于君主制,君主会不会玩火,万一君主仙逝了,会不会出现黑暗时代。于是,我们发现了一种更...原创 2018-09-25 11:09:59 · 1288 阅读 · 0 评论 -
通过.net core源码看下Dictionary的实现
.net core的代码位置 https://github.com/dotnet/corefx/blob/master/src/Common/src/CoreLib/System/Collections/Generic/Dictionary.csC#中,Dictionary这个数据结构并不是很容易理解,因为看上不去并不像C++的map。底层是如何实现一个字典的并完全可知,因为从数据结构来说,很多结...原创 2018-06-28 10:20:57 · 8285 阅读 · 1 评论