在 Golang 游戏leaf系列(一) 概述与示例 (下文简称系列一)中,提到过Go模块用于创建能够被 Leaf 管理的 goroutine.Go模块是对golang中go提供一些额外功能.Go提供回调功能,LinearContext提供顺序调用功能.善用 goroutine 能够充分利用多核资源,Leaf 提供的 Go 机制解决了原生 goroutine 存在的一些问题:
我们来看一个例子(可以在 LeafServer 的模块的 OnInit 方法中测试):
这里主动调用了 d.Cb(-d.ChanCb) ,把这个回调取出来了.实际上,在skeleton.Run里会自己取这个通道
看一下源码:
New方法,会生成指定缓冲长度的ChanCb.然后调用Go方法就是先执行第一个func,然后把第二个放到Cb里.现在手动造一个例子:
现在把time.Sleep(time.Second)的注释解开,会是啥结果呢
另外,就是close时会判断g.pendingGo
这个例子的意思很明显,NewLinearContext这种方式,即使先调用的慢了半秒,它还是会先执行完.
这里先是用了一个list,加入的时候用mutexLinearGo锁了,都加到最后.然后新开协程去处理,读的时候从最前面开始读,也要用mutexLinearGo锁.执行的时候,也要上锁mutexExecution,确保f()执行完并且写入g.ChanCb回调,这个mutexExecution锁才会解除.现在可以改造一个带回调的例子:
服务器是使用golang搭建,一个很简单的WebSocket后台 地址今天这一节
细节看来, 有如下的几个点:
语言, 库
用Golang就忘记继承那套东西, 用组合+接口
用Golang服务器如何保证解决游戏服务器存盘一致性问题? stop the world是肯定的, 但是Golang可以从语言层并发序列化粉丝数据, 再通过后台存盘
channel是goroutine虽然是Golang的语言特性. 但是在编写服务器时, 其实只有底层用的比较多.
Golang的第三方库简直多如牛毛, 好的也很多
不要说模板了, C#的也不好用, 官方在纠结也不要加, 使用中, 没模板确实有点不方便. 用interface{}/反射做泛型对于Golang这种强类型语言来说,还是有点打脸
运行期
Golang和C++比性能的话, 这是C++的优势, Golang因为没虚拟机, 只有薄薄的一层调度层. 所以呢性能是非常高的, 用一点性能牺牲换开发效率, 妥妥的
和其他现代语言一样, 崩溃捕捉是标配功能, 我用Golang的服务器线上跑, 基本没碰到过崩溃情况
热更新: 官方已经有plugin系统的提交, 跨平台的. 估计很快就可以告别手动cgo做so热更新
开发, 调试, 部署, 优化
LiteIDE是我首选的Golang的IDE, 虽然有童鞋说B格不高. 但这估计实在是找不到缺点说了, 别跟我说Visual Studio, 那是宇宙级的...
曾经听说有人不看好Golang, 我问为啥: 说这么新的语言, 不好招人,后面打听到他是个策划... 好吧
Golang自带性能调优工具, 从内存, CPU, 阻塞点等几个方面直接出图进行分析, 非常直观, 可以参考我博客几年前的分析: 使用Golang进行性能分析(Profiling)
Golang支持交叉编译, 跨平台部署, 什么概念? linux是吧? 不问你什么版本, 直接windows上编译输出一个elf, 甩到服务器上开跑.不超过1分钟时间..
以上就是土嘎嘎小编为大家整理的用go语言写小游戏相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!