计算机图形学:C++

完美转发(std::forward):
移动语义(std::move):
右值引用
类型擦除:
是C++中常用的用法,在标准库模板如std::function中有大量的使用,其原理为:RAll规则保证任何类型都有1个构造函数,1个析构函数与N个普通调用函数,这些函数都可以打包成静态函数指针this指针。

内存池(对象池)设计:
内存分配是昂贵的,尤其是频繁且每次分配较小的块,因此需要内存池设计。原理较为简单,分配一块大内存并切成固定的等分,以stack的形式每次拿取,若数量不够正常扩容即可。

HashMap(std::unordered_map):
Hashmap原理类似std::unordered_map,在std::unordered_map那种实现的基础上,对链表元素进行了池化,消灭了持续的内存开辟和销毁。hashmap是一个快速查找的数组,一个存储着链表的数组,hash其实是一个对象的整数,比如一串字符串把所有字符加起来得到的值就可以当hash。

模板:
模板是泛型编程的基础。是创建泛型类或函数的蓝图或公式。


template <typename type> ret-type func-name(parameter list)
{
   // 函数的主体
}

template <class type> class class-name {
.//类模板
}

模板其实是个有智能匹配功能的生成器,T填个int,那么就会完整生成一遍所有模板里的代码,把T替换成int,所以等于是在写生成代码的代码,智能匹配方式则相当于函数式编程(只不过语法非常难看),模板配全局变量比较容易出现问题,建议不要踩坑。同时,模板会导致编译效率严重降低,建议常使用上方提到的类型擦除减少模板内部代码量。

多线程:
异步多线程:游戏引擎是对实时性要求极高的应用,因此计算密集型任务通常不会交给异步线程,而是IO等对实时性要求并不太高的任务可以交给异步线程执行,异步线程设计时数量往往不应太多,避免占用过多CPU线程的资源,属于弟弟线程。
同步多线程:同步多线程一般指每帧(或每固定几帧)必须同步的线程,负责处理实时性要求高的任务,是哥哥线程,往往会在任务与任务之间无依赖时尽可能多的占用CPU线程。同步多线程往往设计更加复杂,常使用图(Graph)的方式标记任务依赖,经典实践:Unity JobSystem。
运行的软件线程总数量不应高于系统核心数(对于超线程CPU,以x2后的核心数为准),避免产生上下文切换的消耗(上下文切换消耗极高)。

mutex
互斥锁,用来保证线程同步,防止不同的线程同时操作同一个共享数据,配合lock_guard使用相对安全,它是基于作用域的,能够自解锁,当该对象创建时,它会像lock()一样获得互斥锁,当生命周期结束时,它会自动析构(unlock),不会因为某个线程异常退出而影响其他线程lock_guard与unique_lock的区别:

  1. 都可实现自动加锁与解锁功能
  2. unique_lock比lock_guard更灵活
  3. unique_lock比lock_guard占用空间相对更大一点,且速度相对更慢一点

lock_guard:
在对象构造时将mutex加锁,析构时对mutex解锁unique_lock
unique_lock内部持有mutex的状态:locked,unlocked,因为要维护mutex的状态,所以占用空间和速度相对更大更慢。
多个语句加锁可能导致deadlock。不要将对受保护的数据的指针和引用传递到锁的范围之外,无论是通过函数中返回它们,将其存放在外部可见的内存中,还是作为参数传递给用户提供的函数。

condition_variable:
条件变量,用于多线程之间的通信,可以阻塞一个或同时阻塞多个线程。多个线程访问同一个共享资源时,不但需要用互斥锁实现独享访问以避免并发错误,在获得互斥锁后还需要检验特定条件是否成立

  1. 不满足,则拥有互斥锁的线程应该释放该互斥锁,把自身阻塞(block)并挂到(suspend)条件变量的线程队列中
  2. 满足,则获得互斥锁的线程可以访问共享资源,退出临界区时通知(notify)在条件变量的线程队列中处于阻塞状态的线程,被通知的线程必须重新申请对该互斥锁加锁条件变量必须与互斥锁配合使用(condition_variable需要与unique_lock配合使用),某一时刻阻塞在一个条件变量上的各个线程应该在调用wait()时指明同一个互斥锁,此时该条件变量与该互斥锁绑定,否则程序的行为未定义。
    为什么要用unique_lock:
    等待中的线程在等待期间必须解锁互斥元,并在这之后将其重新锁定,lock_guard没有提供这样的灵活性,如果互斥元在线程休眠期间始终被锁定,数据准备线程将无法锁定该互斥元,并且等待中的线程将永远无法看到其条件得到满足。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值