Java并发编程(多线程)

塞尔达传说荒野之息-0-前言

本文为《JAVA并发编程与塞尔达传说荒野之息》系列文章。转载请注明来自:www.kakashi01.com。如果您觉得本站帮助到你,可以请卡卡西喝一杯咖啡,让卡卡西更有精神写出更多的好文章。如果觉得哪里写的不足的,也欢迎在评论指出!谢谢您来看我的文章!
本文所有代码可以在我的Git仓库上找到


塞尔达传说:荒野之息

简述

很多朋友问我说我做服务器,为啥不多写一些服务器的文章。一来之前确实比较忙,二来服务器其实东西没有客户端容易写,主要在于一些表现客户端比较容易表现出来,而服务器可能更多需要观察数据,以及画各种图示来说明。最近决定还是抽时间出来写一些文章回馈给大家。由于最近在switch上塞尔达玩的也比较多。于是便有了这个系列的文章。

该系列文章会以《塞尔达传说:荒野之息》为例子对多线程的各种知识点进行讲解,《塞尔达传说:荒野之息》是一个开放世界的游戏,它集合了角色扮演,动作和解谜等元素。由于世界之庞大,要处理的逻辑之多,假设开发者为了使得该游戏以后能充分利用多核CPU,使用了多线程。

为什么多线程就能充分利用多核CPU

这个问题,是一个好问题。很多文章都这么说过。但是似乎很少文章解释了为什么。这里简单和大家探讨下。

假如你所有的游戏逻辑在一个线程中运行,那么,你充分利用了CPU的情况下,无非就只能同时使用一个核来处理逻辑。就算你有一个4核的CPU,你的游戏逻辑线程,也只能利用一个核。剩下3个核的利用率并不高。而多线程在这种情况下,就是为了将另外3个核进行充分利用。

假设你的逻辑线程,1帧(假设FPS为30,那么一帧代表1000/30ms)只能处理3000个怪物。而游戏要求我们要能处理6000个怪物。这时候,理论上,如果你的程序支持多线程,那么可以通过第二个线程来处理另外3000个怪物。(毕竟你还有3个核没怎么利用)。

当然多线程程序,并不是简单创建一个线程,就完事了。因为多线程中涉及到太多的同步、协调问题。可以把多线程看成多进程的一个缩影。因此,多进程中的很多思想,在多线程中其实都可以得以借鉴,而多进程中的一些问题,多线程中也可能会有类似的问题。比如你有两个进程同时对Redis的同一个数据进行写操作,那么也会发生数据竞争问题。或者说,你的Redis中有两个关联数据,同时被两个进程读写,那么他们之间可能会丢失关联性保证。

很多人会说,Java不是提供了很多线程安全的集合、原子类、锁等。实现多线程还不简单吗。还是那句话,实现多线程不难,但是实现正确的多线程,需要各种知识,需要对多线程的充分考虑。总之,没有银弹!

About 旗木卡卡西

爱好编程,喜欢游戏。 完整SLG,RPG,ARPG、SIM网络游戏服务器主程序经验。 曾创业2年,担任CTO兼CEO。
View all posts by 旗木卡卡西 →

发表评论

电子邮件地址不会被公开。 必填项已用*标注

8 × = 8