当前位置:首页 > 其他 > 正文内容

DirectX9(D3D9)游戏开发:高光时间录制和同享纹路的踩坑

邻居的猫1个月前 (12-09)其他566

同享纹路

老游戏运用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

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=699

分享给朋友:

“DirectX9(D3D9)游戏开发:高光时间录制和同享纹路的踩坑” 的相关文章

DNS

DNS

目录 rocky和grub的发动和作业流程 总结内核规划门户及特色 systemd服务装备文件 openssh服务 对称加密和非对称加密 域名体系DNS 完成主从DNS服务器 rocky和grub的发动和作业流程 rocky发动流程 1. BIOS/UEFI 发动:履行BIOS或UEFI程序,进行硬...

使用1panel布置前后端别离项目 Java代码打包 前端打包

使用1panel布置前后端别离项目 Java代码打包 前端打包

初度发布于我的个人文档 参阅: 1.1Panel 官方文档 本文介绍一下怎么使用1panel布置一个简略的前后端别离项目。 1,具有一个Liunx服务器 第一步是购买一个Linux服务器,能够买一台线下实在的机器+公网IP或买一个阿里云、腾讯云、京东云、华为云服务器。 2.装置1panel 参阅1p...

万星开源项目:System Design Primer - 学习体系规划的必备攻略

万星开源项目:System Design Primer - 学习体系规划的必备攻略

GitHub 链接:https://github.com/donnemartin/system-design-primer 什么是 System Design Primer? System Design Primer 是一个专心于体系规划的开源项目,由 Donne Martin 创立并保护。它旨在...

RSA非对称加密算法中的密钥对生成与传输

RSA非对称加密算法中的密钥对生成与传输

PrimiHub一款由密码学专家团队打造的开源隐私核算途径,专心于共享数据安全、密码学、联邦学习、同态加密等隐私核算范畴的技能和内容。 RSA(Rivest–Shamir–Adleman)加密算法是一种根据大素数分化难题的非对称加密算法,由Ron Rivest、Adi Shamir和Leonard...

云计算特征,引领未来信息时代的基石

云计算特征,引领未来信息时代的基石

云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。云计算具有以下几个主要特征:1. 按需自助服务:用户可以根据自己的需求,随时获取所需的服务,无需与供应商进行交互。2. 广泛的网络访问:用户可以通过各种设备,如笔记本电脑、智能手机等,通过互联网访问...

云计算视频,助力新手快速入门与进阶

云计算视频,助力新手快速入门与进阶

1. 科普视频: 这期视频由阿里巴巴的技术专家阿云讲解云计算的基本概念,适合初学者了解云计算是什么。2. 基础到高级的系列视频: 这套视频共198集,从云计算的基础知识到高级应用,非常适合系统学习。3. Linux/云计算全套视频: 这套视频包括997集,详细讲解了Li...