前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SharpDx 进入全屏模式 窗口模式设置透明窗口交换链全屏

SharpDx 进入全屏模式 窗口模式设置透明窗口交换链全屏

作者头像
林德熙
发布2019-06-15 14:41:17
2K0
发布2019-06-15 14:41:17
举报

本文告诉大家两个不同的方法进入全屏模式

本文属于 SharpDx 系列 博客,建议从头开始读

本文的上一篇是 C# 从零开始写 SharpDx 应用 初始化dx修改颜色 本文的代码将会在上一篇的代码上修改

在 SharpDx 里面可以通过两个方法进入全屏模式,一个是窗口进入全屏,另一个是交换链进入全屏

窗口模式

和普通的 WPF 窗口差不多,可以在 RenderForm 创建的时候设置进入全屏模式,全屏就是最大化的窗口同时去掉标题栏,隐藏任务栏

在 Windows 只要整个屏幕的所有像素被填充,那么任务栏将会自动隐藏

在 RenderForm 有一个属性是 IsFullscreen 如果单修改这个属性是没有用的,需要同时设置 AllowUserResizing 属性

            _renderForm = new RenderForm();

            _renderForm.WindowState = FormWindowState.Maximized;
            _renderForm.IsFullscreen = true;
            _renderForm.AllowUserResizing = false;

这样就可以进入全屏,没有标题栏和任务栏

设置透明窗口

在窗口里面可以通过 TransparencyKey 设置某个颜色作为透明颜色,然后通过 AllowTransparency 设置支持透明

            _renderForm.TransparencyKey = Color.Transparent;
            _renderForm.AllowTransparency = true;

这时画出的透明的颜色就是让窗口透明,透明的部分会命中到后面的元素

和 WPF 的全屏不相同的是,在 SharpDx 里面不会占用屏幕透明的内存,也就是透明部分不需要使用程序进程的内存

交换链全屏

如果开启交换链的全屏,那么窗口透明将无法使用,使用交换链透明,在 Windows 的 DWM 将会整个屏幕的绘制交给程序,此时的程序绘制速度能更快

其他的应用有关渲染部分都不会执行,特别是其他的 dx 程序,这样程序可以用到很多的计算。用交换链的全屏可以做到更高的性能,但是在进入的时候都会因为屏幕显示切换出现黑色,现在很少有游戏使用交换链全屏

在上一篇说到的 InitializeDeviceResources 方法里面通过 CreateWithSwapChain 方法创建交换链的下方,可以设置全屏

        private void InitializeDeviceResources()
        {
            var backBufferDesc =
                new ModeDescription(Width, Height, new Rational(60, 1), Format.R8G8B8A8_UNorm);

            var swapChainDesc = new SwapChainDescription
            {
                ModeDescription = backBufferDesc,
                SampleDescription = new SampleDescription(1, 0),
                Usage = Usage.RenderTargetOutput,
                BufferCount = 1,
                OutputHandle = _renderForm.Handle,
                IsWindowed = true
            };

            Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.None, swapChainDesc,
                out _d3DDevice, out _swapChain);

            // 全屏
            _swapChain.SetFullscreenState(new RawBool(true), null);

            // 忽略代码
        }

通过 SetFullscreenState 可以将交换链的渲染信息输出到屏幕,在Windows Vista或更高版本中其实 独占 模式不会让整个程序用到所有的 GPU 资源,因为 GPU 是共享的,但是可以让程序用到更多的资源。清真的程序在其他程序进去全屏的时候,渲染策略会和这个程序最小化一样,不会做实际渲染

SharpDx 系列

SharpDX.DXGI.SwapChain.SetFullscreenState(SharpDX.Mathematics.Interop.RawBool, SharpDX.DXGI.Output) Example

DirectX Graphics Infrastructure (DXGI) Best Practices - Windows applications

DXGI API SharpDX

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 窗口模式
  • 设置透明窗口
  • 交换链全屏
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档