当前位置: 首页 > news >正文

秋招笔记-10.7

C++

关于无符号数与有符号数:

当有符号数和无符号数进行运算时,计算机底层并不会区分它们的符号属性,而是将它们都视为纯粹的二进制位序列,并采用同一套基于补码的加法进行处理。具体来说,减法运算会被转换为加法操作,即 a - b会转化为 a + (-b),其中 -bb的补码(通过“按位取反,末位加一”得到)。计算完成后,硬件会丢弃最高位产生的进位,只保留固定位数的结果。这个相同的二进制结果,随后会根据程序中所用变量的类型,被解释为有符号数或无符号数。例如,二进制结果 11111111若被当作有符号数解释则是 -1,若被当作无符号数解释则是 255。需要注意的是,在C语言等环境中,当有符号数与无符号数混合运算时,编译器通常会隐式地将有符号数转换为无符号数,这可能导致某些反直觉的结果,比如 -1 > 0U会成立。

当需要在不同位宽的整数类型之间进行转换时,处理规则取决于转换方向。当将一个小位宽的类型(如16位的 short)转换为大位宽的类型(如32位的 int)时,系统会进行位扩展。对于无符号数,采用零扩展,即在原始二进制位的高位全部补0;对于有符号数,则采用符号扩展,即在原始二进制位的高位全部填充原数的符号位(正数补0,负数补1),以确保扩展后的数值保持不变。反之,当将一个大位宽的类型转换为小位宽的类型时,不论原类型是有符号还是无符号,都会直接截断高位字节,只保留低位字节,然后按照目标类型的新宽度和符号属性重新解释这些位。这很可能导致数值改变或溢出。

静态成员函数可以调用虚函数吗?

静态成员函数不能直接调用虚函数,但可以通过获得一个对象实例的指针或引用来间接调用,并且此时虚函数的多态机制会正常生效​。

其根本原因在于,静态成员函数属于类本身,在调用时没有隐含的 this指针。而虚函数的多态机制(动态绑定)恰恰依赖于 this指针来找到对象所属类的虚函数表,从而确定具体调用哪个函数实现。因此,如果直接在静态成员函数中写 virtualFunc();这样的代码,编译器将无法确定这个 virtualFunc应该属于哪个对象,从而导致编译错误。然而,如果静态成员函数通过参数等方式获得了一个具体对象的指针或引用,那么通过这个指针或引用调用虚函数是完全可行的,并且会表现出多态行为。

class Base {
public:virtual void show() { cout << "Base\n"; }static void staticCall(Base* ptr) {if (ptr) {ptr->show(); // 通过指针间接调用虚函数,多态生效}}
};class Derived : public Base {
public:virtual void show() override { cout << "Derived\n"; }
};int main() {Base base_obj;Derived derived_obj;Base::staticCall(&base_obj);  // 输出 "Base"Base::staticCall(&derived_obj); // 输出 "Derived",多态生效return 0;
}

在上面的例子中,staticCall作为一个静态成员函数,通过传入的 Base* ptr指针调用了虚函数 show()。由于 show()是虚函数,并且通过基类指针调用,所以满足了多态的条件,最终调用哪个版本的 show()取决于 ptr实际指向的对象类型。

一言以蔽之:在静态成员函数中调用虚函数,关键在于必须通过传入的对象指针或引用,而不是直接调用。​​ 这样,虚函数的多态机制就能正常运作。

C++中三种智能指针的具体使用方法?

#include <iostream>
#include <memory>class MyClass {
public:MyClass(int v) : value(v) {}int value;
};int main() {// 1. unique_ptr: 独占所有权std::unique_ptr<MyClass> uPtr = std::make_unique<MyClass>(10);// std::unique_ptr<MyClass> uPtr2 = uPtr; // 错误!无法复制,独占所有权// 2. shared_ptr: 共享所有权std::shared_ptr<MyClass> sPtr1 = std::make_shared<MyClass>(20);std::shared_ptr<MyClass> sPtr2 = sPtr1; // 正确!共享所有权,引用计数+1std::cout << "引用计数: " << sPtr1.use_count() << std::endl; // 输出 2// 3. weak_ptr: 弱引用(不增加引用计数)std::weak_ptr<MyClass> wPtr = sPtr1;std::cout << "弱引用后,引用计数仍为: " << sPtr1.use_count() << std::endl; // 输出 2// 使用weak_ptr前,必须用lock()获取一个可用的shared_ptrif (auto tempPtr = wPtr.lock()) {std::cout << "通过weak_ptr访问值: " << tempPtr->value << std::endl;} else {std::cout << "对象已被销毁" << std::endl;}return 0;// 退出作用域时:// uPtr 自动删除其管理的 MyClass 对象。// sPtr1 和 sPtr2 被销毁,引用计数归零,其管理的 MyClass 对象被自动删除。
}

三种智能指针的区别:

关于extern关键字:

在 C++ 中,函数默认具有外部链接性。这意味着,只要在一个源文件(.cpp)中定义了函数,在其他任何源文件中,你只需要包含它的声明(通常通过头文件实现),就可以直接调用它 。

全局变量虽然也默认具有外部链接属性,但它的使用规则比函数严格。关键在于 C++ 的单定义规则​:一个全局变量在整個程序中只能有一个定义​ 。全局变量则需要通过 ​extern关键字来明确“声明”​,以表明它只是对某个唯一定义的引用,从而避免违反单定义规则。

关于const_cast:不可以用const_cast修饰指向常量的指针或者引用,而只能用于本身并不是常量然后使用常量指针或者引用指向的对象,const_cast的作用是可以修改这个指针或者引用的属性。

什么是BVH?

在计算机图形学中,​BVH(Bounding Volume Hierarchy,层次包围盒)​​ 是一种用于加速空间查询​(如光线追踪或碰撞检测)的树形数据结构。其核心思想是通过递归地用简单的几何体(如轴对齐包围盒-AABB)包裹场景中的复杂物体或物体组,形成层次结构;当进行查询时,算法可快速排除与查询范围(如光线)不相交的整个分支,从而将计算复杂度从 O(n) 大幅降低至 O(log n),显著提升性能。

如何理解菲涅尔效应?在渲染中有哪些具体的应用场景?

菲涅尔效应的核心规律是:​视线与物体表面法线的夹角越大(即越接近平行于表面观察),反射现象就越明显​ 。

其主要应用场景包括:在基于物理的渲染(PBR)​​ 中,作为Cook-Torrance等BRDF模型的核心组成部分,用于精确计算材质(尤其是金属和非金属)在不同视角下的反射强度,确保能量守恒;用于创建边缘发光(Rim Lighting)​​ 效果,通过增强角色或物体轮廓的亮度,使其在场景中更突出,增强视觉辨识度和立体感;模拟水面反射,通过菲涅尔系数动态混合反射颜色(如天空倒影)和折射颜色(如水下景物),真实再现近处透明、远处如镜的湖面效果;此外,它还常被用来近似模拟次表面散射,为皮肤、玉石等半透明材质在边缘处添加柔和的透光感,虽然不如物理模拟精确,但在实时渲染中能有效平衡效果与性能。

有哪些常见的抗锯齿方法?

在计算机图形学中,抗锯齿(Anti-Aliasing, AA)是一系列用于平滑三维图形边缘锯齿的技术。我们主要介绍超采样和多重采样两种方法:

简单地说,超采样就是先用超出需求分辨率的采样频率进行采样,然后再进行下采样得到结果,这样可以保证保留图像细节的同时得到需要的结果,而多重采样是针对图像边缘部分(可能产生锯齿的地方)进行多重采样,实现了性能和图像质量的平衡。

如何理解游戏循环机制?

游戏循环就是游戏程序持续运行的核心机制,它通过不断循环来处理输入、更新游戏状态和渲染画面。循环主要包括三个步骤:先处理玩家输入,比如按键和鼠标操作;然后更新游戏逻辑,包括角色移动、技能释放等;最后进行画面渲染。

能具体说说Update和FixedUpdate在游戏循环中有什么区别吗?它们各自适用于什么样的场景?

如何处理物理更新频率和渲染帧率不同步可能带来的问题呢?

物理更新频率与渲染帧率不同步是游戏开发中的常见挑战,这会导致物体抖动、视觉上的不连贯,甚至引发物理模拟错误(如穿墙或异常弹跳)。其核心原因在于物理引擎通常需要在固定的时间步长​(如每秒50次或60次更新)下运行才能保证计算的准确性和确定性,而渲染帧率则会受硬件性能、场景复杂度等因素影响不断波动。

为解决此问题,主流方案采用固定时间步长结合累积器(Accumulator)的模式。该架构将物理更新与渲染帧率解耦:累积器会累加每帧实际消耗的时间,一旦超过预设的固定时间步长(如0.02秒),就执行一次或多此物理更新,确保无论渲染帧率如何变化,物理世界的演进速度都保持恒定。

为了消除因物理更新频率低于渲染帧率导致的物体位置“跳跃”感,​渲染插值(Interpolation)​​ 是关键技巧。物理引擎不仅提供物体的当前物理状态,还会保留上一帧的状态。渲染时,根据自上次物理更新后的时间进度(累积器中的剩余时间与固定时间步长的比值),在上一物理状态和当前物理状态之间进行插值计算,从而获得平滑的中间状态进行渲染,有效避免抖动。

在渲染时可以多次执行FixedUpdate来处理物理更新慢的情况,那能具体说说这种多步物理更新是如何实现的吗?在代码层面需要注意哪些问题?

多步物理更新的核心在于一个时间累积器(Accumulator)​​ 机制。游戏主循环的每一帧中,引擎会将上一帧至今的真实时间(deltaTime)累加到累积器中。只要累积的时间达到或超过预设的固定时间步长(如 Time.fixedDeltaTime),就会执行一次 FixedUpdate和物理模拟,然后从累积器中减去一个步长的时间;此过程会在一帧内重复进行,直到累积的时间不足以再次触发更新,从而确保物理模拟的进度能“追赶”上真实的流逝时间,保持物理世界的稳定和确定。

在代码层面,关键点在于使用一个 ​while循环来驱动这个过程,并注意以下几点:

让你自己设计一个简单的事件系统,不考虑使用Unity内置的Event,你会怎么设计它的核心结构呢?

一个简易事件系统的核心结构围绕“事件中心”展开,它作为全局中枢(通常设计为单例),使用一个字典来管理不同事件类型(用字符串或枚举标识)对应的回调方法列表。该系统主要提供三个方法:On()用于让监听者订阅特定事件,Off()用于取消订阅以避免内存泄漏,以及 Emit()用于触发事件并通知所有已订阅的监听者执行其回调方法。通过这种方式,事件触发者与监听者互不知晓,实现了模块间的彻底解耦。

具体来说,我设计了一个EventManager单例类,它维护了一个事件类型到观察者列表的映射。当某个系统需要监听事件时,就调用Subscribe方法注册回调函数;当事件发生时,通过Publish方法遍历对应的观察者列表,依次调用它们的处理函数。比如在战斗系统中,当角色释放技能时,会发布SkillCast事件,UI系统、音效系统、特效系统等观察者就会收到通知并做出响应。在实现时我还考虑了性能优化,比如使用对象池复用事件对象,避免频繁的内存分配。另外,为了线程安全,我在关键操作处加了锁,但也会注意锁的粒度,避免影响性能。

SSE/AVX指令集是什么?

SSE和AVX是英特尔和AMD处理器中的SIMD指令集扩展,旨在加速并行计算任务。简单来说,它们允许CPU用一条指令同时处理多个数据,就像是一个老师可以同时指导整个班级做一个动作,而不是逐个指导学生,从而大幅提升计算吞吐量。

http://www.dtcms.com/a/541634.html

相关文章:

  • 2025-10-28 ZYZOJ aoao round 1 hetao1733837的record
  • 在线自助下单网站网站内容包括哪些
  • 企业网站免费模板深圳创意网站建设
  • h5游戏免费下载:弹珠打砖块游戏
  • mysql紧急恢复----gxl
  • 基于springboot的信息化在线教学平台的设计与实现
  • 6.1.3.2 大数据方法论与实践指南-开源大数据实时调度平台(StreamPark)
  • 网站建设mysql数据库电子商务系统的构成
  • C语言入门教程 | 第七讲:函数和程序结构完全指南
  • 佛山网站建设锐艺传播电气毕业设计代做网站
  • h5游戏免费下载:逗比测试
  • 英集芯 IP2326 15W快充2节/3节串联锂电池升压充电IC
  • 做jsp网站的步骤wordpress可视化编辑教程
  • 沈阳做网站的公司排名太平洋手机网参数对比
  • Stable Mean Teacher ---2025 IEEE
  • 【IEEE 2025】即插即用 SRMF 突破长尾困境!实现超高分辨率遥感图像的精准分割
  • 基于Detectron2的大坝涂层缺陷检测识别系统开发
  • 网站建设与维护试题含答案软件技术就业方向
  • metro网站模板单页网站建设哪个品牌好
  • 哪个云电脑最好用?适合玩游戏的云电脑测评!
  • Java并发编程基础:从线程管理到高并发应用实践
  • 【C++】哈希表实现 - 开放定址法
  • w3c网站代码标准规范模板王ppt
  • Vue3组件通信
  • 11-js数组(ESMAScript)
  • 郑州营销型网站建设哪家好网站中的ppt链接怎么做的
  • html + css +js
  • 微算法科技(NASDAQ MLGO)研发基于AI的动态权重学习模型,开启区块链账户关联分析智能新时代
  • K8s基础总结
  • 【系统分析师】预测试卷一:案例分析题目及答案详解