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- ...
随机推荐
- Bad update sites
Bad update sites com.genuitec.pulse2.client.common.launcher.BadUpdateSiteException Software being in ...
- vue-cli 添加less 以及sass
1.sasscnpm i node-sass --save-dev cnpm i sass-loader --save-dev2.less npm install less --save-dev np ...
- react 部分ES6写法
react+react-router+antd 栗子:https://github.com/Aquarius1993/reactApp 模块: 1. 引入模块 import React from 'r ...
- C#反射 字符串转为实体类,并做为参数传入泛型方法中使用
工作中有这样一个需求,有N张不同的报表,每张报表对应一个数据源,统计数据采用内存方式,首先在内在里定义了数据源对应实体.统计条件用lamdba表达式式实现,通过工具对单元格进行定义.在实现过程中针对每 ...
- CodeForces - 1087F:Rock-Paper-Scissors Champion(set&数状数组)
n players are going to play a rock-paper-scissors tournament. As you probably know, in a one-on-one ...
- ElasticSearch(七):ElasticSearch集群的搭建
由于资源有限,使用是一台机器上安装三个elasticSearch服务端组成的集群. 1. 安装elasticSearch6.3.2 将原本安装的elasticSearch6.3.2复制两份,分别重新命 ...
- 杭电oj2001-C语言
题目 题目 Problem Description 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离. Input 输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x ...
- JQuery 遮罩层弹窗
var str = "<div id=\"zhezhao\" style=\"display:none; background-color: rgba(0 ...
- bitset与取数凑数类问题
bitset是C++中的一个东西,定义在头文件#include<bitset>里 所以可以使用#include<bitset>解决取数类的问题https://www.nowco ...
- SysRq魔法键的使用
SysRq魔法键的使用 1.SysRq简介它能够在系统处于极端环境时响应按键并完成相应的处理.这在大多数时候有用.SysRq 经常被称为 Magic System Request,它被定义为一系列按键 ...