返回「计算机、信息技术与工程」

向量化编程

向量化编程 创建时间:2021/1/24 23:13

更多
Markdown 结构化数据
本文目录 11 个章节

向量化编程

创建时间:2021/1/24 23:13

向量化编程

向量化编程与ECS

核心思想

  • 高频操作 —— 向量化执行

  • 低频操作 —— 顺序执行

当遇到数量级比较大的操作,想办法把它向量化,低频操作(例如只出现一次的操作)还是用顺序化的方式去写。

面向对象编程与向量化编程的比较

二者的根本区别

面向对象编程,实际上是把人对事物的理解,或者是说一种抽象的规则,转换为计算机的代码,或者算法。 向量化编程,需要自己去摸索一套管理的代码,考虑如何管理这些Component。

Component和对象是不一样的,Component是离散的,任何东西都可以是Component,很灵活,不局限于一个对象,或者一种Entity,他可以加到不懂种类的Entity上面去,复用度高,灵活性大。越是灵活的东西,越容易出错。

向量化编程的优劣

优势

  • 代码调用树的深度低于面向对象编程,能够产生争议的点比较少。

  • 代码管理的成本低一些。

  • System代码基本不需要时间去读,定义好数据结构,就了解了算法

System代码做的事实际上就是把数组A变成数组B

劣势

  • 起点较高:老技术,由于“反人类”思维,流行程度低于面向对象编程

  • 算法从单线程改为多线程,难度较高。

  • 顺序执行代码Boilerplate较多

面向对象编程时,要获取一个类的成员,”点“一下,就可以方便地获取与修改成员 ECS在获取数据时,需要GetComponentData,修改地话,还需要SetComponentData,来把数据的修改设置回去。

策略

从项目管理的角度将,平常写的时候,就用面向对象的、顺序话的编程即可。在最终优化时,如果性能上确实需要优化,又存在大量重复操作,再将这部分操作变成向量化编程。低频操作任然保留。

关于多线程

关于数据加锁

要先把数据拆分的比较细,对某个操作进行评估,看这个操作需要哪些数据,把这些问题都想好了,这个问题才比较好解决。如果一个很长的代码。

大量的玩家同时登陆服务器——以分流、分服务器的方式去解决。实际上没有提高一个计算单元的效率。可以考虑对重复的操作统一同时进行(如登陆服务器、验证用户名密码,反馈结果),当接收到玩家的登陆请求以后,把ID和密码缓存到数组里面,在需要对数据库进行查询的时候(查询实际上是非常耗时的过程,同时又是一个很容易多线程、向量化的操作,尤其是需要读磁盘上的数据库),把很多玩家的用户名和密码同时发给服务器,服务器做一个批量的查询,也是一个提高效率的好方法。