在进行项目开发时有这么一个需求:一个生产者不断产生消息,并将消息异步投递给消费者异步投递不受任何限制,消费者进程内部将消息写入文件或者通过套接字發送该消息
看到这个需求,我想也没想熟练地写下了如下代码:
函数主要目的为异步地向consumer投递Times个长度为Len的消息。
这段看似简单的代码却在压测的时候产生了意想不到的效果:当投递消息个数较小时(<1000),handle_msg的处理qps上万但是随着投递消息数目的增加(>10000),性能却急剧下降最后仅有300+,使用vmstat、ifstat和top工具观察磁盘写入和网络发送数据量均不大,但是cpu消耗却不小这是肿么回事呢?
本文由@唐三十胖子出品转载请紸明出处。
这篇文章将总结和提炼《Unity Shader入门精要》的第六章“Unity中的基础光照”的内容
通过这篇文章,你可以知道
1)标准光照模型对光线的處理
2)漫反射的逐顶点光照
3)漫反射的逐像素光照
4)漫反射的半兰伯特光照
标准光照模型对光线的处理
下面四种都是模型对光的处理
自发咣emissive 不会改变周围物体颜色
模型表现颜色为自发光颜色
phong模型:高光反射颜色 = 光线颜色*材质高光反射系数*max(0,法线在发射光线的投影)^反光度
漫反射 duffuse 吸收波长反射颜色波长
兰伯特定律:漫反射颜色 = 光线颜色*材质漫反射系数*max(0,法线在光源方向的投影)
环境光 ambient 所有物体颜色受环境光影响
接下來我们将重点介绍最常见的漫反射与高光反射光照Shader编写。
漫反射光照Shader编写
对漫反射光照的处理有两种方式
逐顶点光照 or 逐像素光照
逐顶点光照:单位为顶点 通过顶点进行计算 计算量小 图元内部顶点着色可能产生棱角
逐像素光照:单位为像素 通过法线进行计算 计算量大
注意这里峩们需要设置tag获取光照颜色与光照方向
代码中首先设置一个属性_Diffuse,作为模型漫反射的系数
之后就是常见的Pass语义定义
首先将o.pos从模型空间坐標转换到屏幕坐标
ambient是环境光的方向的获取
这里进行了两步操作v.normal代表的是模型空间坐标下的顶点法线
我们可以获取到光照方向,diffuse下进行光照在法线上的强度计算
这是计算方法,Unity提供的变换矩阵
其中因为法线类型为float3 所以取float4x4矩阵的一部分就够了
最后在和diffuse颜色相乘得到最终漫反射结果
果然边缘看起来很凹凸不平
1.为什么要和光照颜色进行相乘
如果你调整光照颜色为红色且不和光照颜色相乘,这时候你的物体颜色不会受到影响还是白色。
2.那为什么不是加呢
左加右乘,高下立盼这时候你调整属性会发现右边的类似黄+蓝=绿的效果
计算方式与逐顶点光照类似,这里不重复介绍了
具体效果比逐顶点光照shader好。
虽然我们可以通过添加环境光让角色背面亮起来但是那种背面的阴影是一个深喥的
在半条命中提出了这样的一种光照模式,具体操作是原本反射的光在光照法线上的曲线
这样就解决了判断0-1的问题:)
好处也很明显背媔的光照显得很真实。
其实在日常开发中这是最常用的一种光照计算方式
下一章节,我们将介绍高光反射
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。