首页 > 其他分享 >DirectX9(D3D9)游戏开发:高光时刻录制和共享纹理的踩坑

DirectX9(D3D9)游戏开发:高光时刻录制和共享纹理的踩坑

时间:2024-08-04 10:17:04浏览次数:14  
标签:高光 D3D9 hr 纹理 d3d9 DirectX9 dll 共享 游戏

共享纹理

老游戏使用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无法打开

image-20240701125253381

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

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

image-20240701130544013

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

image-20240702101140384

尝试删掉或替换游戏目录下的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】改成【已禁用】

image-20240703111252668

于是尝试打开我本地工程的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

image-20240702142239030

标签:高光,D3D9,hr,纹理,d3d9,DirectX9,dll,共享,游戏
From: https://www.cnblogs.com/zhaoqingqing/p/18341086

相关文章

  • Unity海面效果——4、法线贴图和高光
    Unity引擎制作海面效果  大家好,我是阿赵。  继续做海面效果,上次做完了漫反射颜色和水波动画,这次来做法线和高光效果。一、高光的计算  之前介绍过高光的光照模型做法,比较常用的是Blinn-Phong  所以我这里也稍微连线实现了一下  为了能看得更清楚......
  • 实现了对图像的亮度、对比度、饱和度的调整以及添加高光效果
    读取原始图像:使用cv2.imread()函数从指定路径读取一张图片,并将其存储在变量image中。创建光照掩模:生成一个与原图大小相同但完全黑色的图像(使用np.zeros_like()),这将作为后续光照效果的基础。定义光照中心点:确定光照效果的中心位置,默认为图像的几何中心。创建圆形光照区......
  • 【高光谱遥感分类论文解读1】Hyperspectral Image Classification Using Group-Aware
    目录一、论文基本信息二、研究背景三、研究方法1.GAHT总体框架2.GPE模块3.Transformer编码模块四、实验本文是博主对原论文的解读,仅代表博主个人观点,欢迎在评论区和我交流~其中,本博文中的图片和公式均来源于原论文,如需进一步了解,请查看原论文。一、论文基本信息......
  • 美特斯邦威从亏损重回高光时刻:选拔合格领导人的重要性
    美特斯邦威从亏损重回高光时刻:选拔合格领导人的重要性选择合适的领导者对于一个企业的成功至关重要。最近,美特斯邦威创始人周成建的复出引起了广泛讨论和关注。这个事件给企业敲响了警钟,提醒各个企业在选择领导者时要格外谨慎。根据报道,自2016年以来,美邦服饰公司由周成建的女......
  • 近年来高光谱深度学习语义分割方法分类及代表性网络
    目录一、卷积神经网络——光谱、空间、光谱-空间CNN1.SSRN(Spectral-SpatialResidualNetwork)2.HybridSN3.A2S2K-ResNet二、图卷积神经网络GCNGCN(GraphConvolutionalNetworksforHyperspectralImageClassification)三、深度置信网络DBN四、循环神经网络RNN......
  • 【图像融合】基于小波变换实现高光谱和多波段遥感影像融合,熵值 相关系数 光谱扭曲度
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 高光谱遥感数值建模技术及在植被、水体、土壤信息提取
    原文链接:高光谱遥感数值建模技术及在植被、水体、土壤信息提取https://mp.weixin.qq.com/s?__biz=MzUzNTczMDMxMg==&mid=2247600854&idx=6&sn=98131c36c2406f1f4b627de5acdea985&chksm=fa820b31cdf582275d52c1c6fef4ecbd83543380a7aed22ca98e4e724873bbbd206943cdedf2&token=18......
  • Matlab在高光谱遥感中的作用:从数据处理到决策支持
    光谱和图像是人们观察世界的两种方式,高光谱遥感通过“图谱合一”的技术创新将两者结合起来,大大提高了人们对客观世界的认知能力,本来在宽波段遥感中不可探测的物质,在高光谱遥感中能被探测。以高光谱遥感为核心,构建大范围、快速、远程、定量探测技术,已在矿物填图、土壤质量参......
  • Three——四、几何体、高光网络材质、锯齿模糊以及GUI库的使用
    Threejs常见几何体简介Three.js常见的几何体:常见的几何体://BoxGeometry:长方体constgeometry=newTHREE.BoxGeometry(100,100,100);//SphereGeometry:球体constgeometry=newTHREE.SphereGeometry(50);//CylinderGeometry:圆柱constgeometry=newTHREE.CylinderGe......
  • 全球都有哪些高光谱遥感卫星?
      本文对目前国内外的高光谱遥感卫星加以汇总,并对主要卫星进行参数介绍与对比。目录1引言2全球主要星载高光谱数据介绍2.1EOSAM-1MODIS2.2MightySat-2.1FTHSI2.3EO-1Hyperion2.4PROBA-1CHRIS2.5ADEOS-2GLI2.6环境一号HJ-1A卫星2.7珠海一号OHS高光谱卫星2.8高......