【发布时间】:2014-10-28 10:04:23
【问题描述】:
我正在编写一个应用程序,它使用 Kinect 照片数据并在 F# 中比较两个帧。我正在使用 Rob Miles Learn the Kinect Api 第 74 页作为路标,但我没有使用指针并且性能受到影响。 Kinect 帧的字节为 1,228,800 字节。我是这样写比较的:
member this.differenceCount(currentImageBytes) =
if previousImageBytes |> Seq.length = 0 then
previousImageBytes <- currentImageBytes
0
else
let bytes = Seq.zip previousImageBytes currentImageBytes
let differenceCount = bytes |> Seq.mapi(fun i e -> i, e)
|> Seq.filter(fun (i,e) -> i % 4 <> 0 )
|> Seq.map snd
|> Seq.filter(fun (p,c) -> p <> c)
|> Seq.length
previousImageBytes <- currentImageBytes
differenceCount
当我运行它时,屏幕会滞后,因为(我认为)处理数组花费的时间太长。此外,错误率接近50%。
1) 我处理问题的方法有误吗? 2) 有没有办法优化我的代码以加快速度?
【问题讨论】:
-
嗨 - 这个问题不是 F# 特定的(请参阅 stackoverflow.com/questions/43289/…) - 实际上你可以翻译那里的所有答案 - 但如果你真的需要速度(并且是在 Windwos 上)而不是从那里获取 PInvoke 答案(如果需要,您可以将其放入 C# dll 中)并使用它 - 您永远不会在 .net 中获得如此快的东西
-
我认为这是正确的轨道。我让 PInvoke 与 memcmp 一起工作,但它返回 0、1 或 -1。我需要差异的总数。有没有一种本地方法可以做到这一点?
-
哦 - 我想我错过了这个 - 我不知道这个 no 的本地版本 - 这是一个疯狂的猜测,但我敢打赌,做这样的事情的最好方法是移动它到 GPU 着色器(或编写低级 C/C++/Asm 实现)
-
:-( 我不确定 GPU 着色器是什么。我看看是否有人编写了我可以这样使用的 C/C++ 实现:stackoverflow.com/questions/15313646/…
-
着色器是在 GPU 中的一个着色器单元上运行的简单程序 - 由于 GPU 有很多这样的单元,您可以获得巨大的并行处理能力,当然这用于完成你的最新游戏——但我的意思是半开玩笑——现在我会寻找一个本地实现或采用约翰提议的方式