莫名其妙就进面了,在一个睡过了的午后。全程比较懵逼地回答问题,大概率是G了,能过再来报喜贴吧。下面是结合豆包给出的答案。
自我介绍
啊巴拉巴拉
从你的项目里找一个你认为最值得介绍的
啊巴拉巴拉
1. 说一下进程、线程和协程
三者关系:一个进程可包含多个线程,一个线程可包含多个协程;进程是资源容器,线程是执行载体,协程是更轻量的执行单元。
- 进程:操作系统资源分配的基本单位,拥有独立的内存空间、文件描述符等资源,进程间切换成本高(需保存 / 恢复整个进程状态)。例如,打开一个浏览器就是一个进程。
- 线程:进程内的执行单元,共享进程的资源(内存、文件句柄等),是 CPU 调度的基本单位,切换成本低于进程(无需切换资源)。例如,浏览器的一个标签页内的渲染、网络请求可由不同线程处理。
- 协程:用户态的轻量级 “线程”,由程序(而非操作系统)控制调度,切换成本极低(无需陷入内核),依赖语言或框架支持(如 Python 的
asyncio
)。适用于 IO 密集型场景(如高频网络请求),可在单线程内实现高并发。
2. 简单说下大段存储和小端存储
- 大端存储(Big-Endian):数据的高位字节存于内存低地址,低位字节存于高地址。例如,整数
0x1234
(二进制00010010 00110100
),大端存储为[0x12, 0x34]
(低地址存高位0x12
)。 - 小端存储(Little-Endian):数据的低位字节存于内存低地址,高位字节存于高地址。同样
0x1234
,小端存储为[0x34, 0x12]
(低地址存低位0x34
)。
3. 在数据和游戏id中,唯一性很重要,请你罗列一些生成唯一性id的方法
1. 数据库自增ID;
2. UUID/GUID(如v1、v4、v5)
3. 雪花算法等时间+机器信息组合ID
4. 哈希+随机数(结合查重)
5. 业务属性组合ID(如服务器ID+时间+序号)
6. 分布式共识生成(如ZooKeeper、Redis自增)
(现在一看好简单,,当时写小程序的时候不就用1、4、5嘛,我却回答什么主键索引还有啥来着,基本跑题)
4.一个游戏地图里放10w个怪物,游戏主角放一个大招命中半径10m以内的怪物,如何能快速选定攻击目标?
核心思路:通过空间索引减少无效计算,步骤如下:
- 空间分区:将地图划分为固定大小的网格(如 10m×10m),每个网格存储内部所有怪物的引用。
- 定位范围:计算主角位置,确定其所在网格及周围所有 “可能包含 10m 内怪物” 的网格(如以主角为中心,半径 10m 的正方形覆盖的网格)。
- 精确筛选:仅遍历这些网格内的怪物,计算每个怪物与主角的实际距离,保留≤10m 的目标。
优势:避免遍历 10w 个怪物,效率提升显著(网格数量远少于怪物数量)。
5. 以扫雷游戏为例,在10*10的网格里放10个类,从概率角度考虑如何保证每个格子成为累的概率相等。
采用无放回随机抽样:
- 将 100 个格子编号为 0-99。
- 生成一个 0-99 的随机序列(如用 Fisher-Yates 洗牌算法),取前 10 个编号对应的格子作为雷的位置。
原理:每个格子被选中的概率均为10/100 = 1/10
,且抽样无放回(避免重复放雷),完全满足 “概率相等”。
6. 写个编程题:给一串数,123817,用中文输出,如,十二万三千八百一十七,最大到百亿:
def num_to_chinese(num):
if num == 0:
return "零"
digits = "零一二三四五六七八九"
units = ["", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千"] # 对应0-11位
s = str(num)
res = []
for i, c in enumerate(s):
pos = len(s) - 1 - i # 位数(从0开始)
digit = int(c)
if digit == 0:
# 跳过连续零,仅在非末尾且前一位非零时加“零”
if res and res[-1] != "零":
res.append("零")
continue
# 处理“十”位的“一”省略(如12→十二,非“一十二”)
if pos == 1 and digit == 1 and i == 0 and len(s) == 2:
res.append(units[pos])
else:
res.append(digits[digit] + units[pos])
# 合并结果,去除末尾可能的“零”
result = "".join(res).rstrip("零")
return result if result else "零"
print(num_to_chinese(123817)) # 输出:十二万三千八百一十七
7. 你认为游戏服务器和其他服务器有什么区别?
维度 | 游戏服务器 | 其他服务器(如 Web 服务器) |
---|---|---|
核心需求 | 高并发、低延迟(实时交互) | 高可用、高吞吐(请求 - 响应) |
状态管理 | 需维护大量实时状态(玩家位置、技能、怪物状态等) | 多为无状态或轻状态(依赖数据库存储) |
逻辑复杂度 | 复杂游戏逻辑(战斗、任务、经济系统等) | 逻辑简单(路由、数据转发、查询等) |
交互模式 | 持续双向通信(如帧同步、状态同步) | 单次请求 - 响应(如 HTTP) |
扩展性要求 | 动态扩缩容(应对玩家峰值) | 静态扩容为主(流量较稳定) |
特殊需求 | 反作弊、断线重连、存档同步等 | 安全防护(如 HTTPS)、缓存优化等 |
8. 如果你所在的团队中有人表现不积极,催他就动不催就不动,你会怎么办?
啊巴拉巴拉
总的来说感觉难度不大,只是自己反应有些太慢了,对问题的敏感度不够。面试官没有给提问的机会,八成是凉了,再接再厉~