[闲聊] video filter 效能

楼主: erspicu (.)   2015-12-17 12:24:53
https://github.com/erspicu/filter_test
通常要求即时性的vidoe filter应该少会用全C#去实作,
不过一方面是为了好奇.一方面是挑战C#效能极限.一方面是相容考量,
所以还是尝试用纯C#来担任模拟器电玩常见的ScaleX HQX XBRz filter处理任务....
不过除了 ScaleX 外 , HQX跟XBRz 都是移植人家已经写好的C#改写方案,
再加上修改减化.重构.效能校调来的....
很刺激...你会发现改了啥地方,突然FPS窜升起来,或是几个零零星星的小地方改一改,
效能累积起来就提升不少,目前除了HQ6X (HQ3*HQ2)效能我觉得不太及格外,
其他担任一般古早机的scaler,以现在普遍的电脑效能来处理大概都算.
目前这几个filter,xbrz跟hqx都还有不少校能改善空间,对这种议题有兴趣的,
可能尝试修改看看.
大概的心得是,其实cost最高的是任何跟array数据存取的部分,
也就是说效能瓶颈主要是array内存这块,也难怪内存硬件还一直在进化中….
其他什么 加减乘除 逻辑判断等等的cost反来相当低…
但若真的太多累赘的code,同样会拖慢….
另外method展开,照理说少了stack push pop返回等动作效能会提升,
但若是展开的code太长太多塞起来,效能反来会大下降,
可能跟code 本身 loading的时间有关系.
这种需求下,其实原则就是程式能尽量简单就简单些,看起来酷酷很先进的写法,
能不用就不要去用,不过这种求精简破坏物件化结构和维护方便性的做法,
除非特殊原因,不然也不建议.
作者: fo40225   2015-12-17 22:46:00
要更快就要用unsafe去存取array与bitmap我看了啊 看到都是用SetPixel 这就慢啊.net4.6 x64可以用CPU SIMD加速 那些矩阵处理也可以更快如果计算量够大 用C++AMP写逻辑给C#用可以比pfor快
作者: Litfal (Litfal)   2015-12-18 16:35:00
如果是相容考量,C++应该更好一些,不过得看你相容什么XD然后filter系的优化,可以用动态产生IL的技巧,把一些不必要的运算直接去掉,例如x1、x0、x-1这种在filter里面常出现的。直接动态产生IL的方式,我比较推荐Expression Tree自己写IL code有点辛苦,虽然有时是必要的...
作者: fo40225   2015-12-18 16:43:00
文章 专案没看懂是我的问题 抱歉但我认为在ScaleImage内的操作 展开成那样JIT的优化都没了 还不如用unsafe + SIMD 可读会回来一些这样也还算是在C#内实作吧?毕竟unsafe操作指标也是C#规格如果操作array是瓶颈那就用unsafe去改都用上pfor平行操作多笔资料了 用上SIMD一次操作更多不是用pfor操作还有可能有CPU cache miss问题展开减少stack push pop也可以试试MethodImplOptionsMethodImplOptions.AggressiveInlining

Links booklink

Contact Us: admin [ a t ] ucptt.com