首页原创精华区最新随笔(rss)

AVEVA PML.Net for DWG

     摘要: AVEVA PML.Net for DWG eryar@163.com Abstract. AVEVA PmlNet allows you to instantiate and invoke methods on .NET objects from PML proxy objects. The PML proxy objects behave just like any other PML obj...  阅读全文

2015-08-01 09:39 作者: eryar【评论:0】【阅读:280】 

定时刷新页面,比如定时拉取你所关注的股票行情

     摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php   $content = file_get_contents('http://www.baidu.com/s?wd=zhongguoyi...  阅读全文

2015-07-29 15:54 作者: 长寿梦【评论:0】【阅读:385】 

基于Golang的游戏服务器框架nucleus开发日记(二)

Actor模型

看官们肯定还有大部分不是很熟悉Actor模型. 我这里基于Erlang, Skynet等语言和框架库来实战型解释下Actor模型. Actor概念

Actor模型和OO类似, 都是符合人的思维模式进行编码. OO里啥都是类, 用类来模拟对象, 解决所有的问题. Actor类似的使用Actor来模拟处理对象和单元

Actor在Erlang中叫进程(非操作系统进程), 在Skynet中叫svc(服务) Mailbox消息队列

每个Actor中包含有一个mailbox, 也就是邮箱. Actor自己只能通过收发mailbox与外界进行沟通, 也就是说, Actor之间只能通过消息进行互相交流, 不能采用其他形式.

mailbox本身是一个顺序队列, 先进先出. 而且mailbox从理论上说没有上限, 实际上呢, mailbox可能会由于不断的消息堆积导致内存上涨. 这都是正常的.

既然mailbox是队列, 也就代表着一个Actor里的逻辑处理是顺序的, 单线程的. 但Actor群体中每个Actor可以独立处理事务. 因此CPU可以分到每个Actor中进行处理,并发的大业也就奠定了基础. Actor的标识: ID

那么, Actor之间的消息要派发, 怎么定位Actor呢? 使用指针?句柄? 都不是的.

Actor定位使用用ID. 每个Actor有全局唯一的ID, 这里不使用GUID, 因为太难定位了, Erlang选择了一种优雅的方式实现ID. 先吃一个栗子:

0.11   1.2   3.5

这就是Erlang的pid(进程id). 点前面的部分代表的是某个独立域, 在这个域中通过序号标示每个进程的id,序号就是小数点后面的部分

那么, 有了ID, 派发消息就变的很简单了, 看栗子

send( 来源id,  目标id, 发送内容)

有来源id的存在, 是为了回发, 或者虚拟来源.  通信自由与部署无关性

有了Actor模型的存在, 逻辑都是分布式编写, 意思就是挂在每个Actor上来编写. 而由于Actor模型之间只有消息通信, 没有函数调用, 指针之类的本地内容. 因此让Actor的部署变的非常自由. 也就是说, Actor的逻辑, 无需关心自己被部署在1个进程, 还是几台机器. 但是为了内部性能和传输效率的考虑. 能不拆进程, 尽量在同一个进程处理, 能不拆到多台机器, 尽量减少拆到多台机器.

但当你确实需要并发时, 只需要轻松的修改下设置或者少量代码, 整个逻辑就可以跑在分布式集群中了

同步和异步

按照Erlang的处理方式, 默认进程(Actor)间使用send发送消息, 这个过程是异步非阻塞的;  当需要同步处理时, 会使用rpc, 也就是使用call的方式进行同步等待, 等对方进程(Actor)收到并处理消息后, 返回结果后, call的调用才结束.

如果call处理中, 其他的Actor给你发消息时, 消息会一直保存在你的Actor的mailbox中, 这里认为mailbox无限大

2015-07-28 16:59 作者: 战魂小筑【评论:0】【阅读:379】 

nginx iocp(3):scm服务控制

     摘要:    为了使nginx支持windows服务,本文阐述以下主要的改进实现。ngx_main函数   为了在SCM服务中复用main函数的逻辑,将其重命名为ngx_main,并添加第3个参数is_scm以兼容控制台运行方式,声明在core/nginx.h中。    Code highligh...  阅读全文

2015-07-27 15:43 作者: 春秋十二月【评论:0】【阅读:416】 

游戏中的随机概率

     摘要: http://huangwei.pro/2015-07/game-random/这段时间公司开发的游戏上线测试,许多玩家在抽卡时抱怨脸黑,很难抽到所需要的卡牌,而又有一部分玩家反应运气好能连着抽到紫卡,检查了下随机相关逻辑代码,并没有找出问题所在,玩家运气好与坏只是觉得真有可能是概率原因。测试开服了几天之后,需要开放某个限时抽卡活动,在内部测试时,我们发现玩家反应的问题在限时抽卡中格外明显,尤其是...  阅读全文

2015-07-27 01:20 作者: 威士忌【评论:2】【阅读:557】 

关于字符集,编码格式,大小端的简单总结

     摘要: Windows为什么不用UTF8,非要搞得和其他平台不一样?  阅读全文

2015-07-25 01:11 作者: Richard Wei【评论:2】【阅读:742】 

基于Golang的游戏服务器框架nucleus开发日记(一)

启程的故事

使用Golang写服务器是一件非常幸福的事情. 不用长时间的等待编译, 零依赖部署. 开发效率高, 多出的时间陪陪家人, 看书充充电多好. 所以Golang就像是手机界的苹果, 从发布后, 瞬间成为了口碑超好的开发语言.

Golang进行服务器开发, 最显耀的就是其并发架构, 能充分榨干每一个CPU. 但是Golang和Erlang不一样, Golang使用了CSP的模型, 而Erlang采用的是Actor模型. 两者区别仅仅只是消息队列归属范围区别而已. 但带来的巨大的框架实现及使用差异让Golang和Erlang阵营里的童鞋们撕逼很久.

其实可以这么理解. Erlang基于Actor模型的并发架构真正是一个框架, 让每一个人用同样的方法处理事情. 而不用更多的担心横向扩展的问题. Golang的CSP并发架构没有很多框框条条. 让开发者自由发挥,设计自己想要的结构. 但碰到需要横向扩展时, 还是需要考验架构人的经验和实力.

所以说, CSP和Actor其实着眼点不一样. 所以还是不能同日而语. 但项目还得做, 问题还得解决. 不能为每一个项目重复设计, 编写重复的代码来应对各种横向扩展的问题. 烦了, 火了, 所以就准备造一个用Golang实现Actor的轮子.

调研了一段时间, 使用Golang做Actor模型的实现并不多. 而且大多是实验性项目, 并没有真正像Skynet一样, 在项目中使用同时做开源的.

说到Skynet, 这是一个极好的开源轻量级游戏服务器框架. 使用lua的coroutine模拟goroutine, 同步+多线程逻辑, 用C底层帮你处理了复杂的Actor模型. 留给上层只是发发消息, 管理下id, 很是惬意. 再加上lua天生动态语言, 模拟Erlang的动态更新更不是啥大问题. 因此在服务器界, Skynet变的有名了起来.

既然要做轮子, 我果断选择不关门. 讨论群都开了, 博客一直更新, github也有, 为啥不搞开源轮子呢? 因此这次的服务器框架计划定位于开源. 目的是为Golang贡献一款轻量级的游戏服务器框架, 由大家支持, 供大众使用.

开发代号已经选好, 就叫nucleus. 含义: 原子核

 

啥? 问地址? 先占坑, nucleus已经在开发中, 原型好了后会及时传到我的github上并及时更新到这个系列

2015-07-23 13:21 作者: 战魂小筑【评论:1】【阅读:666】 

OpenGL Shader in OpenCASCADE

     摘要: OpenGL Shader in OpenCASCADE eryar@163.com Abstract. As implementation of one of the strategic steps in OpenCASCADE visualization component development road-map, support for GLSL shader programs has b...  阅读全文

2015-07-22 23:12 作者: eryar【评论:0】【阅读:350】 

A Simple OpenGL Shader Example II

     摘要: A Simple OpenGL Shader Example II eryar@163.com Abstract. The OpenGL Shading Language syntax comes from the C family of programming languages. Tokes, identifiers, semicolons, nesting with curly braces...  阅读全文

2015-07-21 22:56 作者: eryar【评论:0】【阅读:236】 

大服务器架构讨论

最近参加了一个大服务器架构讨论活动, 记录下心得 概述

游戏客户端采用Cocos2dx-Lua的纯Lua编写逻辑, 服务器采用Golang作为开发语言

游戏类型类似于COC,因此无需选服. 需要使用大服务器架构进行处理 数据库

采用Mongodb做持久存储, redis做跨服通信数据交换

使用UCloud的云技术, 省去了烦人的运维工作 通信及协议

客户端和服务器通讯使用HTTP短连接, 基于json的数据封包协议

服务器间大量使用Golang自带的json+rpc进行通信 服务器类型

服务器类型大致分为逻辑服务器,战斗服务器, 中心服务器 逻辑服务器

逻辑服务器负责日常逻辑及公共逻辑处理(好友, 公会)

1个逻辑服务器对应一个区, n个区均使用Ucloud云Mongodb进行数据存储 战斗服务器

战斗服务器是一个集群, 集群会返回一个负载最低的服务器返回使用

战斗服务器通过cgo技术与客户端C++/lua的战斗逻辑进行逻辑复用, 在此技术上进行

战斗逻辑的校验 中心服务器

客户端登陆前, 在中心服务器这里获得可登陆的逻辑服务器地址, 同时做一个负载均衡

短连接 评价

由于操作系统的技术趋于稳定, 同时, 手游的弱交互型导致的游戏架构趋于简单. 因此网络负载不再是游戏服务器技术的瓶颈. 从经验看来, 游戏服务器技术, 更重要的是还是看数据库的选型及处理方式. 

虽然Mongodb的性能上不如内存数据库. 但是从存储安全性上要比个人搭建的内存数据库简单, 安全

外加上云技术的引用, 性能的瓶颈和运维的技术复杂度迎刃而解

Redis用于跨服数据交互那是再好不过的数据中介了, 保证速度和稳定性, 绝对不是造轮子能比拟的

短连接在手游上处理起来比长连接简单一些, 无需做断线重连. 服务器的底层也是由Golang的框架库保证质量的. 因此负载毫无问题. 服务器对内及对外均使用json进行数据交换, 简化了协议处理. 也方便了调试

json rpc的性能损耗对于整个逻辑的处理来说均可以忽略不计

2015-07-21 10:30 作者: 战魂小筑【评论:4】【阅读:767】 

深入UEFI内核(一)ResetVector

     摘要: 介绍UEFI系统从加电到CPU执行第一条指令的过程,并且介绍系统UEFI ROM的组成,.fdf文件的格式  阅读全文

2015-07-12 10:17 作者: djx_zh【评论:2】【阅读:919】 

Make Helix Curve in OpenCASCADE

     摘要: Make Helix Curve in OpenCASCADE eryar@163.com Abstract. OpenCASCADE does not provide helix curve directly, but you can build a helix curve by the pcurve of a surface(curve on surface). When you unders...  阅读全文

2015-07-09 21:52 作者: eryar【评论:2】【阅读:535】 

使用thrift实现订阅服务和发布服务

     摘要: 服务:订阅服务 market_subscriber 和 发布服务 market_publisher功能:market_subscriber 能够向 market_publisher 请求订阅某些类型的消息,当 market_publisher 有该类型的消息时,需要把它推送给订阅服务。流程:1. market_publisher 服务启动,监听端口,注册事件处理函数,处理订阅请...  阅读全文

2015-07-07 17:57 作者: kongkongzi【评论:1】【阅读:583】 

一个诡异的Unity3D的网络问题

     摘要: 项目中, 我们使用Unity3D做客户端开发. 自己撸了一套C#网络库, 随着项目的推进, 问题来了: 问题 每次Unity3D编辑器打开时, 连接服务器都会有一定几率失败, 需要反复关闭再打开编辑器3~4次后, 才能正常接收到封包 转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy 探索 我们的网络库基于C#的Begin/End系的异步Socket, 这种so...  阅读全文

2015-07-06 16:11 作者: 战魂小筑【评论:3】【阅读:710】 

Windows 8.1 Visual Studio 2013 编译Apache thrift访问Apache Hbase

     摘要: Windows 8.1 Visual Studio 2013 编译Apache thrift访问Apache Hbase  阅读全文

2015-07-05 00:41 作者: 盛源博【评论:0】【阅读:614】 

A Simple OpenGL Shader Example

     摘要: A Simple OpenGL Shader Example eryar@163.com Abstract. OpenGL Shading Language, the high-level programming language defined to allow application writers to write programs that execute on the programma...  阅读全文

2015-06-27 21:38 作者: eryar【评论:0】【阅读:838】 

nginx iocp(2):udp异步接收

     摘要:    nginx的域名解析器使用已连接udp(收发前先调用ngx_udp_connect)发送dns查询、接收dns响应,如上篇tcp异步连接所讲,iocp需要先投递udp的接收操作,才能引发接收完成的事件,因此要对域名解析器和udp异步接收作些改进。 发送后投递     dns查询由ngx_resolver_send_query函数实现,...  阅读全文

2015-06-25 17:01 作者: 春秋十二月【评论:0】【阅读:917】 

nginx iocp(1):tcp异步连接

     摘要:    iocp是Windows NT操作系统的一种高效IO模型,对应于Linux中的epoll和FreeBSD中的kqueue,nginx对ske(select、kqueue和epoll的首写字母组合)的支持很好,但截止到1.6.2版本,还不支持iocp。由于ske都是反应器模式,即先注册IO事件,当IO事件发生(读写通知)时,在其回调内主动调用API来读或写数据;而...  阅读全文

2015-06-24 17:02 作者: 春秋十二月【评论:1】【阅读:1098】 

Unity3d 动态批处理的问题

   这段时间做unity3d的优化,主要的入手是减少draw call。
    1、代码上主要是把一些零碎的同材质的合并成一个大的mesh。
    2、减少不必要的全屏后期处理。把摄像机的rendering path,由deferred修改为forward。这样修改的原因是,我们场景中只是使用了一个灯光,延迟渲染并没有很有发挥其优势,另外使用向前渲染的话,引擎的动态合并会有很好的作用。
     经过上面两部分的操作,draw call 减少的非常多,并且游戏在目标平台上也能流畅的运行。但是发现一个非常明显的问题: 在两个物体紧紧挨着的边缘会明显的有裂痕在闪烁,比如一个赛段拼接另一个赛段的连接处。
    一开始以为是depth buffer 的精度问题导致的 depth fighting。所以调整了摄像机的near clip,但也还是会出现,只是调整near clip也有限制,否则会影响游戏,在调整near clip和把抗锯齿anti aliasing设置调整4* 或8* 裂缝的闪现会没那么明显,但是同样存在。想使用w buffer 来代替depth buffer来试下,但是无奈不清楚unity怎么处理,(当时想,如果最后没办法就程序把连接的网格自己合并,这样就不会出现裂缝了)所以先停下做其他的了。后来想到之前这种裂缝现象怎么没注意到呢,至少是不明显的。所以觉得会不会是rendering path,不同导致的呢。
    分别build两个程序,使用不同的rendering path。确实是使用延迟渲染的不会有裂缝闪现的现象,而向前渲染会有,这真是使人摸不着头脑呀,两种不同的渲染方式 怎么会出现这样的情况呢?还是不相信是由于不同的渲染方式导致的,继续找原因,发现两个有裂缝闪现的mesh,是用的相同材质,想到会不会是动态批处理的原因呢?   
    使用向前渲染时在play setting中去掉Dynamic batching 裂缝闪烁的现象就不会出现了,最终确定是引擎提供的动态批处理导致的问题。那为什么用延迟渲染时没呢,那是因为用延迟渲染的话,引擎对动态批处理很有限,(你在4.x版本的unity上,每添加一个cube,就要增加两个draw call,而向前渲染的话,会帮你动态批处理,并不会每个cube都增加draw call)。
    知道问题所在,修改也比较容易了,但是为什么其Dynamic batching 会导致裂缝闪烁,这个问题还是有待研究,但是unity内部是如何实现的不知道。希望了解这方面的人能指点一二!

2015-06-23 22:10 作者: 木华【评论:0】【阅读:692】 

一个启动服务的SHELL脚本

     摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->#!/bin/bash#zhangtaoPROCESS_NAME="msgdbgate"LOG_FILE="run.log"PID_FILE="$PROCESS_NAME.pid"BASE_DIR=""R...  阅读全文

2015-06-19 18:48 作者: 长寿梦【评论:0】【阅读:990】 

游戏数据库选型mysql,mongo, redis, memcached

     摘要: 数据库选择历程 我们的项目一直使用MySQL作为数据库. 无论是从C++的服务器, 还是到Golang服务器. 当年搞服务器时, 看大部分人都是用SQL(MySQL/SQLServer), 而Mongo感觉像邪教一样, 再加上服务器还是Linux比较正统, 所以果断选了MySQL. 刚开始感觉,游戏服务器的数据存储其实应该是蛮神圣的过程. 那么多的数据, 需要按照MySQL一样分表, 分字段存储,...  阅读全文

2015-06-19 16:23 作者: 战魂小筑【评论:5】【阅读:1040】 

Isodraft output attributes

     摘要: Isodraft output attributes eryar@163.com AVEVA Isodraft中有许多开关用于配置管道ISO图的图面内容,这些配置都可以从文档《Isodraft Reference Manual》中找到。如有需要在管件上标出管底标高,如何在Isodraft中配置呢? 经过查找,发现Isodraft中有这个选项:OUTCOM,可以将管件指定的属性(也可以是自定义属性U...  阅读全文

2015-06-15 21:55 作者: eryar【评论:8】【阅读:822】 

为什么QMdiArea::activeSubWindow返回null

     摘要: 为什么QMdiArea::activeSubWindow返回null  阅读全文

2015-06-13 20:06 作者: 力为【评论:0】【阅读:1089】 

swift 去除String首尾的空格,以及指定字符串

     摘要: @import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); 直接给一段调用实例:@import url(http://www.cppblog.com/CuteSoft_...  阅读全文

2015-06-11 17:22 作者: 何清龙【评论:0】【阅读:1249】 

正确理解shadowmap的实现方式

     摘要: 首先确定阴影的最基本原理:
阴影是以光源作为摄像机(叫作Camera_light),光照方向作为摄像机的look的方向,然后把这个摄像机看到的场景物渲染到纹理,这个纹理就叫shadowmap。  阅读全文

2015-06-10 20:44 作者: 狂烂球【评论:1】【阅读:837】 

git服务器简易搭建法

受尽svn各种折磨的小伙伴都听说过git. 但是网上一搜索, 本来打算跟svn一样. 下一个服务器, 装下就可以开始用了.

没想到啊, 没想到. 居然需要Linux天赋点…

好吧, 拜鸟哥门下把Linux上手了吧, 刚开始搭git, 靠. 又需要公钥和各种辅助软件.

伤不起啊

很多小伙伴们, 自此继续沉默的继续使用svn

我们没有放弃, 我们找到了简(shan)易(zhai)搭建法

 

先看疗效:

1. 无需公钥

2. 只需要几个最常用的Linux命令就可以搭建

 

看步骤

1. 准备Linux服务器, 安装好git(一般都是默认装好的)

2. 命令行操作

useradd git   #创建一个git账号

passwd git    #设置git账号的密码

su – git    #切换到git账号

cd ~  #转到用户目录

mkdir 项目名称.git   #建立项目git文件夹

cd 项目名称.git

git –-bare –share init   #初始化git库

 

3. 马上拿起你的git客户端( 乌龟, SourceTree均可)输入这样格式的地址git@ip:/path/to/project.git

例如: git@192.168.1.2:/home/git/YourProject.git

git pull时, 需要输入密码, 就输入上面创建好的git账号的密码就可以

开始使用吧!

 

Tips

这种方法搭建的git服务器仅限于小团队和对贡献代码不敏感的项目而生

git本身的公钥是为了防止别人伪造用户名进行虚假提交. 但这个方法绕开了这点

想开新的git库时, 切记使用git账号去重复以上步骤, 若使用root级别账号创建的文件夹使用客户端时会遇到权限不足的提示

2015-06-10 14:53 作者: 战魂小筑【评论:0】【阅读:1157】 

[Unity3D]一个简单的魔方Demo

     摘要: 前段时间无意间看到一个魔方的Demo,正好那时对魔方也挺感兴趣,也就抽时间自己模仿了一个。  阅读全文

2015-06-07 12:15 作者: AZL【评论:5】【阅读:1494】 

我的Golang全接触

     摘要: 满打满算, 从好友推荐Golang至发文时, 使用Golang已经有1年多了. 这种时间对于C/C++ Java这些老者来说, 简直是菜鸟级别的经验 但作为新生代语言的特点就是实战. Golang这一年里, 已经为项目提供了稳定的服务器和强大的扩展能力, 与客户端的Unity3D里的C#一样, 都是强大, 极致开发效率代表的优秀开发语言. 用途篇 Golang到底拿来做啥? 我需要么? 高效(性...  阅读全文

2015-06-04 17:19 作者: 战魂小筑【评论:0】【阅读:1460】 

Web API

     摘要: Web API简要介绍  阅读全文

2015-05-31 14:17 作者: 【评论:0】【阅读:1293】 

nginx-openresty-windows 改造支持,提升性能,开源

     摘要:   阅读全文

2015-05-22 13:45 作者: 蔡东赟【评论:6】【阅读:1553】 

技 术 改 变 世 界

网站分类

24小时内最热随笔

统计信息

聚合

Blog客户端API

推荐客户端

博客排行榜[前100人]