20250807游戏服务器开发岗面试题汇总

发布于:2025-08-11 ⋅ 阅读:(18) ⋅ 点赞:(0)

莫名其妙就进面了,在一个睡过了的午后。全程比较懵逼地回答问题,大概率是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以内的怪物,如何能快速选定攻击目标?

核心思路:通过空间索引减少无效计算,步骤如下:

  1. 空间分区:将地图划分为固定大小的网格(如 10m×10m),每个网格存储内部所有怪物的引用。
  2. 定位范围:计算主角位置,确定其所在网格及周围所有 “可能包含 10m 内怪物” 的网格(如以主角为中心,半径 10m 的正方形覆盖的网格)。
  3. 精确筛选:仅遍历这些网格内的怪物,计算每个怪物与主角的实际距离,保留≤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. 如果你所在的团队中有人表现不积极,催他就动不催就不动,你会怎么办?

啊巴拉巴拉

总的来说感觉难度不大,只是自己反应有些太慢了,对问题的敏感度不够。面试官没有给提问的机会,八成是凉了,再接再厉~


网站公告

今日签到

点亮在社区的每一天
去签到