网易雷火 游戏服务端 一面面经
概述:4月初投递,4月底做笔试,5月8号一面,感觉答的一般,但是到现在还没有挂也没二面,不过有后续应该也不会再面了,就发一下面经吧,一共50分钟,主要是两部分,以出题的形式考八股,根据实际游戏考察场景题。
面试流程:
1.自我介绍
2.数制和位操作的考察
int a = 00000162; a >> 2;
- 我直接当十进制算,算出个40,面试官提示问我前面的0有没有意义,我说没有(我是傻比)
- 正确答案:0开头表示8进制,右移两位是00000034,十进制输出28
3.虚函数、构造函数和析构函数的考察
struct A{ A() {foo();} virtual ~A() {foo();} virtual void foo() {cout << "1" << endl;} void bar() {foo();} }; struct B : public A { void foo() {cout << "2" << endl;} }; int main() { B b; b.bar(); }
- 一开始只答了bar会输出2,面试官提示看B b这一行,然后看到构造函数,回答会先输出1,然后面试官问还有没,又看到析构函数,一开始回答1,后面又改成了2(脑抽)
- 正确答案:121;子类对象b构造时先调用父类的构造函数,此时子类部分还没生成,所以调用父类的虚函数输出1,然后子类对象b.bar()时调用this->foo(),通过虚机制找到子类的虚函数输出2,最后b析构时先析构子类部分,再调用父类析构函数析构父类部分,此时子类部分已析构,调用父类的虚函数输出1
- 插曲:此处面试官问了下我系统学过C++吗,被狠狠质疑(哭),还好后面的题慢慢开始证明自己了
4.分析下delete this,是否可以这么用
- 析构函数中不能用,因为delete本身有调用析构函数的步骤,会形成死循环
- 普通成员函数中可以使用,使用后对象被释放,之后不能访问this,但是可以继续运行,访问其他的变量
5.32位linux系统上,malloc 5G内存可以吗
- 不行,虚拟内存4G,然后内核空间占用1G,所以最多3G
6.malloc 3G和malloc 10k有什么区别
- 小内存用brk()分配内存到堆上,维护了内存池,释放内存时放到内存池中
- 大内存用mmap()分配到文件映射区,释放内存时真正释放
7.考察内存对齐
// 64位系统,int 4B #include <iostream> using namespace std; struct A { int a; char b; long c; char* d; }; int main() { int a; cout << sizeof(A) << endl; }
- 24;int 4,char 1,long考虑内存对齐,从第8位开始存,char* 指针8位,从16位开始存,所以最终是24
8.游戏开发中,客户端到客户端传递结构体数据需要考虑什么
- 不太会,想到了TCP粘包,然后说要在前面加一个长度表示结构体的长度;提了下大端序或小端序
- chat的答案
- 内存对齐(是否需要传填充的字节,序列化和反序列化)
- 端序
- 不同系统的数据类型、大小、兼容性
9.大端序和小端序是什么
- 大端序是低位地址存高位数据,小端序相反
10.怎么判断自己的电脑是大端序还是小端序
- 一开始答共用体中int转char,观察得到,然后面试官让我现场写,忘记union怎么用了(尴尬,疯狂道歉,实际上和对象使用成员变量一样);然后又说有系统调用可以实现,面试官问是什么原理,就硬扯了下概念
- 实际上很简单,就是int 1转char,检查首位是否为1
bool isLittleEndian() { int num = 1; return (*(char*)&num == 1); }
11.最小堆8 15 10 28 35 16 12,删除堆顶,将堆尾置于堆顶,需要比较几次恢复堆
- 3次:15比10、12比10、12比16
12.开始游戏场景题,平时玩什么游戏
- 王者荣耀(难绷)、饥荒
13.关于游戏开发中的网络同步有了解吗
- 没有了解,询问是否与线程同步有关,面试官表示没到这么细的层面
14.多个玩家对战,需要将攻击数据进行同步,有什么优化的方法,可以从两个人对战开始
- 从这开始被拷打(汗流浃背),开始乱扯回合制采用信号量或锁进行同步非回合制采用乐观锁的思想,先不加锁,如果冲突的话重新处理(反问如何重新处理,崩溃)
15.成千上万人的团战中的技能特效,攻击伤害等等信息量非常大,系统怎么去减少这个同步量
- 合并信息,反问什么能合并什么不能?特效可以合并,攻击不能合并
16.在饥荒的地图上,有很多玩家在各个地方进行战斗,这些信息如何被一个玩家获知
- 主要关注自身附件的场景信息,地图其他地方的信息延迟处理
17.王者荣耀的匹配机制如何设计
- 按段位划分到不同数据结构中保存,在各个数据结构中进行挑选(很草率)
18.linux命令?gdb调试?
- 都不怎么会,用的vscode调试
19.进程崩溃的原因
- 访问无效的内存
- 无限递归造成的栈溢出
- 内存分配超出范围
- 补充:
- 操作系统资源耗尽
- 除零等异常错误
- 空指针、未初始化变量
20.反问
- 游戏开发应该关注学习什么
总结:面试主要是以题目的形式考察八股,然后是结合游戏的场景题,感觉临场发挥不好,题目做的粗心大意,然后游戏场景题完全没了解过,有点答非所问,建议如果想投游戏服务器相关的话提前去了解下游戏场景下的网络同步方法,面试官说这个挺重要的
#我的实习求职记录##软件开发2024笔面经#