3D Render
记录最近遇到的问题:
1:崩溃问题
由于高频率获取DC异常导致。
void D3D11Texture2D::Copy2Window(void* srcdc, uint32_t left, uint32_t top, uint32_t dw, uint32_t dh)
{
IDXGISurface1* pSurface1 = NULL;
HRESULT hr = mTex->QueryInterface(__uuidof(IDXGISurface1), (void**)&pSurface1);
if (hr == S_OK)
{
HDC srcDC = NULL;
hr = pSurface1->GetDC(false, &srcDC);
if (hr == S_OK)
{
BitBlt((HDC)srcdc, left, top, dw, dh, srcDC, 0, 0, SRCCOPY);
pSurface1->ReleaseDC(NULL);
}
}
}
目的:将最终的像素图像copy到窗口上,该方式经常崩溃
解决方法:创建一个新的窗口(该窗口为需要显示的窗口的子窗口),使用rtt渲染到新窗口、
m_pForeTex = (IOEye::D3D11Texture2D*)m_pRender->CreateTexture(IOEye::TT_TextureRT, \
m_nWidth, m_nHeight, \
IOEye::TF_RGBA32, IOEye::TF_SharedResource);
::SendMessage(m_hPreviewWnd, WM_SETPREVIEWTEXTURE, 0, (LPARAM)m_pForeTex->GetSharedHandle());
::SendMessage(::FindWindowEx(NULL,NULL,_T("IOEHdmiWndClass"),_T("IOEHDMI")), WM_SETPREVIEWTEXTURE, 0, (LPARAM)m_pForeTex->GetSharedHandle());
Texture* D3D11RenderDevice::CreateTexture(TextureType tt, int tw, int th, TextureFormat tf, TextureFlag tflag)
{
switch (tt)
{
case TT_Texture1D:
{
return 0;
}
break;
case TT_Texture2D:
{
D3D11Texture2D* texture = new D3D11Texture2D(this);
D3D11_TEXTURE2D_DESC desc = { 0 };
memset(&desc, 0, sizeof(desc));
desc.ArraySize = 1;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED;
desc.MiscFlags = 0;
//desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
desc.Width = tw;
desc.Height = th;
desc.MipLevels = 1;
desc.MiscFlags = 0;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
switch (tf)
{
case TF_RGBA32:
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
break;
case TF_BGRA32:
desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
break;
default:
desc.Format = DXGI_FORMAT_UNKNOWN;
break;
}
HRESULT hr = mDevice->CreateTexture2D(&desc, NULL, &(texture->mTex));
if (FAILED(hr))
{
LogError(_T("CreateTexture2D failed."), hr);
return NULL;
}
hr = mDevice->CreateShaderResourceView(texture->mTex, 0, &(texture->mTexSv));
if (FAILED(hr))
{
LogError(_T("CreateShaderResourceView failed."), hr);
texture->mTex->Release();
return NULL;
}
texture->mWidth = tw;
texture->mHeight = th;
texture->mSamples = 1;
texture->mFormat = tf;
return texture;
}
case TT_TextureRT:
{
D3D11Texture2D* texture = new D3D11Texture2D(this);
D3D11_TEXTURE2D_DESC desc = { 0 };
memset(&desc, 0, sizeof(desc));
desc.ArraySize = 1;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.CPUAccessFlags = 0;
//desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
desc.Width = tw;
desc.Height = th;
desc.MipLevels = 1;
desc.MiscFlags = 0;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
if (tflag & TF_GDIResource)
{
desc.MiscFlags |= D3D11_RESOURCE_MISC_GDI_COMPATIBLE;
}
else if (tflag & TF_SharedResource)
{
desc.MiscFlags |= D3D11_RESOURCE_MISC_SHARED;
}
switch (tf)
{
case TF_RGBA32:
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
break;
case TF_BGRA32:
desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
break;
default:
desc.Format = DXGI_FORMAT_UNKNOWN;
break;
}
HRESULT hr = mDevice->CreateTexture2D(&desc, NULL, &(texture->mTex));
if (FAILED(hr))
{
LogError(_T("CreateTexture2D failed."), hr);
return NULL;
}
IDXGIResource* pDXGIResource = 0;
hr = texture->mTex->QueryInterface(__uuidof(IDXGIResource), (void **)&pDXGIResource);
if (FAILED(hr))
{
LogError(_T("CreateSharedHandle failed."), hr);
}
pDXGIResource->GetSharedHandle(&texture->mSharedHandle);
pDXGIResource->Release();
hr = mDevice->CreateShaderResourceView(texture->mTex, 0, &(texture->mTexSv));
if (FAILED(hr))
{
LogError(_T("CreateShaderResourceView failed."), hr);
texture->mTex->Release();
return NULL;
}
hr = mDevice->CreateRenderTargetView(texture->mTex, NULL, &texture->mTexRtv);
if (FAILED(hr))
{
LogError(_T("CreateRenderTargetView failed."), hr);
texture->mTex->Release();
return NULL;
}
texture->mWidth = tw;
texture->mHeight = th;
texture->mSamples = 1;
texture->mFormat = tf;
return texture;
}
default:
return NULL;
}
}
在其他的窗口获取该共享纹理,然后进行渲染;
m_hPreviewTextureHandle = (HANDLE)lParam;
m_pPreviewTexture = (IOEye::D3D11Texture2D*)m_pPreviewRender->CreateTexture(IOEye::TT_Texture2D, m_hPreviewTextureHandle);
m_pPreviewQuad->SetSubMeshTexture(0, m_pPreviewTexture);
2:增加HDMI输出(使用SDL方案发现map纹理过慢,4K画质需要200ms,导致卡顿,更改为开启一个新的进程使用共享纹理方案)
3:小纹理可拖动大小位置方案更改为直接使用大纹理(导致加载过慢,显存消耗过度)->进行资源释放,以减小资源的利用(任然效果不佳)->使用freeImage进行纹理裁剪,建立大量定点和索引,由于频繁创建顶点和纹理是的CPU频繁和GPU进行交互,导致创建顶点索引和纹理异常,更改为
(1):使用配置文件进行顶点计算出各个顶点坐标
(2):根据顶点进行纹理的裁剪,裁剪为小纹理
(3):根据顶点坐标一次性创建一个序列帧的所有顶点和索引
(4):然后更具图片的路径创建出静态纹理(将所有的操作提交给GPU,减少异常发生的可能)
由于创建顶点缓存等等是通过PCI_Express总线,速度相对于CPU访问缓存和GPU访问缓存非常慢,所以进行CPU GPU交互的时候非常容易异常
4:时间线逻辑的更改(设计变更)
3D Render的更多相关文章
- Python框架、库以及软件资源汇总
转自:http://developer.51cto.com/art/201507/483510.htm 很多来自世界各地的程序员不求回报的写代码为别人造轮子.贡献代码.开发框架.开放源代码使得分散在世 ...
- Awesome Python
Awesome Python A curated list of awesome Python frameworks, libraries, software and resources. Insp ...
- Machine and Deep Learning with Python
Machine and Deep Learning with Python Education Tutorials and courses Supervised learning superstiti ...
- Gazebo機器人仿真學習探索筆記(二)基本使用說明
在完成Gazebo7安裝後,需要熟悉Gazebo,方便之後使用. 部分源代碼可以參考:https://bitbucket.org/osrf/gazebo/src/ 如果還沒有安裝請參考之前內容完成安裝 ...
- Python开源框架、库、软件和资源大集合
A curated list of awesome Python frameworks, libraries, software and resources. Inspired by awesome- ...
- 【python】Python框架、库和软件资源大全
很多来自世界各地的程序员不求回报的写代码为别人造轮子.贡献代码.开发框架.开放源代码使得分散在世界各地的程序员们都能够贡献他们的代码与创新. Python就是这样一门受到全世界各地开源社区支持的语言. ...
- Python 库汇总英文版
Awesome Python A curated list of awesome Python frameworks, libraries, software and resources. Insp ...
- Intel Chipsets
http://en.wikipedia.org/wiki/Chipset Chipset From Wikipedia, the free encyclopedia A chipset is ...
- Python框架、库和软件资源大全(整理篇)
有少量修改,请访问原始链接.PythonWIn的exe安装包;http://www.lfd.uci.edu/~gohlke/pythonlibs/ 原文链接:codecloud.net/python- ...
随机推荐
- (libev) cannot allocate xxx bytes, aborting 问题的一种触发条件
最近在项目中使用了libev,遇到一个很奇怪的crash,服务器运行随机时间后有一定的概率奔溃,输出的最后一行log是: (libev) cannot allocate xxx bytes, abor ...
- HDU 3364
http://acm.hdu.edu.cn/showproblem.php?pid=3364 经典高斯消元解开关问题 m个开关控制n个灯,开始灯全灭,问到达目标状态有几种方法(每个开关至多一次操作,不 ...
- PyCharm Debug调试程序
步骤一:在代码区要进行调试的代码行左侧单击鼠标左键,添加调试断点符号 步骤二:右键单击源文件或代码区内部,弹出菜单,选择[Debug ***] 或在右上角工具栏区单击[debug]按钮,快捷键[shi ...
- Samsung_tiny4412(驱动笔记10)----mdev,bus,device,driver,platform
/*********************************************************************************** * * mdev,bus,de ...
- TJU Problem 1065 Factorial
注意数据范围,十位数以上就可以考虑long long 了,断点调试也十分重要. 原题: 1065. Factorial Time Limit: 1.0 Seconds Memory Limit ...
- HihoCoder - 1501:风格不统一如何写程序
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi写程序时习惯用蛇形命名法(snake case)为变量起名字,即用下划线将单词连接起来,例如:file_name. ...
- .NET 之 垃圾回收机制GC
一.GC的必要性 1.应用程序对资源操作,通常简单分为以下几个步骤:为对应的资源分配内存 → 初始化内存 → 使用资源 → 清理资源 → 释放内存. 2.应用程序对资源(内存使用)管理的方式,常见的一 ...
- 配置搭建与使用redis
redis单点.redis主从.redis哨兵 sentinel,redis集群cluster配置搭建与使用 redis是如今被互联网公司使用最广泛的一个中间件,我们打开GitHub搜索redis,边 ...
- HDU 4638 树状数组 想法题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4638 解题思路: 题意为询问一段区间里的数能组成多少段连续的数.先考虑从左往右一个数一个数添加,考虑当 ...
- CentOS7防止CC攻击防止SSH爆破采取的措施
准备工作 1.检查firewalld是否启用 #如果您已经安装iptables建议先关闭 service iptables stop #查看firewalld状态 firewall-cmd --sta ...