首页 > 编程语言 > 详细

Unity ComputeShader

时间:2020-09-21 00:51:11      阅读:52      评论:0      收藏:0      [点我收藏+]

最近一直想面对大规模程序时,如何提高运算速度,100个怪物循环100次没有问题,但是处理的过程会特别庞大,所以考虑到使用多线程,unity的单线程,而unity自带的dots系统也不知道什么时候成熟,不想造轮子所以jobsystem真心不想用,在网上偶然间看到了一个关于鸟群算法对Computeshader的使用,查阅了很多资料后终于暂时入门:简单说就是在显卡上扣出一部分性能给游戏的数值做运算。

首先转载一张经典的图和某位原作者的话:

个人理解:
numthreads 定义了一个三维的线程结构

技术分享图片

如果我们在程序的Dispatch接口发送了(5,3,2)这样的结构,就会生成5x3x2个线程组,其中每个组的线程结构由ComputeShader中的numthreads定义,图中numthreads定义了10x8x3的三维结构,由此,我们可以分析4个HLSL关键词的定义。
  • SV_GroupThreadID 表示该线程在该组内的位置
  • SV_GroupID 表示整个组所分配的位置
  • SV_DispatchThreadID 表示该线程在所有组的线程中的位置
  • SV_GroupIndex 表示该线程在该组内的索引

我自己的表述:

如果我们有一个长度为20的数组需要处理,为了同时处理者10000个数据,我们需要向显卡申请至少10000个线程,此时就可以申请10000个线程,但是呢这10000个线程太大了,所以呢,把这10000个线程的布局成一个2维数组,但是这个二位数组还是太大,所以呢就把这个二维数组再次切割成一个1维数组,这样整个表就切割成了一个3维数组;但是呢这个三维数组还是太大,以一个三维索引R范围为单元,再次按照上面的方法再切割成一个三维数组G,结果就是三维单元R就是numthreads(x,y,z),而三维数组G就是Dispatch(x,y,z)。这里也利于理解,因为显卡的处理单元过于庞大,已经超过了一个数组索引的范围,或者显卡的设计就是以层层阵列的方式制作的,因此这种超维度结构可以更好的索引到需要的资源,而它申请索引的时候完全是靠数字电路硬件获取(学过计算机电子的都知道)。

所以再次对上面的索引做出解释:

  • SV_GroupThreadID 表示该线程在该组内的位置----------即这个三维单元内的单元数组空间中索引
  • SV_GroupID 表示整个组所分配的位置----------即该线程所在的组在组空间中的索引
  • SV_DispatchThreadID 表示该线程在所有组的线程中的位置----------即不将整个三维单元分组的情况下的三维索引
  • SV_GroupIndex 表示该线程在该组内的索引----------即这个三维单元内的数组转换成一个一维数组时所在的索引

 

Unity ComputeShader

原文:https://www.cnblogs.com/xiaoahui/p/13703122.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!