- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
老游戏使用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才能共享纹理,d3d9无法共享纹理 。
LPDIRECT3D9EX d3d9ex = nullptr;
Direct3DCreate9Ex(D3D_SDK_VERSION, &d3d9ex);
在与cc联调的过程中碰到一个问题:从vs中启动共享纹理正常,而打包出来的exe共享纹理是黑色的.
最后通过各种排查,各种换方法,才定位到问题,我们游戏加载的d3d9.dll非微软原版的! 。
把我们游戏的d3d9.dll,发给CC测试发现:游戏进程CreateOffscreenPlainSurface创建的纹理在录制sdk无法打开 。
在vs中启动从模块窗口中可以看到加载的是系统的dll 。
编译出来的exe相同dll加载的位置已经变了! 。
尝试删掉或替换游戏目录下的d3d9.dll,测试结果如下表:
d3d9.dll | 独立进程 | 同进程 |
---|---|---|
替换d3d9.dll为微软原版 | √ | √ |
删除d3d9.dll | √ | √ |
打包应用系统按以下顺序搜索:
附官方文档:Dynamic-link library search order - Win32 apps | Microsoft Learn 。
我们有部分集显玩家的地表会出问题,所以游戏内有个设置使用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);
}
菜单点击 View - Lower Pane View - 勾选DLLS和Handles ,并且勾选 View - Show Lower Pane,然后选中某个进程后,在底部就会出现dll tab页,里面显示了当前进程加载了那些dll 。
最后此篇关于DirectX9(D3D9)游戏开发:高光时刻录制和共享纹理的踩坑的文章就讲到这里了,如果你想了解更多关于DirectX9(D3D9)游戏开发:高光时刻录制和共享纹理的踩坑的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个 OGre3D+Hikari 应用程序,我想在其背景中循环使用 flash 动画。 我尝试调整 createFlashOverlay 中的一些参数(特别是 zorder 和层),但没有任何改变
奇怪的问题,但只是在寻找指导或建议。我的网络应用程序具有协助运算符(operator)计时的功能。我的任务是从 mysql php 触发器打开红色闪光灯(警灯)? 可以这样做吗,因为我认为网站无法与我
我对 WIX 相当陌生,所以如果我完全错过了这里的船,请原谅我,但我想知道是否可以在 wxs 文件中重用组件(mwm、cab 等)而无需重新链接它们每次。我正在使用的安装程序有几个可执行文件、dll
我喜欢 MVVM Light 的 Messenger 及其灵 active ,但是当我忘记显式注销收件人时(在 Silverlight 4 中),我遇到了内存泄漏问题。 原因解释here ,但我对此表
当我在 Visual Studio 2010 中安装 MVVM Light v3.xx 后,我有许多用于创建 MVVM 项目的模板。 但我需要全新安装 Visual Studio,在这种情况下我安装了
我刚开始使用 libgdx 创建游戏。这是一个使用 scene2d ui 的自上而下的 2d 射击游戏。现在我想,我可以在某些层面上添加黑暗和光明,但我不想使用 box2d 重写所有内容。我不需要逼真
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试将我的 Windows Phone 8 Silverlight 应用程序转换为 8.1 Phone 应用程序作为通用应用程序的一部分。我不知道这是否相关,因为这是我第一次尝试正确实现 Vie
我收到以下消息,在 Spring Cloud 数据流中运行任务。 DEBUG 13167 --- [spring_batch146] com.zaxxer.hikari.pool.HikariPool
我使用带有中继器控件的 jQuery Light Slider 来显示数据库中的图像,如下所示: '> ' run
我熟悉 MVVM Light 工具包的 ViewModelBase、Message,但不熟悉 ViewModelLocator。在我的应用程序中有 Singleton ViewModel,例如 Pri
我是 MVVM 的新手,所以如果这个问题有一个简单的答案,我深表歉意,但我无法通过搜索 Google 来解决这个问题。 所以,基本上,我正在使用 MVVM Light 制作 Windows 10 通用
我已经创建了我的第一个 MVVMLight 项目,我有一个问题: 我有一个按钮,上面绑定(bind)了一个命令。当命令执行时,在不同的用例中,我必须向最终用户获取/提供信息,例如: 如果项目是新的,询
我正在通过播放框架和 mariadb 客户端使用 hikari 池连接,因为我已经定期更新它们(播放 2.6.5 -> 2.6.6 和 mariadb 2.1.1 -> 2.1.2 但不确定它是否相关
关于如何在 ViewModel 中定义一个 RelayCommand 有几个例子: 选项 1(惰性): /// /// Gets the LogOnCommand. /// /// The Log
我正在处理一个示例 MVVM Light 项目并正在实现 SimpleIoc ViewModelLocator。我已经能够构建一个 IRepositoryService,它从数据库(即公司、员工等)中
我们在 Windows 8.1 中有一个与 Win 10 兼容的工作项目。现在的要求是将此项目转换为 UWP。在早期的项目中,我们使用了 PRISM 作为 MVVM 的框架。现在的问题是,对于UWP应
在the latest release of MVVM Light note ,已表明 MVVM Light 现在提供“导航服务”。 但是我自己和我 friend google都找不到怎么用。 我可以
我是一名优秀的程序员,十分优秀!