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- ...
随机推荐
- vue 登录验证引擎
1.router配置: 路由元信息 const router = new VueRouter({ routes: [ { path: '/foo', component: Foo, children: ...
- [Spring Boot] Spring Boot启动过程源码分析
关于Spring Boot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Spring-boot 1.5.6)的角度来看看Spring Boot的启动过程到底是怎么样的,为何以往纷繁复杂的配置到 ...
- 怎么使用C++标准库来实现二维数组
在编程里,像界面布局是二维的,那么常常使用二维数组来表示界面的元素,那么就需要使用二维的数组,在现在C++肯定是以标准库为基础了,不再使用C的二维数组,那么怎么样做呢?下面就使用vector来实现二维 ...
- UI基础:UITextField 分类: iOS学习-UI 2015-07-01 21:07 68人阅读 评论(0) 收藏
UITextField 继承自UIControl,他是在UILabel基础上,对了文本的编辑.可以允许用户输入和编辑文本 UITextField的使用步骤 1.创建控件 UITextField *te ...
- magento的必备插件(转)
标签: 插件 magento magento插件 必备插件 Magento插件 ,插件,我要常见Magento必备插件 .. 都是免费的Magento插件,多而杂,乡亲们自己挑~~ [因收集而强大 & ...
- 【opencv基础】opencv和dlib库中rectangle类型之间的转换
前言 最近使用dlib库的同时也会用到opencv,特别是由于对dlib库的画图函数不熟悉,都想着转换到opencv进行show.本文介绍一下两种开源库中rectangle类型之间的转换. 类型说明 ...
- eclipse 配置jdk和maven
准备工作:确保已安装好jdk和maven,并完全配置环境.若是没有请参考前两篇博客: jdk: http://www.cnblogs.com/qinbb/p/6861851.html maven ...
- java安装教程及环境配置
下载JDK(网上有很多,可以百度) 首先在非系统盘(系统盘通常是C盘)中,新建一个Java(可以是其他名称,必须是英文且名称中没有空格)文件夹,并在这个文件夹中创建JDK,JRE两个文件夹. 双击已下 ...
- LG3369 【模板】普通平衡树
题意 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1.若有多个相 ...
- oracle 查某一列有重复值的记录
-- 查找重复记录select names,num from test where rowid != (select max(rowid) from test b ...