C_Sharp 板


LINE

经过一些修改 速度提升非常多 以我的电脑来说从9秒10秒 提升到1.5秒内 最主要的是卡在FastBitmap里头的mathod还是不够快 所已全部把pixel access地方改用指标存取 速度整个大提升 不过FastBitmap里头其实已经大量改用指标存取了 失败就在get和set pixel时後 动用到C#原生的Color method去包装color物件 public Color GetPixel(int x, int y) { pixelData = (PixelData*)(pBase + y * width + x * sizeof(PixelData)); return Color.FromArgb (pixelData->alpha, pixelData->red, pixelData->green, pixelData->blue); } 不要怀疑高阶抽像的物件效能就是这麽可怕 大量计算下 一碰到整个low down 连用都不能用 难怪影像.视讯处理领域都还是偏好用C/C++存取pointer来处理 物件导向的东西用在大量计算存取上真的死翘翘 得拆包装 既然得拆包装 很多人乾脆选用别的语言去处理 ok... 1.5秒其实是还可以提升的 瓶颈在於array access valueRed += ((double)((((FastBitmap.PixelData*) (index)))->red) * tmpContrib[j]); ^^^^^^^^^^^^^^ 是的 就是这个存取的动作耗时 反来不是一些资料类型的转型 或是 + * 的计算 来看看是怎麽回事吧 http://simplygenius.net/Article/FalseSharing In C#, Is it slower to reference an array variable? http://stackoverflow.com/questions/5575155/ in-c-is-it-slower-to-reference-an-array-variable 这边已经有点接近计算机组织的问题了 再看看 也许是x86的浮点运算能力不错 倒没有因为浮点计算花太多cost 不过如果是模拟浮点的硬体状况 我看多数会用特殊的方法 把浮点改成用整数来计算(却只损失一点点精确度) 至於回圈 因为会产生竞逐关系 所以也无法用平行处理发挥多核全部效能去处理 要怎麽处里还得想想 如果用到多核 时间大概只需要 0.X了 下面是修改版的部分 static Bitmap HorizontalFiltering(Bitmap bufImage, int iOutW) { int dwInW = bufImage.Width; int dwInH = bufImage.Height; Bitmap pbOut = new Bitmap(iOutW, dwInH, PixelFormat.Format24bppRgb); FastBitmap processor = new FastBitmap(bufImage); processor.LockImage(); FastBitmap processor_out = new FastBitmap(pbOut); processor_out.LockImage(); double valueRed = 0.0; double valueGreen = 0.0; double valueBlue = 0.0; byte* index; FastBitmap.PixelData* data; for (int x = 0; x < iOutW; x++) { int startX; int start; int X = (int)(((double)x) * ((double)dwInW) / ((double)iOutW) + 0.5); int y = 0; startX = X - nHalfDots; if (startX < 0) { startX = 0; start = nHalfDots - X; } else { start = 0; } int stop; int stopX = X + nHalfDots; if (stopX > (dwInW - 1)) { stopX = dwInW - 1; stop = nHalfDots + (dwInW - 1 - X); } else { stop = nHalfDots * 2; } if (start > 0 || stop < nDots - 1) { CalTempContrib(start, stop); for (y = 0; y < dwInH; y++) { int i, j; valueBlue = valueGreen = valueRed = 0; for (i = startX, j = start; i <= stopX; i++, j++) { index = (processor.pBase + y * processor.width + i * sizeof(FastBitmap.PixelData)); valueRed += ((double)((((FastBitmap.PixelData*) (index)))->red) * tmpContrib[j]); valueGreen += ((double)((((FastBitmap.PixelData*) (index)))->green) * tmpContrib[j]); valueBlue += ((double)((((FastBitmap.PixelData*) (index)))->blue) * tmpContrib[j]); } if ( valueRed > 255) valueRed = 255; if ( valueGreen > 255) valueGreen = 255; if ( valueBlue > 255) valueBlue = 255; if (valueRed < 0) valueRed = 0; if (valueGreen < 0) valueGreen = 0; if (valueBlue < 0) valueBlue = 0; data = (FastBitmap.PixelData*)(processor_out.pBase + y * processor_out.width + x * sizeof(FastBitmap.PixelData)); data->red = (byte)( valueRed); data->green = (byte)( valueGreen); data->blue = (byte)( valueBlue); } } else { for (y = 0; y < dwInH; y++) { int i, j; valueBlue = valueGreen = valueRed = 0; for (i = startX, j = start; i <= stopX; i++, j++) { index = processor.pBase + y * processor.width + i * sizeof(FastBitmap.PixelData) ; valueRed += ((double)((((FastBitmap.PixelData*) (index)))->red) * tmpContrib[j]); valueGreen += ( (double) ((((FastBitmap.PixelData*)(index)))->green) * tmpContrib[j]); valueBlue += ((double) ((((FastBitmap.PixelData*)(index)))->blue ) * tmpContrib[j]); } if ( valueRed > 255) valueRed = 255; if ( valueGreen > 255) valueGreen = 255; if ( valueBlue > 255) valueBlue = 255; if (valueRed < 0) valueRed = 0; if (valueGreen < 0) valueGreen = 0; if (valueBlue < 0) valueBlue = 0; data = (FastBitmap.PixelData*) (processor_out.pBase + y * processor_out .width + x * sizeof(FastBitmap.PixelData)); data->red = (byte) (valueRed); data->green = (byte)( valueGreen); data->blue = (byte)( valueBlue); } } } processor.UnlockImage(); processor_out.UnlockImage(); return pbOut; } --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.70.79.227 ※ 编辑: erspicu 来自: 61.70.79.227 (03/17 17:56)







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:iOS站内搜寻

TOP