自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

narlon - C#+GameDEV

夏虫不可语于冰

  • 博客(35)
  • 资源 (5)
  • 收藏
  • 关注

原创 richtextbox支持ctrl-v时做格式清除

c#的富文本控件做粘贴时会带着格式进来,这点有时候不是我们想要的。1. keydown事件不靠谱,按的很快的时候不一定触发。2. 默认的黏贴操作无法屏蔽,会出现黏贴两次的情况。我们可以换一个角度思考,就可以取巧的解决这个问题。网上的一些解决方法一般是这样。监控keydown事件。

2023-12-05 13:24:47 381

原创 实现一个简单的DeskTime

最近发现DeskTime是一个不错的app,可以帮助监控自己的时间去哪里了,以及效率值,碎片化等等,有兴趣可以去点点但是这东西需要付费,也没啥技术含量呀。于是想着用C#写一个这里就先讲讲思路。

2023-11-24 11:52:40 369

原创 C# winform 同时支持控件drag和click

方法会捕获鼠标事件并等待拖拽操作完成。有一个简单地思路解决这个问题。

2023-10-27 19:14:10 210 1

转载 lua在vscode下做单元测试

如何在vscode里通过Test Explorer单元测试

2022-12-13 15:37:20 422

原创 grafana+influxdb数据可视化

日常我们会有一些记录历史性能数据并进行分析观察的需求,一般简单地做法是通过日志记录下数据,然后整个文档(高级一点存到db里),后面自己通过工具来维护查看。通过grafana+influxdb其实也可以简单的实现这个需求(轻量级的elk)可以使用http post的方式将数据存储到influxdb中curl -i -XPOST 'http://10.246.47.160:8086/write?db=testDb' --data-binary 'cpu_load_short,host=se

2022-01-05 09:50:16 2736

原创 面向对象的导表程序

不清楚啥是导表,可以参考之前的文档《如何让你的程序加载Excel配置文件》我们之前的思路类似于面向过程,比如先读数据,再处理数据,最后导出数据。那么,在工具功能能够保持单一时,这么做也ok。随着功能迭代,导表工具要接受各种高级特性时,面向过程的逻辑,往往就很受伤。比如,我们需要添加数据差异导表功能,或者需要做不同的数据源和导表先后依赖,或者要改成多线程,或多进程导表?所有的这些优化,都需要动流程或是流程的一部分。于是我们想到能不能使用一种各面向对象的方式来实现这个过程,后期用多态+组件的方式来扩

2022-01-04 17:11:18 262

转载 C# Winfrom窗体双缓冲,解决dataGridView卡顿的问题

public FrmSearch() { //设置窗体的双缓冲 this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint, true); this.UpdateStyles(); InitializeComponent().

2020-06-03 14:15:03 923

原创 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 1529

原创 pickle, flatbuffer与protobuffer对比

测试方法网上的一些性能测试都比较久远了,还是自己动手丰衣足食吧。测试环境python3.7.1 + protobuffer3.7.1 + flatbuffer1.10.0测试方式,对一个样本对象,压缩/解压 1000次。这个对象其实是flatbuffer的官方样例。// Example IDL file for our monster's schema.namespace...

2019-04-16 20:07:44 3067

原创 通过ENV来控制资源文件的读取路径

ENV的读取可以参考之前的文章https://blog.csdn.net/narlon/article/details/86676894在开发过程中,读取资源/配置文件往往很头疼。如果通过args参数传递给程序的话,会有一些缺点。首先,args参数数量如果多了,很容易出错。其次,无法永久绑定一个目录关系,必须每次传args参数(如果读取一个配置文件,那么这个配置文件在哪里,又是一样的问题了)...

2019-03-27 11:29:52 1012

原创 C#使用ENV代替ARG传递进程参数

ARGV参数传递的问题是,参数一旦多了之后,不论是调用方还是程序本身,都会很麻烦(或者说很不直观)。一方面的原因是ARGV是一个数字索引式的参数访问,而不是KEY-VAL索引式的参数访问。于是,我们想到是不是可以使用ENV来代替ARGV传递一些调试参数(或者一些不常用的配置参数)。这在C#里是很容易实现的 static void Main(string[] args)...

2019-01-28 14:25:04 317

原创 比较2两个xlsx文件(SVN differ等)

通过乌龟svn看两个excel文件的differ挺痛苦的,一个格子红一个不红的,很不直观。我们的目标是,希望可以和查看TXT文件一样来查看两个excel文件的差异。思路①先把xlsx文件转为csv文件②通过第三方的对比软件展示差异化内容(比如TortoiseMerge.exe)XLSX转CSV这一步通过类库比如EPPLUS或微软的库,都可以做到。我这边使用的EPPLUS...

2019-01-25 14:09:39 2394 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 8095

原创 如何实现一个游戏地图编辑器

参与的一个项目,策划使用类似csv的格式进行配置数据填写。csv数据格式相比于excel格式虽然有可以merge,读写简单的优点,但也有不少缺点(不支持公式存储,不支持注释,添加图片等等)。于是,我们觉得需要一个地图编辑器,来协助策划完成数据的填写工作,以提高数据填写的效率和正确率。读书时,接触过一些网游私服的编辑器,但印象最深的还是war3地图编辑器。所以,我的直觉就是是不是可以实现一个...

2018-12-26 16:09:47 7304

原创 持续集成工具ccnet部署

ccnet一直在用,这次因为系统迁移,重新换了一个环境部署,方向过程还是有点艰辛的,记录下来,供后人参考。拷贝一份老的CruiseControl.NET服务端目录到新的服务器硬盘,或者下载安装CruiseControl.NET-.8.5.0-Setup.exe(可以自行baidu)并安装 修改目录下的ccnet.config,如果有老文件,基本挪过来适配下新项目的盘符路径就行了。没用过的话可...

2018-12-12 16:00:43 293

原创 Redis的设计感悟

编码,类型和指令Redis有5大基础类型(ROBJ),string,list,hash,set和zset。此外,底层实现有一些基本的数据结构(编码),linkedlist,ziplist,string,hashtable,skiplist。在上层,就是指令,也是和用户交互的指令。用户可以只关心这些指令,而完全不知道数据类型(ROBJ)以及编码(基础结构)的存在。先看下,类型和编码的关系...

2018-11-17 19:56:56 191

原创 游戏数据表的数据驱动

前言之前博文介绍过了,一种代码导出的工作方式《如何让你的程序加载Excel配置文件》。但这种方式存在一些弊端,比如如果想在运行时替换数据(Reload),就会比较困难(解释执行语言例外)。但在目前的游戏架构中,不论是客户端还是服务器,都强烈的具有这种需求。主要思想此时,我们的思路是,分离类定义和数据本身,类定义必须生成为导出语言的代码,以方便IDE识别。数据导出成自动生成类型可以识别的...

2018-11-09 19:25:49 674

原创 多个游戏进程服务器的管理

多进程VS多线程在之前的文章中,已经提到了目前服务器的主流框架是多进程或者多线程的架构(游戏服务器的中心节点)。多进程服务器可以分布式部署,总体会更加灵活。此外,多进程的情况下,我们可以更加肆无忌惮的使用静态数据;但多线程情况下,静态数据访问要么加锁,要么就只能尽量避免。另外,多进程如果发生异常崩溃等突发情况,不至于整个服务器组玉石俱焚。所以,一般我还是推荐使用多进程的架构。但是多进程...

2018-11-02 19:12:48 612

原创 游戏db服务器设计的相关问题

存档的简单历史单机游戏都会把存档以文件的形式保存在本地,于是最早的一片网游也是这么干的,他们把存档以二进制的形式存储为本地的文件。到了21世纪,mysql等开源数据库引擎的性能和安全性逐渐获得认可,于是主流的网游开始以数据库作为媒介存储玩家存档。但当时的用法和用文件存储实际并没有本质的区别,所有的数据会打包存成blob的形式,然后丢给mysql。随着网络游戏的复杂化,这种结构并不能适应新的...

2018-10-27 16:58:13 1198

原创 把组合(树)模式集成到游戏服务器引擎中去!

什么是组合模式?组合模式是一种设计模式,和对象组合的概念是不同的。对象组合是相对于对象派生而言的一种对象间协作的关系。而组合模式是将对象组合成树形结构以表示整体-部分的层次结构,使得用户对单个对象和组合对象的使用更加一致的一种设计模式。( compose objects into tree structures to represent part-whole hierarchies. Comp...

2018-10-21 15:29:50 185

原创 口水游戏主循环和组件

游戏主循环和是否是单机游戏并没有多少关系。因为单机游戏只不过是同时拥有服务器和客户端逻辑。那么客户端主循环和服务端主循环的差别也仅仅是设备的差别,客户端需要支持输入设备的读取,屏幕的渲染(Render);服务端需要支持写日志文件,处理来自客户端的远程访问。对于一个服务端来说,他多的或者说擅长的就是轮询,每秒百亿次的计算可以把所有事情都照顾的妥妥的。那么,在一个无限while循环的帮助下,游戏服...

2018-10-09 16:30:08 285

原创 C#单例的几种写法

恶汉式单例(鼓励的写法) internal class MonsterManager { private static MonsterManager instance = new MonsterManager(); public static MonsterManager Instance { get { ...

2018-09-30 15:19:15 424

原创 游戏服务器架构中的中心节点

议会制 Vs 君主制分布式的服务器架构有点像议会制度,每一个节点都可以参与制定管理策略,进行一部分工作(征税,作战或是处理游戏逻辑,存储)。中心集中式的服务器(比如比较古老的单进程服务器架构),则把所有工作集于一身,自己爱干嘛就干嘛,毫无约束。他们的缺点也很明显,对于议会制,关键时刻谁说了算,会不会出现僵持;对于君主制,君主会不会玩火,万一君主仙逝了,会不会出现黑暗时代。于是,我们发现了一种更...

2018-09-25 11:09:59 1289

原创 如何封装一个服务器的网络库

为什么需要封装隐藏TCP数据黏连 隐藏TCP参数(超时时间,连接等待时间) 方便支持高级功能(心跳,重连,统计,加密,压缩,错误日志) 让对象关系更加明确(而不是一个Socket打遍天下无敌手)绝对不应该封装的内容序列化,这不应该归网络库来管,很容易把两者耦合起来,设计时必须要考虑 服务器架构网络的代码。比如,服务器组之间的数据通信,用来建立起服务器网络的握手或是服务器组内部的消...

2018-09-11 16:28:00 393

原创 关于服务器日志的记录

日志库类似于log4net,log4j这样的日志库功能早已经十分强大,所以类似如果format,如果输出到一个指定的device之类的问题,早就不需要广大程序员思索。所以本章讨论不会涉及这些内容。多进程服务器日志多进程的情况下,如果日志是采用写文件的方式,一般推荐每个进程单独写一个文件(即使log模块可以解决文件句柄竞争问题,也会存在性能损耗)。另一种方式,就是干脆不写文件,直接通过类...

2018-09-01 16:11:42 3222

原创 服务器热更新的讨论

我们之前的服务器是多进程纯C#架构的服务器。最近游戏上线,遇到有时候需要线上修bug的问题。之前对代码热更新预料不足,导致在线上出了一些bug时非常被动,往往需要重启服务器解决问题,影响前期的体验。我们的游戏类型是一个RPG卡牌游戏,操作偏向于单机向,大量依赖于广播的操作比较少。这周的时间里,也考虑了几种方案,下面对比下思考的结果。嵌入动态脚本首先,C#+python或者lua的游...

2018-08-25 19:55:30 4503

原创 db服务器在游戏服务器组中的作用

db(一般是mysql,或是类似的,比如mariadb)在游戏服务器中,启动了数据落地的作用。游戏服务器可以直接和db建立访问连接操作数据,或者通过一个中间人(DbServer)来完成这个工作。本文,我们以独立DbServer来分析带来的好处,以及遇到的问题。下文提到的一些优势,如果不单独封装一个db服务器(通过一个存储模块的方式来实现)也可能可以做到。但如果有一个独立的db服务器时,更容易把...

2018-08-19 09:35:26 3166

原创 序列化在游戏开发中的运用

为什么需要序列化?在服务器内部,大部分数据都是以对象的形式存储的,那么如果可以直接发一个对象发送给客户端或是其他进程来完成通信,既会非常直观方便,也不同意出现不一致等问题。序列化和反序列化直观上就完成了对象->字节流以及字节流->对象的转化过程。一般情况下,以下几种情况下,需要用到序列化跨设备/跨进程,比如服务器和客户端之间的通信,服务器组内部的通信服务器和存储进程...

2018-08-12 15:08:21 550

原创 委托的作用和性能讨论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 4739

原创 浅谈Socket同步io

先说说阻塞式同步IOSocket要实现通信,最简单的函数是Write和Read。而这两个函数在默认时都是阻塞式的。阻塞式的意思就是调用后会挂起线程,直到达成某一个目标才继续执行。这么做的坏处显而易见,服务器没法快速的和对个客户端同时进行通信了(或者说效率暴低)。首先当然可以用异步io的方式,但这不是我们这段讨论的内容,同步解决的办法有这些。Receive使用多路复用的方法(Se...

2018-07-27 20:26:19 1266

原创 浅析HTTPS协议

HTTPS主要解决了哪些问题1、与服务器进行通信使用的是明文,内容可能会被窃听(HTTP协议本身并不具备加密功能,所以无法对请求和响应的内容进行加密)2、使用HTTP协议的服务器与客户端都不会验证通信方的身份,可能遭遇伪装。(所谓不验证通信方身份的意思是,比如说服务端,在服务端接收到请求的时候,只要请求的信息正确,服务器并不会去验证,这个请求是否由其对应的客户端发出。并且,服务器会对请求立即做出一...

2018-07-14 09:52:42 405

原创 通过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 554

原创 通过.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 8289 1

原创 如何让你的程序加载Excel配置文件

游戏公司很多都会把Excel作为游戏数据的配置工具,已经很少有公司会针对性的开发一款地图编辑器。这么做的优点也很明显:技能互通,不需要新的学习过程。excel的功能已经足够强大,便捷程度往往高于一款粗糙的编辑器。先来说说xlsx文件格式xlsx文件实际上是一种压缩文件,在重命名成zip后就可以通过压缩软件打开。有点类似于一个VFS,其中的文本信息,图片都按照一定的目录结构存放。而其中表格的信息被以...

2018-06-20 15:11:26 833

转载 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 135

幻兽传说源代码分享(C#,GDI+卡片游戏)

这是一个完整的游戏。基于.net2.0的winform卡片游戏。自己花业余时间做了2年的时间。包括资源管理,任务流程,技能系统,buff,战斗过程(类似pvz),机器人对战等等。 大家可以借鉴参考。 其中包括30m的图片资源。

2012-09-22

基于STC12C5204的8位AD程序

基于STC12C5204的8位AD程序,调试通过。

2011-05-24

FAT32文件系统的存储机制及其在单片机上的实现

此实例首先在一张空的SD卡(已被格式化为FAT32格式)上创建一个文本文件,并在其中输入20个字符。再将它插入到单片机系统中,实现对这个文件的读取,将文件内容输出在调试终端上。

2011-05-24

XNA入门指南全中文4章

XNA入门指南中文 帮助你了解学习到XNA的一些入门知识

2009-04-09

空空如也

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

TA关注的人

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