- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的渲染过程,该过程将一组顶点发送到几何着色器并根据该信息渲染精灵。
小应用程序的内存使用量不断增加。我使用_CrtDumpMemoryLeaks()
和Visual Leak Detector进行了快速测试,它们都声称没有泄漏。
我有一个设备和一个充满顶点信息的容器:
ID3D10Device* pD3DDevice;
std::vector<SpriteVertex>* sprites;
RenderSprites()
方法中,我注释掉了几乎所有内容,直到泄漏停止为止(渲染也是如此;)
void DirectX10Renderer::RenderSprites()
{
D3D10_SUBRESOURCE_DATA initData;
initData.pSysMem = &((*sprites)[0]);
D3D10_BUFFER_DESC bd;
bd.Usage = D3D10_USAGE_DEFAULT;
bd.ByteWidth = sizeof(SpriteVertex)*(numSprites);
bd.BindFlags = D3D10_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;
bd.MiscFlags = 0;
// As soon as the following line is uncommented, memory starts leaking
pD3DDevice->CreateBuffer(&bd, &initData, &m_SpriteBuffer)); // <-- this is leaking
// the rest of the rendering code is for now commented out
}
最佳答案
由于其他答案已迅速提出了解决方案,而且评论也太短了(在这里是)另一种快捷方式。 您询问在运行时更新所需要的缓冲区还需要做什么:
您可以将缓冲区使用率从D3D10_USAGE_DEFAULT
(仅GPU读/写)更改为D3D10_USAGE_DYNAMIC
,从而使CopyResource()
和CopySubresourceRegion()
等功能正常工作。您可以更新部分或整个缓冲区等。这会影响性能,但这是可以预料的,因为动态固有地比静态on-initialization-constant缓冲区贵。我会避免过多使用技术,而将调查的乐趣留给您。
关于开放问题的长答案
Yarrr,我很高兴,提供了新数据。和互补的朗姆 cask 。
我将尝试提供更多有关操作方法背后原因的信息,但仍会让您阅读时保持乐趣。包括Wikipedia在内的各种网站从与计算机科学相关的所有内容中汲取了乐趣。关键是使程序员直观地了解其原因,并让他分析该如何应对。就像数学中的一个简单概念一样,全等的Paraletope对初学者来说充其量只能说是神秘的,每单位时间产生大量的脏话。一百万次对我的证明,对动机的理解对正确理解有很大帮助。
内存泄漏问题是由以下事实引起的:您没有像其他人所说的那样正确地管理内存。通常,如果您有一个指向Microsoft原始内容的指针(通常是COM接口(interface)),则是否需要担心内存(当经典的C / C++指针不像new,delete,malloc等运行时)是一个很好的指示符它可以调解您与基础COM组件实例之间(或,如果可能的话,则是COM对象)之间的协商。这还包括您不认识的人开发的其他您不完全理解的API。但是,让我们谈谈COM和第一个怪癖-内存管理。实际上,这很简单,如果您采用特殊的创建/初始化方法,则它与经典的C++对象并没有真正的区别。
尽管本身没有手动分配缓冲区(手头的情况),但至少以经典的C / C++方式,任何在COM兼容接口(interface)上运行的东西(等等,我会继续讲),这些接口(interface)工作的初始空指针是,很有可能是,它在完成后依赖您调用Release()
函数。Release()
是我们都学会珍惜和喜爱的delete
关键字的直接翻译。因此,是的,请确保通过查询各种创建函数(等同于构造函数)来遵循Microsoft的指令来管理其获取的COM对象,这些函数将用实际初始化的COM组件实例或对象的地址填充接口(interface)指针。为了将来的引用和好奇心,每个COM接口(interface)都从IUnknown
派生而来,它给它提供了Release()
(并要求重写它以解决继承组件的新依赖性)和其他功能,例如引用计数。
为什么对COM大惊小怪?
许多Microsoft API依赖于/基于COM(组件对象模型),这是它们实现通常的接口(interface)驱动代码的方式,在纯C++中,这些代码是由抽象类以及带有vtables和继承的快乐时光来完成的,该驱动器驱动了多态性。但是,您一定很好奇为什么不直接使用C++?您会发现,在COM刚发布时,DirectX诞生之初就已经很老了(想想1994./1995。),它是将来重申COM基本思想的自然选择。
最初,COM的开发是为了协助跨工具协作(Microsoft Office套件),或更专业的是,进程间通信。在该购物篮中,您也可以删除OLE。由此,Microsoft的软件工程师看到了进一步扩展此功能的潜力。推理认为可以以COM组件的形式创建各种资源,这些资源将响应通过COM组件首次亮相以解决问题的语言访问的标准化接口(interface)。这样,Microsoft可以将他们的许多工作封装在可扩展的格式中,为它分配各种唯一的标识符(__uuidof(),您已经发现过,这就是COM注册/跟踪所有类的方式),从而提供了一种跨语言解决方案这将使遵循COM规则的其他地方编译的内容能够以完全不同的语言工作。
实际上,它已经在其基础上发展壮大,可以提供跨流程的合作,反之亦然。它还具有各种问题,这些问题与OS开发和共享功能引起的各种开发问题有关(例如可重用的交互,打开文件对话框就是一个著名的例子)。自然,DirectX(例如ActiveX)完美地适合了这张图片。它们为操作系统提供了有关诸如游戏和模拟之类的高交互性软件的通用解决方案。
这就是为什么您在ID3D10Device
中看到“I”前缀的原因,该前缀代表Interface,特别是针对COM组件的一个前缀,它解决了实际的实现。您通过需要GUID标识的统一函数调用(指向接口(interface)指针的指针)连接COM组件的实例,然后根据您提供的描述取回工作的D3D10设备。这就是为什么还要提供实际的指针作为LPVOID的原因(或者基本上是说这里是字节,必须要做的事情)。如果您的用法正确,则基础实现将为您正确解决此问题,并使您的接口(interface)指针起作用。基本上,获取功能正常的COM实例的查询使引用随AddRef()
一起上升,而随着Release()
函数而下降。类似于保留释放的概念。
而且通常将所有这些组件放入一堆DLL中,这些DLL已“呈现”以进行正确的版本控制而没有问题。而且您得到了不错的API实现,说实话,这还不错。其实很漂亮。
.NET和COM之间的“差异”
如今,它的一些主要功能可能使那些一眼意识到.NET的人感到困惑,但是应该指出,COM是.NET的前身(因此,几乎只是暂时的前身,它们共享的很少,令人惊讶)。 (自2000年以来一直在这里)。还应该注意的是,COM的今天的功能集有些偶然,而.NET框架是经过有意开发的,旨在为所有使用Windows的开发人员提供跨语言标准平台。在最初实现后,COM的潜力就显现出来了。 .NET是由潜力和需求驱动的。
对于像Windows这样广泛使用的平台,这样的决定是合乎逻辑的,您拥有许多精通不同语言的开发人员。通过制作符合CLS的组件,您可以享受以许多不同的.NET语言编译的许多解决方案-缩短了开发时间,并实际上从性能上受益。例如,一些使用C#(。NET语言)的数学函数可解析为实际使用C / C++编写的外部函数,速度更快(pow()是此示例)。
更重要的是,.NET不仅超越了COM(如果他们必须“竞争”,那几乎是毫无意义的),而且它们在做事方式上也有根本不同。这就是Microsoft采取各种方式将COM与.NET连接,将其包装而不会损坏.NET框架的核心体系结构的原因。
如果您不了解它,那么这里只是个简单的介绍,简化为使其易于使用,整本书都以COM主题撰写。使用它需要更简单,直观的理解。希望对您有所帮助,并祝您编程愉快。并尽量不要在render函数中创建内容,特别是如果您负责它的内存管理时。
关于c++ - 创建DirectX 10缓冲区时出现内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10044638/
我的应用程序从一个有 5 个选项卡的选项卡栏 Controller 开始。一开始,第一个出现了它的名字,但其他四个没有名字,直到我点击它们。然后根据用户使用的语言显示名称。如何在选项卡栏出现之前设置选
我有嵌套数组 json 对象(第 1 层、第 2 层和第 3 层)。我的问题是数据表没有出现。任何相关的 CDN 均已导入。该表仅显示部分。我引用了很多网站,但都没有解决我的问题。 之前我使用标准表来
我正在尝试设置要显示的 Parse PFLoginViewController。这是我的一个 View Controller 的类。 import UIKit import Parse import
我遇到了这个问题,我绘制的对象没有出现在 GUI 中。我知道它正在被处理,因为数据被推送到日志文件。但是,图形没有出现。 这是我的一些代码: public static void main(Strin
我有一个树状图,其中包含出现这样的词...... TreeMap occurrence = new TreeMap (); 字符串 = 单词 整数 = 出现次数。 我如何获得最大出现次数 - 整数,
因此,我提示用户输入变量。如果变量小于 0 且大于 10。如果用户输入 10,我想要求用户再次输入数字。我问时间的时候输入4,它说你输入错误。但在第二次尝试时效果很好。例如:如果我输入 25,它会打印
我已经用 css overflow 属性做了一个例子。在这个例子中我遇到了一个溢出滚动的问题。滚动条出现了,但没有工作意味着每当将光标移动到滚动条时,在这个滚动条不活动的时间。我对此一无所知,所以请帮
我现在正在做一个元素。当您单击一个元素时,会出现以下信息,我想知道如何在您单击下一个元素而不重新单击同一元素时使其消失....例如,我的元素中有披萨,我想单击肉披萨看到浇头然后点击奶酪披萨看到浇头和肉
我有一个路由器模块,它将主题与正则表达式进行比较,并将出现的事件与一致的键掩码链接起来。 (它是一个简单的 url 路由过滤,如 symfony http://symfony.com/doc/curr
这个问题在这里已经有了答案: 9年前关闭。 Possible Duplicate: mysql_fetch_array() expects parameter 1 to be resource, bo
我在底部有一个带有工具栏的 View ,我正在使用 NavigationLink 导航到该 View 。但是当 View 出现时,工具栏显示得有点太低了。大约半秒钟后,它突然跳到位。它只会在应用程序启
我试图在我的应用程序上为背景音乐添加一个 AVAudioPlayer,我正在主屏幕上启动播放器,尝试在应用程序打开时开始播放但出现意外行为... 它播放并立即不断创建新玩家并播放这些玩家,因此同时播放
这是获取一个数字,获取其阶乘并将其加倍,但是由于基本情况,如果您输入 0,它会给出 2 作为答案,因此为了绕过它,我使用了 if 语句,但收到错误输入“if”时解析错误。如果你们能提供帮助,我真的很感
暂停期间抛出异常 android.os.DeadObjectException 在 android.os.BinderProxy.transactNative( native 方法) 在 androi
我已经为猜词游戏编写了一些代码。它从用户输入中读取字符并在单词中搜索该字符;根据字符是否在单词中,程序返回并控制一些变量。 代码如下: import java.util.Random; import
我是自动化领域的新手。这是我的简单 TestNG 登录代码,当我以 TestNG 身份运行该代码时,它会出现 java.lang.NullPointerException,双击它会突出显示我导航到 U
我是c#程序员,我习惯了c#的封装语法和其他东西。但是现在,由于某些原因,我应该用java写一些东西,我现在正在练习java一天!我要创建一个为我自己创建一个虚拟项目,以便让自己更熟悉 Java 的
我正在使用 Intellij,我的源类是 main.com.coding,我的资源文件是 main.com.testing。我将 spring.xml 文件放入资源文件中。 我的测试类位于 test.
我想要我的tests folder separate到我的应用程序代码。我的项目结构是这样的 myproject/ myproject/ myproject.py moduleon
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 6 年前。 因此,我尝试比较 2 个值,一个
我是一名优秀的程序员,十分优秀!