当前位置 博文首页 > 为少:探索使用 Golang 和 Webassembly 构建一个多人游戏服务器
什么是 WebAssembly
?由 Google
、Microsoft
、Mozilla
、Apple
等发起的 WebAssembly
是一种新的字节码格式,主流浏览器都已经支持 WebAssembly
。 和 JS
需要解释执行不同,WebAssembly
字节码和底层机器码很相似可快速装载运行,因此性能相对于 JS
解释执行大大提升。WebAssembly
并不是一门编程语言,而是一份字节码标准,需要用高级编程语言编译出字节码放到 WebAssembly
虚拟机中才能运行。
Web
作为发行平台Go
技术知识项目源码:
项目 Status:
Triebwerk
是一个开源的多人游戏服务器Go
语言编写QuakeWorld
推广Updates
) < 每秒帧数(Frames
)限制:
2D
空间中游戏逻辑(Game logic
):Server
-> Client
编译:
GOOS=js GOARCH=wasm go build -o tanks.wasm cmd/wasm/tanks.go
Client:
<script src="/game/wass_exec.js"></script>
<script>
const go = new Go();
WebAssembly.instantiateStreaming(featch("/game/tanks.wass"), go.importObject).then(result => {
go.run(result.instance);
});
</script>
Server:
js.Global().Set("updateNetworkPlayer", js.FuncOf(updateNetworkPlayer))
posX := float32(30.457777)
posY := float32(10.336666)
buf := make([]byte, 8)
binary.LittleEndian.PutUint32(buf[0:], math.Float32bits(posX))
binary.LittleEndian.PutUint32(buf[4:], math.Float32bits(posY))
var uint8Array = js.Global().Get("Uint8Array")
dst := uint8Array.New(len(buf))
js.CopyBytesToJS(dst, buf)
let dv = new DataView(state.buffer)
let posX = dv.getFloat32(0, true)
let posY = dv.getFloat32(4, true)
http://panzr.io
我是为少
微信:uuhells123
公众号:黑客下午茶
加我微信(互相学习交流),关注公众号(获取更多学习资料~)