记录最近遇到的问题:

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的更多相关文章

  1. Python框架、库以及软件资源汇总

    转自:http://developer.51cto.com/art/201507/483510.htm 很多来自世界各地的程序员不求回报的写代码为别人造轮子.贡献代码.开发框架.开放源代码使得分散在世 ...

  2. Awesome Python

    Awesome Python  A curated list of awesome Python frameworks, libraries, software and resources. Insp ...

  3. Machine and Deep Learning with Python

    Machine and Deep Learning with Python Education Tutorials and courses Supervised learning superstiti ...

  4. Gazebo機器人仿真學習探索筆記(二)基本使用說明

    在完成Gazebo7安裝後,需要熟悉Gazebo,方便之後使用. 部分源代碼可以參考:https://bitbucket.org/osrf/gazebo/src/ 如果還沒有安裝請參考之前內容完成安裝 ...

  5. Python开源框架、库、软件和资源大集合

    A curated list of awesome Python frameworks, libraries, software and resources. Inspired by awesome- ...

  6. 【python】Python框架、库和软件资源大全

    很多来自世界各地的程序员不求回报的写代码为别人造轮子.贡献代码.开发框架.开放源代码使得分散在世界各地的程序员们都能够贡献他们的代码与创新. Python就是这样一门受到全世界各地开源社区支持的语言. ...

  7. Python 库汇总英文版

    Awesome Python  A curated list of awesome Python frameworks, libraries, software and resources. Insp ...

  8. Intel Chipsets

    http://en.wikipedia.org/wiki/Chipset Chipset From Wikipedia, the free encyclopedia     A chipset is ...

  9. Python框架、库和软件资源大全(整理篇)

    有少量修改,请访问原始链接.PythonWIn的exe安装包;http://www.lfd.uci.edu/~gohlke/pythonlibs/ 原文链接:codecloud.net/python- ...

随机推荐

  1. ssh key建立后不能clone问题

    在建立了ssh密钥对之后,要将私钥添加,公钥key添加到gitlab的ssh keys里. 添加成功后,这个时候,你可以clone了! 总结:如果是遇到重复输入密码的情况,可能是ssh-key,的私钥 ...

  2. 【Genymotion】add a new virtual device 失败

    Genymotion 新增虚拟设备(模拟器)时,由于网络原因,总是下载失败,如图: 下载失败提示“Unable to create virtual device: Connection timeout ...

  3. C# 历史曲线控件 基于时间的曲线控件 可交互的高级曲线控件 HslControls曲线控件使用教程

    本篇博客主要对 HslControls 中的曲线控件做一个详细的教程说明,大家可以根据下面的教程开发出高质量的曲线控件 Prepare 先从nuget下载到组件,然后就可以使用组件里的各种组件信息了. ...

  4. JQuery - Tab Control

    http://jqueryui.com/tabs/ <!doctype html> <html lang="en"> <head> <me ...

  5. JavaScript 之arguments、caller 和 callee 介绍

    1.前言 arguments, caller ,   callee 是什么? 在javascript 中有什么样的作用?本篇会对于此做一些基本介绍. 2. arguments arguments:  ...

  6. C++ 拷贝构造函数和赋值构造函数

    转自:http://blog.chinaunix.net/uid-28662931-id-3496326.html 一.拷贝构造函数 int main(int argc, char * argv[]) ...

  7. LeetCode Pascal's Triangle && Pascal's Triangle II Python

    Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, given ...

  8. Java调用.NET webservice方法的几种方式

    最近做项目,涉及到web-service调用,现学了一个星期,现简单的做一个小结.下面实现的是对传喜物流系统(http://vip.cxcod.com/PodApi/GetPodStr.asmx?ws ...

  9. 防范SQL注入漏洞攻击

    原理:通过拼sql语句,在输入框里输入' ; SHOW TABLES;注入这样的代码, 防范:你把全部的特殊符号都过滤掉(如单引号,双引号),自然就不会被注入 使用mysql_real_escape_ ...

  10. h5 的 audio 标签知识点

    因为音频格式有版权,各浏览器使用不同的音频格式. 音频格式兼容性 音频格式 Chrome Firefox IE9 Opera Safari MP3 支持 不支持 支持 不支持 支持 OGG 支持 支持 ...