共享纹理

老游戏使用directx9无法直接与cc高光sdk(d3d11)对接,但是d3d9ex有共享纹理,我们通过共享纹理把游戏画面共享给cc录制,记录一些踩坑的笔记。

共享纹理示例:

// 初始化Direct3D
void initD3D9(HWND hWnd)
{
hr = d3d9exdev->GetRenderTarget(0, &g_d3d9RenderSurface);
D3DSURFACE_DESC desc;
g_d3d9RenderSurface->GetDesc(&desc);
//关于格式说明:图像的格式必须与desc.format的格式一致,否则共享纹理的画面是黑色的,并且pool要使用default
hr = d3d9exdev->CreateOffscreenPlainSurface(desc.Width, desc.Height, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT,
&g_d3d9SharedSurface, &g_d3d9SharedHandle);
if (FAILED(hr))
{
OutputDebugStringA("CreateOffscreenPlainSurface failed\n");
}
}
// 渲染一帧
void RenderD3D9(void)
{
hr = d3d9exdev->StretchRect(g_d3d9RenderSurface, NULL, g_d3d9SharedSurface, NULL, D3DTEXF_NONE);
if (FAILED(hr))
{
OutputDebugStringA("GetRenderTargetData failed\n");
}
}
//g_d3d9SharedHandle就是共享纹理的句柄,传给sdk进行录制
long long sharedHandleAddress = reinterpret_cast<long long>(g_d3d9SharedHandle);

创建d3d9ex

只有d3d9ex才能共享纹理,d3d9无法共享纹理

LPDIRECT3D9EX d3d9ex = nullptr;
Direct3DCreate9Ex(D3D_SDK_VERSION, &d3d9ex);

VS中正常,编译出的exe出错

在与cc联调的过程中碰到一个问题:从vs中启动共享纹理正常,而打包出来的exe共享纹理是黑色的。

最后通过各种排查,各种换方法,才定位到问题,我们游戏加载的d3d9.dll非微软原版的!

把我们游戏的d3d9.dll,发给CC测试发现:游戏进程CreateOffscreenPlainSurface创建的纹理在录制sdk无法打开

那为什么从vs里启动就是正常的呢?

在vs中启动从模块窗口中可以看到加载的是系统的dll

编译出来的exe相同dll加载的位置已经变了!

尝试删掉或替换游戏目录下的d3d9.dll,测试结果如下表:

d3d9.dll 独立进程 同进程
替换d3d9.dll为微软原版
删除d3d9.dll

windows dll加载的顺序

打包应用系统按以下顺序搜索:

  1. DLL 重定向。
  2. API 集。
  3. 桌面应用仅 (UWP 应用) 。 SxS 清单重定向。
  4. Loaded-module 列表。
  5. 已知 DLL。
  6. 进程的包依赖项关系图。 这是应用程序的包,以及应用程序包清单的 节中指定的任何依赖项。 依赖项按它们在清单中的出现顺序进行搜索。
  7. 调用进程从加载的文件夹 (可执行文件的文件夹) 。
  8. 系统文件夹 (%SystemRoot%\system32) 。

附官方文档:Dynamic-link library search order - Win32 apps | Microsoft Learn

为什么要替换微软的d3d9.dll?

我们有部分集显玩家的地表会出问题,所以游戏内有个设置使用vulkan,勾选后会使用dxvk,不过这个dll也被命名为d3d9.dll,但是在内服为了截帧所以默认替换了游戏目录下的d3d9.dll

doitsujin/dxvk: Vulkan-based implementation of D3D9, D3D10 and D3D11 for Linux / Wine (github.com)

关闭编译优化导致录像闪屏

在我本地打包出来的游戏录像偶尔闪烁,而QA跑打包机打出来的游戏则录像视频特别闪,游戏内画面正常只有录像出现闪屏。

经过对比发现,我本地有两个工程的vs c++编译优化关闭了,也就是:项目 - 属性 - C/C++ - 优化:【最大优化O2】改成【已禁用】

于是尝试打开我本地工程的c++优化,果然视频也会闪屏,那为什么这个优化会导致闪屏呢?

因为关闭优化后游戏运行速度变慢,游戏变慢就变成同步了从而掩盖了共享纹理的问题。而游戏是多线程的,对纹理的访问是非同步的就会闪烁。

最终解决办法

Moo::rc().device();获取D3D设备,而不是游戏初始化通过CreateDeviceEx创建的pD3D9Ex,因为引擎里对D3D9Ex进行了封装,默认就开启了D3D9Ex,并且 Moo::rc().device()处理了多线程的同步问题

HRESULT DXUTCreate3DEnvironment9( IDirect3DDevice9* pd3dDeviceFromApp )
{
hr = pD3D9Ex->CreateDeviceEx( pNewDeviceSettings->d3d9.AdapterOrdinal, pNewDeviceSettings->d3d9.DeviceType, \
DXUTGetHWNDFocus(), pNewDeviceSettings->d3d9.BehaviorFlags, \
&pNewDeviceSettings->d3d9.pp, NULL, &pd3dDevice9Ex);
}

使用process explorer查看程序的句柄和加载的dll

菜单点击 View - Lower Pane View - 勾选DLLS和Handles ,并且勾选 View - Show Lower Pane,然后选中某个进程后,在底部就会出现dll tab页,里面显示了当前进程加载了那些dll

DirectX9(D3D9)游戏开发:高光时刻录制和共享纹理的踩坑的更多相关文章

  1. Notadd 2.0 全新 Node.js 版本~ (开发中) [从 PHP 到 node 的踩坑记]

    对于 Notadd 我们本来期望它实现更多... 尽管我们也尝试做了很多努力,但是由于 PHP 本身的局限,以及考虑到开发环境配置的复杂程度,最终使用了折中方案.接下来,我们谈谈整个技术选型历程,也供 ...

  2. 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星云 ...

  3. [Unity3D]Unity3D游戏开发《反对》说到游戏(上)——目标跟踪

    朋友,大家好.我是秦培,欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 首先博主要自我反省,过了这么久才来更新博客,这段时间主要是在忙着写期末的作业,所以博主基本上没 ...

  4. 2019,.Net开发者的高光时刻

    随着微软发布的一系列关于Windows..net和C#的公告,.Net开发者将在2019年,迎来自己的高光时刻,毕竟“世界上只有少数几种语言是多功能的,而没有一个像C#那样干净整洁.” 一.现在学C# ...

  5. OpenNI结合Unity3D Kinect进行体感游戏开发(转)

    OpenNI结合Unity3D Kinect进行体感游戏开发(转) 楼主# 更多 发布于:2012-07-17 16:42     1. 下载安装Unity3D(目前版本为3.4)2. 下载OpenN ...

  6. 《MFC游戏开发》笔记十 游戏中的碰撞检测进阶:地图类型&障碍物判定

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9394465 作者:七十一雾央 新浪微博:http:// ...

  7. 《MFC游戏开发》笔记九 游戏中的碰撞判定初步&怪物运动简单AI

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9374935 作者:七十一雾央 新浪微博:http:// ...

  8. [置顶] mmog游戏开发之业务篇

    这周不是很忙,因为我们的游戏开发了近一年,由于公司的业务调整,在游戏开第二服的时候,老板果断的把项目停到了. 感觉超级的不爽啊.因为这个游戏项目像我的孩子一样和我一样成长,里边的大概的业务逻辑都是偶实 ...

  9. 游戏开发设计模式之状态模式 & 有限状态机 & c#委托事件(unity3d 示例实现)

    命令模式:游戏开发设计模式之命令模式(unity3d 示例实现) 对象池模式:游戏开发设计模式之对象池模式(unity3d 示例实现) 原型模式:游戏开发设计模式之原型模式 & unity3d ...

  10. 《C++游戏开发》笔记十二 战争迷雾:初步实现

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...

随机推荐

  1. kettle从入门到精通 第三十六课 kettle carte 集群

    1.carte服务可以单体运行也可以集群方式运行,今天我们一起来学习下carte的集群模式部署和使用.本次示例用一个master和两个slave从节点演示. carte-config-master-8 ...

  2. kettle从入门到精通 第三十四课 kettle 错误处理

    1.我们在平常写应用程序的时候,需要主动捕获异常或者错误,不然程序有可能异常退出.同样kettle 也支持异常或者错误处理,下图展示的是在批量插入数据的时候捕获异常,如唯一健冲突,死锁等,并将错误信息 ...

  3. rsync备份任务练习

    06-备份任务实战 今天的任务主要以实际备份任务入手,完成综合练习,完成对rsync的综合运用. 先看需求 再讲解 再次动手实践 客户端需求 客户端需求: 1.客户端每天凌晨1点在服务器本地打包备份( ...

  4. 判断日期是否为周六周日,BigDecimal比较大小

    判断日期是否为周六周日,BigDecimal比较大小 package com.example.core.mydemo.date; import java.math.BigDecimal; import ...

  5. 这几个必备的vscode插件,你安装了几个

    作为一名前端开发者,vscode想必大家应该都接触过,就像大多数 IDE 一样,VSCode 也有一个扩展和主题市场,包含了数以千计质量不同的插件. 作为一名熟练掌握各种前端开发工具安装和卸载的大师兄 ...

  6. RSA密码系统的特定密钥泄露攻击与Coppersmith方法的应用

    PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全.密码学.联邦学习.同态加密等隐私计算领域的技术和内容. RSA密码系统作为当前最广泛使用的公钥加密算法之一,其安全性依赖 ...

  7. Shell脚本实现Linux回收站

    前言 到目前为止,非图形化的Linux还没有回收站的命令. 那么,我们如果不小心将某一个文件删掉了,那就只能数据恢复了.如果这也不行,那就等着哭吧. 最新代码在我的github:https://git ...

  8. 化合物同位素理论同位素分布计算软件Isopro 3.0

    大家好,今天分享一款软件,即可以计算化合物理论同位素分布的软件Isopro 3.0.在做质谱的实验时,特别对合成的化合物进行质量表征时,往往要求ppm绝对值在5以内,对质谱的分辨率要求很高.对于小分子 ...

  9. 【Kafka最佳实践】合理安排kafka的broker、partition、consumer数量

    broker的数量最好大于等于partition数量 一个partition最好对应一个硬盘,这样能最大限度发挥顺序写的优势. 一个broker如果对应多个partition,需要随机分发,顺序IO会 ...

  10. 【论文阅读】BEVFormer: Learning Bird's-Eye-View Representation from Multi-Camera Images via Spatiotemporal

    论文题目:BEVFormer: Learning Bird's-Eye-View Representation from Multi-Camera Images via Spatiotemporal ...