问题标签 [slimdx]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2673 浏览

c# - 用于 C# SlimDX 游戏 UI 的内容

我目前正在使用 C#/SlimDX 开发 3d 游戏(目标是 Direct3D 9)。我一直在寻找合适的游戏 UI 工具包,但我无法下定决心。

游戏 UI 将用于角色扮演游戏,因此它会相当复杂,并且会涉及很多控件(文本框、库存网格、列表框、选择框、可滚动区域等)。

我之前(当我还在使用 C++/OpenGL 时)看过GameSWF并且非常喜欢这个想法,但对于我目前的游戏来说这是不可能的。

有谁知道与 SlimDX 一起使用的良好 GUI 工具包?

我对为此使用 WPF/Silverlight 特别感兴趣,因为两者都有很好的 IDE。但是快速的谷歌搜索并没有显示任何关于嵌入这些的信息。

0 投票
1 回答
718 浏览

.net - D3D 性能比较,着色器与内置着色器

我有一个内置在 D3D 中的正在运行的 3D 引擎(通过 SlimDX)。为了避免打断渲染管道,我将许多具有相同材质的对象组合成更大的网格(以减少状态切换)。这运作良好,并为我的需要提供了良好的性能水平。

我遇到的问题是,在运行期间,我需要更改那些较大批量网格的某些子集的材质属性。我为此使用了属性缓冲区,并且它运行得相当好。我之前一直在使用有限数量的活动属性(每个网格大约 5 个),但现在发现需要对材料有更多的变化(不同的不透明度/颜色混合),因此最终可能有数百个或更多的组合。而且由于这些更改发生在运行时,我无法在渲染开始之前将它们捆绑在一起。当然我可以重新构建网格,但我宁愿不这样做,因为它很慢,并且需要以交互速度在材质之间切换回来和第四次。

所以我的问题是,最好的路线是什么?

  • 我是否应该实现一个更强大的属性处理系统,根据需要使用可用的属性 ID 动态屏蔽面部,然后在完成后重置它们?我听说属性缓冲区中的碎片会产生额外的性能影响,我也不确定后续 DrawSubset() 调用之间的材料切换(即何时太多以及何时应该优化我的属性数组?)。有这方面经验的人吗?

  • 我的另一个想法是使用参数化像素着色器。我不需要任何花哨的效果,只需要最低限度(当前是内置的平面着色器,仅具有颜色和某些对象的透明度),因此着色器模型 1 足以满足我的需求。这里的想法是使用一个通用着色器,而不是在调用之间切换材质,只需更改一些着色器参数。但我不知道这是否比切换材质更快和/或可编程着色器是否比内置着色器慢(给出相同的结果)。

我也很好奇切换网格或在一个大网格中绘制不同子集之间的性能差异(两种情况下的材质切换数量相同)。

我知道这些问题在 GFX 卡及其各自的性能/年龄之间可能会有所不同,但我只是在这里寻找一般指导方针,了解最关注什么(即哪种类型的状态开关/CPU 干扰最大) GPU命中)。内存也是一个问题,因此任何复制整个(或大部分)网格的实现对我来说都是不可能的。

我的重点是较旧(5 年)/功能较差/集成 GFX 卡的性能,而不一定是顶级游戏玩家卡或工作站卡(如 Quadro)。我猜这可能会根据特定板上着色器性能的好坏来使用着色器来制造或破坏解决方案。

非常感谢任何和所有建议和反馈。

提前谢谢了!

0 投票
3 回答
249 浏览

c# - GC 收集...什么?

我正在尝试优化我的引擎(C# + SlimDX)以尽可能减少分配(以防止 GC 过于频繁地触发),并使用一个分析器作为指导,该分析器为我提供了生成垃圾对象的位置。它进展顺利(从每 5 秒垃圾 20 MB 下降到每 1 分半垃圾 8 MB(是的,它几乎没有优化 XD))有一种方法我找不到任何声明的东西,我没有不知道该怎么办。似乎此方法在其主体中(而不是在被调用的函数上)每次执行都会生成 2 个垃圾对象:

有人可以指导我理解为什么这个函数会生成要被垃圾的对象吗?我真的没有头绪。

备注:

由于缓存,永远不会调用新的 byte[Size]。MathHelper 函数只是将每个元素(单个)从一个对象复制到另一个对象,而无需创建任何内容。base.Update() 几乎什么都不做(无论如何都是从我的引擎中的 ALL 对象派生的,但只有在这里我有垃圾对象)

谢谢!!!

编辑:

这是 LockData() 的代码。我认为它不会产生任何东西:|

0 投票
1 回答
523 浏览

c# - 创建 DirectX 设备后,秒表返回整数

这个问题很“简单”。我有一个引擎,可以在 C# 中使用带有 SlimDX 的 DirectX9 和 DirectX10。我使用 Stopwatch 类来计时游戏并测试一些例程的速度。奇怪的是,在创建 DirectX9 之后,秒表的浮点数变得疯狂,GetTimeStamp()/Frequency 除法只返回整数值(单个与 0.000000)。为什么这个?请注意,使用 DirectX10,此问题不存在。(如果我在 DirectX9 中打开设备之前进行检查,它可以工作,就在不这样做之后。)

这是我用于两个版本(DirectX10 和 DirectX9)的代码

有什么线索吗?

编辑:我使用 QueryPerformanceCounter 进行了测试,但结果是一样的。在创建 DirectX9 设备之前完美计算,之后只有整数。

EDIT2:经过一些测试,我设法让它显示一些浮点值,但它们在精度上与 DirectX10 完全不同。

这是一些例子:

DirectX10

表单创建:110.09241
LoadContent Full:738.64486
LoadContent ContentManager:593.57572

DirectX9

表单创建:112.45000
LoadContent Full:489.50000
LoadContent ContentManager:355.50000

EDIT3:在另一台机器上测试,结果是一样的......在创建设备之前一切正常,只有整数......

0 投票
1 回答
673 浏览

c# - 如何在 DirectX 中通过网络摄像头帧渲染 3d 场景?

我正在使用 AForge 捕获网络摄像头,因此我将每一帧都作为位图。我想在它上面渲染一些场景。目前我正在通过 C# 面板控件渲染 DirectX (SlimDX) 场景。

是否有可能将位图放入 ZBuffer 或其他方式来实现它?

0 投票
2 回答
1278 浏览

c# - 什么是与 api 无关的顶点处理的良好代码结构?

目前正在使用 C# 开发 3D 媒体引擎,我遇到了一个小难题。我已经弄清楚了我的渲染循环,我得到了一个很棒的插件架构和内容管理系统,甚至还有一个材料管道都计划好了。然后引擎计划使用 DirectX 和 OpenGL(通过“渲染器”插件),以及两个 API 的可编程管道。

无论如何,本周初我开始研究用于处理顶点的引擎抽象层(我已经为此担心了好几个星期了)。正如你们中的一些人所知,图形 API 之间的顶点处理完全不相关或相同。好吧,有点相关;),但不一样。在 OpenGL 中处理顶点非常简单,您创建自定义顶点结构,将其发送到 GPU,然后让着色器处理其余部分。这对于灵活的图形管道来说是完美的,OpenGL 不需要知道每个顶点包含哪些元素。另一方面,DirectX 要求我们为每个顶点结构创建声明,然后将它们发送到 GPU。

问题是我不知道正在传递什么类型的顶点结构,我绝对希望避免创建涉及通过枚举和一些抽象的“VertexDeclaration”类声明顶点的每个元素的抽象层;这会导致一些问题:

1) 至少可以说获取顶点元素会很痛苦。我可以使用一些'VertexSemantic'并询问顶点'a - z'的位置,但是当为骨骼动画之类的东西处理大量顶点时,它可能会有很多开销。

2) 考虑到引擎的主要关注点是“新手”,用户不太友好。我希望用户能够创建自定义顶点和网格缓冲区,而无需声明大量对象,从而消耗宝贵的开发时间。

3)更多?

现在我可以对属性做一些事情,然后在 DirectX 渲染器中为顶点结构创建声明。例如,继续创建一些枚举:

现在我可以创建一个属性,用户可以将其应用于顶点结构中每个元素的“字段”:

自定义顶点结构的示例:

这会很好。在 DirectX 插件(渲染器)中,我可以只创建一个实用程序类,该类可以为每种结构类型创建语义,然后缓存数据,因此不必为每个顶点重新创建声明。

我什至可以向 ELementUsage 添加一个 NONE 枚举值,以便可以将自定义值用于任何含义......但它们只能在 OpenGL 中工作,因为 DirectX 要求您标记每个顶点......除非我有什么失踪。

我的问题:

有没有更好的方法来解决这个问题(除了使用属性)?有没有办法避免在 DirectX 中使用 VertexDeclarations?关于“我的”问题,您有什么不明白的地方吗?

编辑:

使用属性的一个问题是从每个顶点获取元素数据。假设我想获取网格缓冲区中每个顶点的位置。由于我使用属性,我不能只做'vertex.Position',我必须创建一个可以从顶点结构中提取字段引用的实用程序方法,例如'Utility.GetElement(vertex,ElementUsage.POSITION)' . 此方法需要使用反射首先找到属性,然后返回对字段值的引用。甚至(我认为)不可能设置该值?

另一种方法是创建一个 IElement 接口并实现每个元素(Positon、Normal 等)。该接口可以具有 Name 属性,我可以直接在继承的元素结构中返回它,就像 PositionElements 的 Name 属性只会返回“Positon”。

接下来,我可以将 IElement 数组保存在 Vertex 结构中,该结构包含 AddElement(IElement)、GetElement(string name)、GetElement(int index)、Insert、Replace 等方法。我将实现 DirectX 已知的所有元素,以便渲染器插件可以解析一个顶点结构来创建一个顶点声明数组。

问题是我不确定数组“[]”是否可以用作顶点元素数据。比如,数组包含哪些其他字节(如果有)会阻碍我将 Vertex 结构(包含 IElement 数组)直接传递给 DirectX,然后传递给 GPU?

以这种方式实现它对于我需要它来说绝对是完美的。另一个问题是 IElement(元素)的继承类型可以是一个类,还是元素值必须是值类型?

0 投票
3 回答
8641 浏览

c# - WPF 控件中的 SlimDX 视口

我正在从 WinForms/XNA 过渡到 WPF/SlimDX,因为:

  • a) WPF 优于 WinForms 的所有好处(但学习曲线 = 哎哟!)
  • b) 我想将多个 SlimDX 视口附加到面板。XNA 有 1 个“游戏”屏幕。
  • c,最后也是最少的)DirectX 10 支持

我以前的所有 XNA 代码都是用 C# 编写的。我无法弄清楚如何将其移植到高级别的 SlimDX 和 WPF。我已经疯狂地搜索了。我发现的最接近的是:

1) http://www.gamedev.net/community/forums/topic.asp?topic_id=507941 许多文章都指向这个讨论,但是它不完整,我无法弄清楚 XAML,之后我得到设备错误附加所有遗漏的 _slimDXDevice 和 Window1 事件。

2) http://www.codeproject.com/KB/WPF/D3DImage.aspx 本文假设用户正在移植C++。我正在移植非常接近 MDX 代码的 XNA 代码。

如果我有一个 WPF 表单,它带有一个自定义的 SlimDX 驱动的视口,它只是一个蓝框,我可以从那里开始。在 XNA 中,我渲染了许多单独的 RenderTargets 并将它们放置在整个屏幕上,现在我想将它们附加到控件上。但首先,只有 1 个蓝盒子!:D

有任何想法吗?我觉得这要么很简单,要么我缺少一些“千篇一律”的代码。非常感激!

0 投票
2 回答
112 浏览

c# - 如果我要破坏我最初为其创建设备的表面(表格),我该怎么办......?

假设我有一个基于 SlimDX 的游戏编辑器。我有一个 DeviceContext 实例,它基本上控制设备的所有状态,处理丢失的设备,创建它等。编辑器并不总是在渲染发生的地方打开一个视口。相反,它包含各种编辑器、场景编辑器、纹理查看器/编辑器、动画编辑器、材质编辑器等。

现在假设用户打开了 SceneEditor(一个对话框,其中四个视图呈现到面板中)。当编辑器被实例化时,它会从 DeviceContext 中获取一个引用,如果找到“null”,它会调用 context.CreateDevice(Control ctrl)。此方法“确保”设备不会丢失、无效或处置。如果是这样,它会根据正在发生的事情来处理它。现在编辑器在创建/重置设备时向控件(面板)发送“CreateDevice”方法,该控件是代表 TopLeft 视图的面板。接下来,它从上下文中获取“设备”引用,然后创建它的交换链视图(作为其他三个视口面板)。

现在假设用户打开了 ModelViewer 对话框。这也确保了设备实例不是 'null' ,如果是,则调用 DeviceContext.CreateDevice(ModelViewPanel) 并从中获取设备引用。如果 Device 不为空,它会为其视图创建一个交换链(模型将在其中渲染)。

好的,所以我们有一个带有四个视图的场景编辑器(TopLeft Panel 是用于创建 Device 对象的控件)和三个其他 Panel 对象创建为交换链。接下来我们有用户打开的 ModelViewer。这有一个作为交换链创建的面板。

我的问题是:由于场景编辑器拥有最初创建设备实例的控件,如果用户关闭场景编辑器我该怎么办?我是调用Devi)ce.Reset() 还是使用ModelViewer 的显示参数创建一个“新的”Device()'?

如果有不明白的地方,请要求重新考虑问题,谢谢。

0 投票
3 回答
6723 浏览

c# - 使用 WPF 和 SlimDx (DirectX 10/11)

我现在将 SlimDX 与 WinForms 一起使用了一段时间,但现在想切换到 WPF。但是,我不知道如何让 DX10/11 与 WPF 一起工作。SlimDX 的 2 月版本提供了一个 WPF 示例,但它仅适用于 DX 9。我找到了以下解决方案:http: //jmorrill.hjtcentral.com/Home/tabid/428/EntryId/437/Direct3D-10-11-Direct2D-in-WPF.aspx 但无法使其与 SlimDX 一起使用。我的主要问题是共享资源句柄,因为我不知道如何从 SlimDX 纹理中检索共享句柄。我找不到有关此主题的任何信息。

在 C++ 中,代码如下所示:

基本上,我想做的(因为我认为这是解决方案)是在 Direct3d9DeviceEx(用于渲染 WPF D3DImage)和 Direct3d10Device(我的场景的纹理渲染目标)之间共享纹理。

非常感谢任何正确方向的指针。

0 投票
3 回答
11958 浏览

c# - SlimDX Device.Reset 崩溃并出现“D3DERR_INVALIDCALL: Invalid call (-2005530516)”错误

我们最近从VS 2005( VS 2008Windows XP) 升级。我们SlimDx在我们的一个项目中使用。升级后一切正常,除了我的恢复功能,它在设备丢失/设备重置时调用,它会崩溃

D3DERR_INVALIDCALL:无效调用 (-2005530516)

我使用Ctrl- Alt-Del然后Escape模拟设备丢失。

这与VS 2008它过去工作得很好有关VS 2005吗?