【面试偶遇大佬是什么感受】

一句话,那感觉就如青城派掌门(自以为平时还不算菜的人)偶遇扫地僧

项目经历在大佬面前就是渣渣,根本不值一题,那都是些小招式。大佬上来很直接,也很谦逊,今天我们主要探讨两个方向,一是设计模式,二是数据结构。(听到这,估计一半人的心就凉了,还有一半的觉得自己那两把刷子还是能应付一下的)。接下面试正式开始

大佬先问,对市面上引擎(主要是unity和cocos)作个对比,这问题感觉也很常见,我就巴拉巴拉从历史,从能发布的平台,从性能(比较浅的)还有政治原因上做了自以为较完整的对比。结果大佬好像一点也没满意,后来的交谈中,感觉大佬重点是想说,如果引擎不能满足你的功能,你也没有实力去修改,并向官方贡献(这个主要是cocos)。我还停留在消化大神们的东西,确实还没试过有什么贡献,自己觉得平时能看懂shader,看懂大神们自定义的assembler,看懂合批的那些原理。大佬是做引擎出生的,我的层级被大佬踩在了脚底;

前面只是大佬的开味菜,已经让我感觉今天的水有点深。来到了设计模式篇,大佬的第一个问题并不是说说常见的设计模式,却让说设计模式的原则,虽然都是些基础概念,但老码农早已忘光,几乎得了0分。然后讨论你项目中的MVC等使用到的设计模式,这题还好,比较实际,不过我确实主要用了单例和观察者,也不敢再说其他的不太熟的,这题估计也最多得了30/100分。最后大佬讲了一个棋盘黑白子,要让占用的内存最小,用什么模式,我得了0分;
最后是数据结构,主要涉及两,一个是STL源码的东西,一个是装箱与拆箱,估计也回答到20/100分。

总结一下,和大佬同龄,但大佬对技术的热爱,没法比。也许曾经我们都看过《STL源码》《大话设计模式》《OpenGL蓝皮书》等,但我看的时候是为了面试,所以看了留下的东西很离散,大佬是为了提升技术而看,并用到了自己的工作中。所以,今天他是大佬,而我只是一个10几k都没拿下的游民。

最后,致各位和我一样的小老菜鸟,定要掌握好理论基础,并用来指导自己的编码,才能突破。

5赞

要在内存中表示棋盘上的黑白子,并且使得占用的内存最小,你可以使用位图(Bitboard)表示法。位图表示法使用单个位(bit)来表示棋盘上的每个位置,这使得它非常节省空间。

例如,对于一个 8x8 的棋盘(如国际象棋),你可以使用两个 64 位的整数(在许多编程语言中称为 longunsigned long long )来分别表示黑子和白子的位置。每个整数中的每个位对应棋盘上的一个位置,其中位的值为 1 表示该位置有棋子,位的值为 0 表示该位置没有棋子。

这里是一个简化的例子,展示如何使用位图表示法:

// 假设我们使用 C 语言
unsigned long long blackPieces = 0x0000000810000000; // 黑子的位置
unsigned long long whitePieces = 0x0000001008000000; // 白子的位置

// 以上表示的棋盘为(从最高位到最低位,即从棋盘的左上角到右下角):
// 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0
// 0 0 0 0 1 0 0 0
// 0 0 0 0 0 1 0 0
// 0 0 0 0 0 0 0 0

在上面的代码中, blackPieceswhitePieces 分别表示黑子和白子在棋盘上的位置。这种表示法非常紧凑,整个棋盘只需要 16 字节的内存(每个整数 8 字节)。

位图表示法不仅节省内存,还可以利用位操作(如 AND、OR、XOR、NOT、位移等)来快速执行棋盘状态的更新和规则检查。然而,位操作可能不如直观的二维数组操作容易理解和编码,因此在实现时需要更多的注意和经验

哥 可能我没说清楚,不是简单的表明黑白即可,黑白棋子是个对象,复杂的对象。要从设计模式来回答,用到什么模式,可以节约内存

想法挺好,有个问题整数最大的32位也才4个字节,查了一下js统一都是8个字节的是我大意了 :joy:

我觉得重点是把知识运用到实践中。边实践边学习。
拿我自己来说,以前上学时学的各种算法早就忘得一干二净了,设计模式什么的也只是有个名字的概念。
但是我自己在工作过程中主动学了一些shader、渲染、性能优化相关的东西,并且在实践中使用,这方面还是有一些自己的理解的。
开发方面的知识,光靠看是记不住的,只有实践才行。
至于修改引擎,这也是被实际需求倒逼的,实际开发过程中有许多稀奇古怪的需求,光靠引擎给你的那点api很难搞定,这种时候需要积极查看源码。看源码是一件很头痛的事情,需要花很多时间慢慢啃,并且有时候花了大量时间还不一定有实际成效,但是这个能力是成为一名大佬的必备能力。

节约内存的方式 就是放弃复杂的设计模式。 像红白机编魂斗罗那样编程。。。。。

有一种设计模式是为节约内存相关的,可以去了解一下

设计模式是为了让代码更容易维护,迭代、扩展,便于多人合作, 而不是为了节约内存;

[

设计模式之享元模式–共享内存来节省空间

](https://juejin.cn/post/7140080742515605534)

那可以这样回答:
在软件设计中,节约内存是一个重要的考虑因素,尤其是在资源受限的环境(如移动设备或嵌入式系统)中。一些设计模式可以帮助开发者更有效地管理内存使用,从而提高应用程序的性能和效率。以下是几种有助于节约内存的设计模式:

  1. 享元模式 (Flyweight Pattern) : 享元模式通过共享相似对象的方式来减少内存占用。它通常用于管理大量的对象,这些对象有许多共同的不变属性。通过共享这些属性而不是在每个对象中重复存储,可以显著减少内存使用。
  2. 单例模式 (Singleton Pattern) : 单例模式确保一个类只有一个实例,并提供一个全局访问点。这可以避免多个实例的创建和存储,从而节省内存。但是,滥用单例模式可能会导致问题,因为它可能会引入全局状态和测试难题。
  3. 对象池模式 (Object Pool Pattern) : 对象池模式维护一组初始化过的对象池,而不是在每次需要时创建新对象。当对象不再需要时,它们不会被销毁,而是返回到池中以供将来重用。这种方法可以减少对象创建和销毁的开销,尤其是对于创建成本较高的对象。
  4. 原型模式 (Prototype Pattern) : 原型模式通过复制现有对象来创建新对象,而不是通过实例化。这可以用于节省初始化成本和内存,尤其是当对象的创建过程比较复杂或资源密集时。
  5. 懒加载模式 (Lazy Loading Pattern) : 懒加载模式是一种延迟对象初始化的技术,直到实际需要时才创建对象。这可以减少程序启动时的内存占用,并在整个应用程序的生命周期中分散内存分配的压力。
  6. 数据共享模式 : 在某些情况下,可以设计系统以共享数据而不是复制数据。例如,如果多个组件需要相同的数据集,可以让它们共享对单个数据副本的引用,而不是为每个组件创建数据的副本。
  7. 值对象模式 (Value Object Pattern) : 值对象模式涉及使用不可变对象来表示简单的值。因为它们是不可变的,所以可以自由地共享相同的实例,而不必担心被修改,这有助于减少内存使用。

在选择和应用这些设计模式时,应该考虑到应用程序的具体需求和上下文。设计模式的使用应该是为了解决特定问题,而不是作为目标本身。过度优化或不恰当的使用设计模式可能会导致代码复杂度增加,反而降低应用程序的可维护性和可读性。

1赞

大哥,这是chatgpt解答的吗

至于修改引擎或者写shader,因为你工作中的项目涉及不到,自然掌握的不好,这个是没办法的。大佬是专门开发引擎的,所以这方面的能力一定比你强。 但我相信,你开发游戏业务的能力应该比大佬强。

工作中主要要看岗位技能匹配度以及解决实际业务需求问题的能力。

1赞

那肯定的,现在写代码 答问题都要上科技, 科技是未来的趋势~~~

大佬的偏好应该是,对代码质量要求非常高(因为大佬写底层引擎的,对代码,对内存高于普通项目开发层级)。
要是面试能用AI助手,估计大佬也得认输。

感觉大佬不是来面试你的,是来找情绪价值的

说了半天,是哪个大佬啊?

不是的,大佬很诚恳的。确实都是些内功心法,是我没掌握好

大佬应该还得会招人,露了题,就不好再露人了

我觉得大佬的深层次问题,还没出来,只出一招,我都过不了

那问问,大佬说unity和cocos 有啥区别吗? 有几点是怎么个优先级?