Hi, 我是董大喵👋

我是一名游戏开发者,热爱技术,爱猫人士,但是没机会养,伪二次元。欢迎来到我的博客。

Golang基础篇-竞态

goroutine执行顺序 上一篇说到,goroutine是程序执行过程中的一个独立的单元,当程序中只有一个goroutine时,程序逻辑按照代码的顺序来执行,但是当程序中同时运行多个goroutine时, 逻辑的执行顺序是不确定的,比如下面的例子: func main() { for i := 0; i < 10; i++ { go display(i) } time.Sleep(time.Second) } func display(n int) { fmt.Printf("Number %d First\n", n) fmt.Printf("Number %d Second\n", n) } /*output: Number 9 First Number 6 First Number 5 First Number 5 Second Number 4 First Number 4 Second Number 0 First Number 0 Second Number 9 Second Number 8 First Number 8 Second Number 6 Second Number 3 First Number 3 Second Number 7 First Number 7 Second Number 2 First Number 2 Second Number 1 First Number 1 Second */ 上面的代码中,我们开启了10个goroutine,但是实际运行结果则是不同的goroutine穿插执行。如果这些goroutine之间没有关联,那么穿插执行并不会导致什么问题,但是如果它们之间有关联,比如需要访问同一块内存, 则程序的执行结果可能会依赖各个goroutine的执行顺序,这种情况称之为竞态。 ...

2023-04-03 · 2 min · 228 words · 董大喵

Golang基础篇-goroutine

goroutine goroutine是Golang实现并发的一种手段,在一个Golang程序中,每一个goroutine相当于一个独立的执行单元,这类似于线程,但是并不是线程,而是Golang在语言层面上对线程的一种抽象。 Golang程序执行的时候默认会创建一个goroutine,可以叫他main goroutine。其他的goroutine需要我们通过go func()的形式创建。 这有点类似于一个工厂,工厂里面至少要有一个人员吧,我们称之为老板(main goroutine),当工厂只有老板一个人时,工厂还是可以正常运转的,所有的事情都需要老板亲历亲为呗。当我们在程序中又创建了一个goroutine时,就相当于招聘了一个员工,这样就可以把一些工作分给员工去做。 ...

2022-08-07 · 1 min · 121 words · 董大喵

Golang基础篇-接口

很多编程语言都提供了接口,Golang接口最大的特点是它可以不必显式定义,只要一个类型实现了某个接口定义的所有方法,那它就实现了这个接口。 ...

2022-07-30 · 2 min · 297 words · 董大喵

使用shader实现fillamount效果

使用UGUI的Image可以轻松实现进度条的效果。但是有些情况下我们需要制作针对游戏世界中的物体的进度条,例如人物头顶的HP条,机器旁边的CD条等。常规的做法通过将世界坐标映射到UI,然后使用Image制作这些元素。当游戏世界中的物体 位置改变的时候,需要通知UI去改变相应元素的位置,如果需要考虑摄像机对于进度条的影响,例如摄像机拉远时进度条变小,则会更加麻烦。 这里提供一种使用shader实现进度条的方案。测试环境:Unity 2020.3.32。 ...

2022-06-26 · 2 min · 263 words · 董大喵

Golang基础篇-结构体扩展

结构体扩展允许将多个结构体组合成一个新的结构体,在新的结构体中,允许像访问自己内部成员一样访问内嵌结构体的字段和方法。 ...

2022-06-03 · 1 min · 171 words · 董大喵

Unity协程探究

Unity提供了协程来实现一定程度上的“伪并发”。 众所周知,UnityAPI只能在主线程中调用,如果我们希望通过多线程来实现多个过程的并发处理,那么如果涉及对UnityAPI的操作,则必须转到主线程去执行,比较繁琐。 MonoBehaviour.StartCoroutine可以创建一个协程(Coroutine), 在协程中可以通过yield语句暂停程序执行或者退出协程,从游戏运行的宏观角度看,它们似乎是在并行一样。 ...

2022-05-21 · 2 min · 404 words · 董大喵

Golang基础篇-方法

函数和方法的区别 函数只是一段代码的执行过程,而方法往往会与某个类型的对象绑定。 方法是OOP的概念,在一个方法的实现中,我们可以通过特定方式访问对象的私有变量、方法,例如C类语言的this指针,Python的self等,在方法的调用过程中,对象往往被隐式传递。 ...

2022-05-03 · 2 min · 256 words · 董大喵

Golang基础篇-异常处理

Panic是指程序遇到了(或者由程序主动发起)运行时错误,此时,程序中的函数会立即停止执行,然后执行已经defer过的函数,随后,程序输出错误日志信息,停止运行。 ...

2022-04-30 · 1 min · 131 words · 董大喵

Golang基础篇-defer关键字

defer关键字可以延迟一个函数的执行,直到这个函数返回,无论是正常的return返回,还是由于意外情况。 ...

2022-03-05 · 1 min · 57 words · 董大喵

Golang基础篇-匿名函数

当我们定义一个函数时,例如: func f(){ statements } 这种方式只能用在包一级,称为命名函数。这个过程相当于我们定义了一个常量f,类型为func(),并且其对应我们刚才定义的函数。 但是有些情况下这种函数定义的方式不够灵活,比如我们希望在调用函数时将某个函数作为参数传入,或者在函数返回时希望返回的是一个函数。 ...

2022-02-26 · 1 min · 208 words · 董大喵