最近想寻求技术层面上的一些突破,首先选择了在网络这一块儿,因为这一块儿是每一个游戏开发者都必须经历且理解的非常重要的一个技术,战术层面上来说就是兵家必争之地。
在网络这一块儿,我以前的一个主程大佬给我推荐了《网络游戏核心技术与实战》这本书,大概看了一下书的目录,由浅入深的讲了网络这一块儿的重要技能点,个人感觉挺不错的,计划花一个月的时间来完成本书的学习,并做此学习记录与心得体会。
首先大概的说一下网络与游戏里面的一些专业术语,仅供小白参考,大神可以忽略。
16毫秒/帧速率(frame rate):电子游戏使用的光栅显示器是普通电视时(就是显示器)图像一般每秒更新60次(即60帧/秒),图像更新的时间叫帧,1秒60帧,即1帧的时间也就大概16毫秒。16毫秒是玩家可以是别的游戏画面(电视节目的画面也是一样)改变的最短时间间隔;
ARPG(action role playing game):动作类角色扮演游戏,也指包含冒险游戏特征的游戏。
Bot:简称就是 外挂 ,哈哈哈,模拟游戏玩家自动访问游戏服务器、高效率的进行游戏、积累分数以及进行恶意的经济欺诈的程序。测试外挂是指开发者准备的用来自动化测试的客户端程序。以前玩盛大的《冒险岛》的时候,就接触过挂机的外挂。
CPU周期(CPU cycle):CPU处理操作的最小单位。1GHZ的CPU1秒有10亿个CPU周期,以执行的命令数而言,1秒可以执行10亿次。根据命令类型的不同,执行需要的CPU周期少则不到1个周期,多则有几百个。
FPS(firs person shooter):第一人称视角游戏,经典游戏就是CS。
I/O(input/output):输入/输出。包括网络I/O、磁盘I/O等。服务器程序的I/O基本上都是网络I/O。
MMO(massively multiplayer online):大型多人网络游戏,也指有大规模用户、多人在线的网络游戏,也叫MMOG。
MO(multiplayer online):多人网络游戏,也叫MOG。
RPC(remote procedure call):远程过程调用,指调用其它计算机的处理,例如,当客户端需要命令服务器做某个处理然后返回结果时会使用该技术。
RPG(role playing game):角色扮演游戏,根据游戏背景设定,由玩家扮演特定角色的游戏。
TCP(transport control protocol):传输控制协议,支撑整个互联网的可靠数据通信协议。可以根据需要续传IP数据包,确保大的数据可以正常传输。但是,在连接速度较慢时,为了提高传输效率需要占用大量的内存。
并行(parallel):包括物理上的多个处理同时进行,以及时间上的并发(concurrent)处理。就像CPU中的命令和任务之间的区别。通过并行处理提高速度比较困难,所以基本方针是充分考虑处理器计算能力,通过在策划层次进行讨论,或者在算法上下功夫减少计算量。
部署(deploy):客户端是指部署应用程序。服务器端是指将最新版服务器程序安装到各个服务器上来更新版本的相关操作。
持久性(persistent):在数据库中,持久性是指需要持久化的时间长度,包括游戏玩法中必要的时间和游戏进行所需时间。竞速游戏的数据一般只需要保持几分钟,之后就可以丢弃,所以持久性较低,需要保存的数据量也比较小。但是MMORPG等不断进行的游戏需要较高持久性,数据量也比较大。根据持久性需求的不同,数据应该以什么形式、用什么物理介质来保存也会有所区别。
带宽(bandwidth):指网络游戏开发中,通过网络传输数据的传输速率。也叫带宽幅度。
多进程编程(multi-process programming):灵活使用多个进程的编程方式。同时运行多个进程可以有效利用多核CPU的处理能力,例如Unity2019.x系列里面的DOTS。
辅助系统(additional system):相对于游戏主体内容以外的辅助功能系统,例如玩家匹配、玩家成绩管理(积分管理)、排名以及通信功能等。多数情况下可以使用第三方的程序库或者服务。
负荷(load):指CPU或者网络等承载的工作量。
负载均衡(load balancing):指分散负荷。例如,将一台数据库承担的负荷分散到多台数据库。
共享内存(shared memory):指在多个进程间共享内存数据。例如共享运动物体的坐标、种类以及运动方向等信息。
缓存(cache):为了高速读取数据而把数据暂时放在特殊区域。该机制被广泛应用在CPU缓存、缓存内存、浏览器缓存以及缓存服务器等地方。
进程(process):进程是指操作系统上运行的程序的实体,和其他程序相分离,独立运行。进程与进程之间可以访问的资源(内存、socket等)也是分离的。
进程间通信(inter-process communication):在多个进程间通信。指多个进程间传送数据或共享数据的技术。
竞态条件(race condition):指同一个资源(内存地址等)被两个以上的使用者访问时发生的程序状态。会引起死锁等问题。
扩展性(scalable):指可以扩展系统性能。在网络游戏中,需要应对用户的增长和饱和,所以希望性能和功能可以轻松扩展。
轮询(polling):定期询问数据是否送达或者是否接收到的机制,太过频繁的轮询会大大地增加CPU的负荷。
瓶颈(bottleneck):系统性能中最弱的部分。系统的其他部分即使再快,如果有一个地方(即瓶颈)处理比较慢,就会影响整体的性能。
冗余(redundancy):指作为预备而重复配置。游戏数据的冗余是指将数据在不同地方重复保存。
事件驱动(event driven):在事件发生时进行处理的编程方式。事件的类型包括接收到的数据、鼠标移动等。事件驱动的编程方式常用在网络开发和游戏开发中。
数据包(packet):数据的传输单位。数据包通信是指将数据分割并添加控制信息后发送、接收后再合并的通信方式。TCP协议的数据通信单位是数据段(segment),UDP/IP协议为数据报(datagram)。网络游戏开发会经常面临数据包延迟的挑战。
数据中心(data center):安置提供服务的服务器设备。配备了维持服务器所必须的电源、空调和防灾措施。
套接字API(socket API):处理网络文件描述符中的套接字的API。
图元(sprite):指电子游戏中使用的可以告诉显示的小图像。
吞吐量(throughput):指系统在一定时间内处理的数量。例如,1秒处理1000次的系统就比100次的系统吞吐量高。
网络拓扑(network topology):网络中所含的各个计算机以什么结构相连接。计算机是节点,连接叫做边界。包括星状结构、总线结构和网状结构等,可以帮助分析和设计网络结构。
文件描述符(file descripter):在unix系的操作系统中,除了文件以外,网络、块设备等操作系统管理的输入输出资源也采用了文件形式。文件描述符是一个整数(C语言中的int 型),操作系统会通过程序分配文件描述符,并使用它来控制数据的输入输出。通过文件描述符,可以让网络的输入输出像文件的输入输出一样进行。
线程(thread):比进程更细分的程序执行单位。共享资源比较多的情况下,线程间的协调比进程更加容易。只使用单一线程执行处理的方法叫单线程(single threading),使用多线程同时进行处理的方法叫多线程(multithreading)。
延迟(latency):处理所需要的时间。
在内存中(on memory):把数据放在内存中,可以在几个CPU时钟周期,也就是几纳秒到几百纳秒之间获取到数据的状态。
中间件(middleware):将应用程序普遍使用的功能进行集成的专业化软件。比如将通信处理成对性能和适应性要求较高的处理做成程序库,并将复杂的处理隐藏起来,通过访问API即可完成复杂的工作。
纵向扩展/横向扩展(scale-up/scale-out):纵向扩展是指增加内存、升级CPU等,通过提升单台服务器的性能来改善系统性能的方法。横向扩展是指通过增加服务器台数来提供系统性能的方法。单台服务器有性能瓶颈,所以大型网络游戏需要具备课可以通过增加服务器数量来横向扩展的性能。
阻塞/非阻塞(blocking/non-blocking):阻塞是指处理完成之前持续等待。也可以叫做同步调用和非同步调用。