小编cyr*_*huk的帖子

私有函数与嵌套函数

问题是:

何时使用私有函数,何时使用嵌套函数?(我问的是F#,但也许答案可能与其他函数式语言相关)

一个小例子

namespace SomeName

module BinaryReaderExt =
    open System.IO

    let seek (reader : BinaryReader) positions =
        reader.BaseStream.Seek(positions, SeekOrigin.Current) |> ignore

module Mod =
    open System.IO

    let private prFun reader:BinaryReader =
        //do something
        BinaryReaderExt.seek reader 10L


    let outerFun (stream :System.IO.Stream) =
        let reader = new System.IO.BinaryReader(stream)
        let seek = BinaryReaderExt.seek reader

        let nestedFun () =
            seek 10L
            //do something

        nestedFun()
        prFun reader
Run Code Online (Sandbox Code Playgroud)

嵌套函数可以使用来自更高范围的数据,这是一个很大的好处。也不会污染周围的模块。但看起来很笨拙,不是吗?特别是当有一些大的嵌套函数时

相反,私有函数可以公开并进行测试。似乎它们看起来更具可读性

你怎么看?

f# functional-programming function

5
推荐指数
2
解决办法
1170
查看次数

桌面复制 API 和可切换显卡

问题:当您在具有可切换显卡的计算机上使用独立显卡控制器运行应用程序时,调用IDXGIOutput1::DuplicateOutput 方法会返回 DXGI_ERROR_UNSUPPORTED。

这个答案让我们对这个问题有了一些了解。简而言之,独立显卡仅渲染屏幕的一部分,并将数据发送到集成图形控制器的帧缓冲区——换句话说,所有输出始终通过集成图形控制器。看来这就是 DuplicateOutput 返回 DXGI_ERROR_UNSUPPORTED 的原因。

我编写了一个示例,使用winapiEnumDisplayDevices 函数)和directxIDXGIFactory::EnumAdapters 方法IDXGIAdapter::EnumOutputs 方法)获取所有输出及其视频适配器,以在具有可切换显卡(Intel HD 4600 和 NVIDIA 840M)的计算机上进行比较。这是结果:

在此输入图像描述

不确定我的比较有多正确,但是你可以看到winapi说 DISPLAY1 属于 Intel 卡,而directx说 DISPLAY1 属于 NVIDIA 卡。一种解决方案是复制 Intel 卡的输出(因为一切都经过它),但 EnumOutputs 不返回任何输出。

目前有一个解决方法:始终使用集成图形控制器运行使用复制 API 的应用程序。

问题:如何使 DuplicateOutput 与具有可切换显卡的笔记本电脑上的独立显卡控制器配合使用?或者这是桌面复制 API 的限制?

directx screen-capture video-card dxgi

4
推荐指数
1
解决办法
3637
查看次数