﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Daywei0123-随笔分类-CODE</title><link>http://www.cppblog.com/Daywei0123/category/18175.html</link><description>技术追求卓越 梦想创造未来</description><language>zh-cn</language><lastBuildDate>Thu, 23 Aug 2012 03:24:23 GMT</lastBuildDate><pubDate>Thu, 23 Aug 2012 03:24:23 GMT</pubDate><ttl>60</ttl><item><title>How to create a Simple Lock Framework for C++ Synchronization</title><link>http://www.cppblog.com/Daywei0123/archive/2012/08/21/187849.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Tue, 21 Aug 2012 06:37:00 GMT</pubDate><guid>http://www.cppblog.com/Daywei0123/archive/2012/08/21/187849.html</guid><wfw:comment>http://www.cppblog.com/Daywei0123/comments/187849.html</wfw:comment><comments>http://www.cppblog.com/Daywei0123/archive/2012/08/21/187849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Daywei0123/comments/commentRss/187849.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Daywei0123/services/trackbacks/187849.html</trackback:ping><description><![CDATA[<a href="http://www.codeproject.com/Articles/421976/How-to-create-a-Simple-Lock-Framework-for-Cplusplu">How to create a Simple Lock Framework for C++ Synchronization</a><img src ="http://www.cppblog.com/Daywei0123/aggbug/187849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Daywei0123/" target="_blank">Daywei</a> 2012-08-21 14:37 <a href="http://www.cppblog.com/Daywei0123/archive/2012/08/21/187849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何从DirectX中获取图像</title><link>http://www.cppblog.com/Daywei0123/archive/2011/12/23/162678.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Fri, 23 Dec 2011 09:45:00 GMT</pubDate><guid>http://www.cppblog.com/Daywei0123/archive/2011/12/23/162678.html</guid><wfw:comment>http://www.cppblog.com/Daywei0123/comments/162678.html</wfw:comment><comments>http://www.cppblog.com/Daywei0123/archive/2011/12/23/162678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Daywei0123/comments/commentRss/162678.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Daywei0123/services/trackbacks/162678.html</trackback:ping><description><![CDATA[<div style="padding-bottom: 0px; overflow-y: auto; background-color: rgb(255,255,255); margin: 5px; padding-left: 0px; padding-right: 0px; font-family: Arial, Verdana, sans-serif; word-wrap: break-word; font-size: 12px; padding-top: 0px">
<p style="padding-bottom: 2px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><pre style="background-color: rgb(240,240,240); margin: 4px 0px" class="cpp" name="code"><br class="Apple-interchange-newline" />BOOL CD3DCameraViewWnd::GetImageInfo(DWORD* pPixelBuffer, int&amp; width,int&amp; height)
{
	BOOL result = FALSE;

	IDirect3DSurface9 *_surfaceback = NULL; 
	if (FAILED(m_pDevice-&gt;GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &amp;_surfaceback)))
	{
		result = FALSE;
	}
	  

	D3DSURFACE_DESC surfaceDesc; 
	if (!FAILED(_surfaceback-&gt;GetDesc(&amp;surfaceDesc)))
	{
		width = surfaceDesc.Width;
		height = surfaceDesc.Height;
	}

	D3DLOCKED_RECT lockedRect; 
	HRESULT hr = _surfaceback-&gt;LockRect( &amp;lockedRect,0, 0); /* pointer to receive locked data指向申请到的内存区域*/ /* lock entire surface*/// no lock flags specified 

	if (!FAILED(hr))
	{
		pPixelBuffer = (DWORD*)lockedRect.pBits;
		result = TRUE;
	}

	_surfaceback-&gt;UnlockRect();
	_surfaceback-&gt;Release();

	return result;
}</pre>
<p style="padding-bottom: 2px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><br /></p>但是这样存在着性能的问题，经测试获取一帧需要200ms左右，为什么会存在这样的问题？因为这边有资源锁定操作。 
<p>&nbsp;</p>
<p style="padding-bottom: 2px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px">
<p style="padding-bottom: 2px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px">现在关键的问题就在于,资源锁定的操作速度总是非常之慢.当然,你会跟我提, OpenGL似乎能够快捷地完成这项任务.但是,在Direct3D中,资源锁定操作确实是很慢的.这里面一个主要的原因是,API,驱动,以及硬件要处理一些不可回避的后台操作.那就是GPU与CPU是并行运行的,若不加任何措施,将引起类似多线程程序同步时的竞态条件的问题.</p>
<p style="padding-bottom: 2px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px">如果你试图去修改的资源正同时被一个位于GPU处理序列中的指令使用,那么整个渲染流程就会因为你的资源锁定而停顿或强制刷新(stalls and flushes).停顿(stall)会一直持续到你完成了对资源的修改并调用Unlock().而强制刷新(flush)则会要求GPU在你得到这个资源的访问权之前完成目前所有的任务.</p>
<p style="padding-bottom: 2px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px">如何去解决这个问题？下面的参考资料中有一些解决方案，我没有经过认真测试，我试了其中一个GetRenderTargetData 这样的一种方法 ，感觉不太好用，why请看Reference3</p>
<p style="padding-bottom: 2px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><br /></p>
<p style="padding-bottom: 2px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px">下面给出我的解决方案</p>
<p style="padding-bottom: 2px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><pre style="background-color: rgb(240,240,240); margin: 4px 0px" class="cpp" name="code">BOOL CD3DCameraViewWnd::GetImageInfo(DWORD* pPixelBuffer, int&amp; width,int&amp; height)
{
	BOOL result = FALSE;

	IDirect3DSurface9 *_surfaceback = NULL; 
	if (FAILED(m_pDevice-&gt;GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &amp;_surfaceback)))
	{
		result = FALSE;
	}
	  

	D3DSURFACE_DESC surfaceDesc; 
	if (!FAILED(_surfaceback-&gt;GetDesc(&amp;surfaceDesc)))
	{
		width = surfaceDesc.Width;
		height = surfaceDesc.Height;
	}</pre><pre style="background-color: rgb(240,240,240); margin: 4px 0px" class="cpp" name="code"><br /></pre><pre style="background-color: rgb(240,240,240); margin: 4px 0px" class="cpp" name="code"><span style="white-space: pre" class="Apple-tab-span">	</span>LPDIREC3DSURFACE9 surf;</pre><pre style="background-color: rgb(240,240,240); margin: 4px 0px" class="cpp" name="code"><span style="white-space: pre" class="Apple-tab-span">	</span>if(FAILED(m_pDevice-&gt;CreateOffscreenPlainSurface(width, height,D3DFMT_A8R8G8B8,D3DPOOL_SYSTEMMEM, &amp;surf,NULL)))</pre><pre style="background-color: rgb(240,240,240); margin: 4px 0px" class="cpp" name="code"><span style="white-space: pre" class="Apple-tab-span">	</span>{</pre><pre style="background-color: rgb(240,240,240); margin: 4px 0px" class="cpp" name="code"><span style="white-space: pre" class="Apple-tab-span">		</span>result = FALSE;</pre><pre style="background-color: rgb(240,240,240); margin: 4px 0px" class="cpp" name="code"><span style="white-space: pre" class="Apple-tab-span">	</span>}</pre><pre style="background-color: rgb(240,240,240); margin: 4px 0px" class="cpp" name="code"><span style="white-space: pre" class="Apple-tab-span">	</span>D3DXLoadSurfaceFromSurface(surf, NULL,NULL,_surfaceback,NULL,NULL,D3DX_FILTER_NONE,0);

	D3DLOCKED_RECT lockedRect; 
	HRESULT hr = surf-&gt;LockRect( &amp;lockedRect,0, 0); /* pointer to receive locked data指向申请到的内存区域*/ /* lock entire surface*/// no lock flags specified 

	if (!FAILED(hr))
	{
		pPixelBuffer = (DWORD*)lockedRect.pBits;
		result = TRUE;
	}

	surf-&gt;UnlockRect();</pre><pre style="background-color: rgb(240,240,240); margin: 4px 0px" class="cpp" name="code"><pre style="background-color: rgb(240,240,240); margin: 4px 0px" class="cpp" name="code"><span style="white-space: pre" class="Apple-tab-span">	</span>surf-&gt;Release();</pre>
	_surfaceback-&gt;Release();

	return result;
}</pre><br /><br />
<p>&nbsp;</p><br />
<p>&nbsp;</p>
<p style="padding-bottom: 2px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px">参考资料：Reference1.http://www.cnblogs.com/mixiyou/archive/2010/02/25/1673060.html</p>
<p style="padding-bottom: 2px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><span style="white-space: pre" class="Apple-tab-span"></span>&nbsp; &nbsp;Reference<span class="Apple-converted-space">&nbsp;</span>2.http://www.cnblogs.com/mixiyou/archive/2010/02/25/1673425.html</p>
<p style="padding-bottom: 2px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><span style="white-space: pre" class="Apple-tab-span"></span>&nbsp; &nbsp;Reference&nbsp;3.<a href="http://blog.csdn.net/Nightmare/article/details/1707362" _xhe_href="http://blog.csdn.net/Nightmare/article/details/1707362">http://blog.csdn.net/Nightmare/article/details/1707362</a></p>
<p style="padding-bottom: 2px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><span style="white-space: pre" class="Apple-tab-span"></span>&nbsp;&nbsp; Reference 4.<a href="http://www.cnblogs.com/lancidie/archive/2011/3/14.html" _xhe_href="http://www.cnblogs.com/lancidie/archive/2011/3/14.html">http://www.cnblogs.com/lancidie/archive/2011/3/14.html</a><br /></p></div> <img src ="http://www.cppblog.com/Daywei0123/aggbug/162678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Daywei0123/" target="_blank">Daywei</a> 2011-12-23 17:45 <a href="http://www.cppblog.com/Daywei0123/archive/2011/12/23/162678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQLite C++ Class</title><link>http://www.cppblog.com/Daywei0123/archive/2011/11/17/160348.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Thu, 17 Nov 2011 07:11:00 GMT</pubDate><guid>http://www.cppblog.com/Daywei0123/archive/2011/11/17/160348.html</guid><wfw:comment>http://www.cppblog.com/Daywei0123/comments/160348.html</wfw:comment><comments>http://www.cppblog.com/Daywei0123/archive/2011/11/17/160348.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Daywei0123/comments/commentRss/160348.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Daywei0123/services/trackbacks/160348.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->//////////////////////////////////////////////////////////////////////////////////&nbsp;CppSQLite3&nbs...&nbsp;&nbsp;<a href='http://www.cppblog.com/Daywei0123/archive/2011/11/17/160348.html'>阅读全文</a><img src ="http://www.cppblog.com/Daywei0123/aggbug/160348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Daywei0123/" target="_blank">Daywei</a> 2011-11-17 15:11 <a href="http://www.cppblog.com/Daywei0123/archive/2011/11/17/160348.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>