Tag: xna

C#/ XNA – 乘法比分区更快?

我最近看到一条推文让我很困惑(这是由XNA编码器在编写XNA游戏时发布的): 当天的微优化提示:在可能的情况下,在高频区域使用乘法而不是除法。 它的速度提高了几个周期。 我很惊讶,因为我一直认为编译器非常聪明(例如,使用位移),最近读了Shawn Hargreaves的一篇文章说了很多相同的事情 。 我想知道这有多少真相,因为我的游戏中有很多计算。 我询问,希望有一个样本,但原始的海报无法给出一个。 然而,他这样说: 不一定是“center = width / 2”之类的东西。 我已经确定“是的,这是值得的”。 🙂 所以,我很好奇…… 任何人都可以给出一些代码示例,您可以将分区更改为乘法并获得性能增益,而C#编译器本身无法执行相同的操作。

如何在C#中有效地处理许多更新对象?

我正在使用C#和XNA开发2D头顶射击游戏。 我有一个我称之为“子弹”的类,需要在每一秒钟内更新许多这些实例。 我这样做的第一种方法是拥有一个通用的子弹列表,并根据需要简单地移除和添加新的子弹。 但是在这样做的过程中,GC经常出现,我的游戏有一些周期性的生涩延迟。 (很多代码被删除了,但只想展示一个简单的代码片段) if (triggerButton) { bullets.Add(new bullet()); } if (bulletDestroyed) { bullets.Remove(bullet); } 我的第二个也是当前的尝试是有一个单独的通用Stack子弹,当我完成一个子弹时我会推动它,如果堆栈中有任何东西,当我需要一个新子弹时弹出子弹。 如果堆栈中没有任何内容,那么我将新的项目符号添加到列表中。 它似乎减少了生涩的滞后,但又一次,有时还会出现一些生涩的滞后(尽管我不知道它是否相关)。 if (triggerButton) { if (bulletStack.Count > 0) { bullet temp = bulletStack.Pop(); temp.resetPosition(); bullets.Add(temp); } else { bullets.Add(new bullet()); } } if (bulletDestroyed) { bulletStack.Push(bullet); bullets.Remove(bullet); } 所以,我知道过早的优化是所有邪恶的根源,但这是非常明显的低效率,我可以提前赶上(这是在甚至不必担心敌人的子弹充满屏幕之前)。 所以我的问题是:将未使用的对象推送到堆栈会调用垃圾收集吗? 参考文件是保持活着还是被破坏的对象? 有没有更好的方法来处理更新许多不同的对象? 例如,我太过花哨了吗? 如果只是遍历列表并找到一个未使用的子弹就可以了吗?

来自C#的DirectX

我正在研究在C#中使用DirectX的各种选项; 理想情况下,我想使用微软首选的任何技术。 非Microsoft技术: SharpDX 超薄DX Direct2D Manager Wrapper 微软技术: WPF 用于托管代码的DirectX 9.0(不建议使用) XNA Framework(已弃用) 我想要使​​用的技术背后的基本原理: 我想要一个代码优先的框架(而不是在WPF中编写XAML) 我希望(理想情况下)Microsoft支持的框架不被弃用 我想构建不过度依赖第三方依赖的应用程序(即如果我要使用WPF构建应用程序,该框架可能已经作为.NET框架的一部分安装在用户计算机上) 问题: 什么是Microsoft首选的编写DirectX exabled应用程序的方法(除了WPF)? 使用弃用技术(MDX,XNA)有哪些危险? 什么是可以在C#中使用的最流行的非Microsoft DirectX技术?

读取系统音频输出流

我目前正在为XNA制作示波器组件并需要一些帮助。 我想获得音频信息表格系统音频输出流,但我发现这样做非常困难。 我找到了一些资源,但没有任何东西可以帮助我,或者它以一种我无法掌握的方式帮助。 以下是我到目前为止找到的以下资源。 如何以编程方式获取当前音频级别? http://msdn.microsoft.com/en-us/library/ms712636 http://social.msdn.microsoft.com/Forums/en/xnagamestudioexpress/thread/6a3ea3da-849b-475d-a2a4-7cf7c27347d5 由于我不能完全掌握应该做什么,所以我谦卑地来找你帮忙谢谢你。

3D基元,XNA 4.0上的透明纹理问题

我需要画一大堆立方体,每一面都有(可能)独特的纹理。 一些纹理也具有透明度的部分。 具有透明纹理的立方体后面的立方体应通过透明纹理显示。 但是,我绘制立方体的顺序似乎决定了透明度是否有效,这是我想要避免的。 看这里: cubeEffect.CurrentTechnique = cubeEffect.Techniques[“Textured”]; Block[] cubes = new Block[4]; cubes[0] = new Block(BlockType.leaves, new Vector3(0, 0, 3)); cubes[1] = new Block(BlockType.dirt, new Vector3(0, 1, 3)); cubes[2] = new Block(BlockType.log, new Vector3(0, 0, 4)); cubes[3] = new Block(BlockType.gold, new Vector3(0, 1, 4)); foreach(Block b in cubes) { b.shape.RenderShape(GraphicsDevice, cubeEffect); } 这是Draw方法中的代码。 它产生了这个结果: […]

在C#中渲染图形

还有另一种方法可以在C#中渲染图形超出GDI +和XNA吗? (用于开发tile map编辑器。)

在WP7项目中找不到HttpWebRequest.GetResponse()

我正在尝试使用HttpWebRequest发送GET请求。 我在网上找到了很多例子(例如, 这一个 ……只需要转到Scrape()方法)。 他们基本上都做同样的事情: 使用WebRequest.Create(URL)创建HttpWebRequest对象并将其强制转换为HttpWebRequest ,然后使用HttpWebRequest的GetResponse()方法获取响应。 事实上, GetResponse()似乎不存在于HttpWebRequest或WebRequest (它是它的基类)中。 我唯一的选择是使用BeginGetResponse() 。 我发现的唯一事情是GetResponse()是同步的,而BeginGetResponse()是异步的,而Silverlight只允许异步的。 好吧,这根本没有帮助,因为整个事情是一个XNA项目,这是我在里面创建的一个简单的C#类。 更确切地说,这是一款在XNA 4.0中创建的Windows Phone游戏 HttpWebRequest webRequest = WebRequest.Create(URL) as HttpWebRequest; StreamReader responseReader = new StreamReader( webRequest.GetResponse().GetResponseStream()); 有没有人知道为什么我没有GetResponse() ?

如何逐渐旋转物体以面对另一个物体转动最短距离

我正在尝试旋转一个精灵,取决于它与直接朝向目标有多少度(或者rad,我更喜欢度数),问题是当目标到达某个位置时精灵决定旋转整个360度以其他方式而不是做额外的10。 这张照片可能更好地解释了这个问题 蓝色方块=目标 红色方块=对象 绿线=它想要的旋转 黑线=当前旋转 棕色箭头=如何旋转以实现此目的 红色箭头=我希望它如何旋转。 请注意,情况1总是起作用,取决于它旋转的方式,但是情况2总是进行旋转,无论是当前旋转的“右”还是“左”。 这是我用来旋转对象的代码。 Vector2 distance = new Vector2(target.worldPos.X – this.worldPos.X, target.worldPos.Y – this.worldPos.Y); float wantRot = (float)Math.Atan2(distance.Y, distance.X); if (this.rotation wantRot) this.rotation -= MathHelper.ToRadians(45) * Time.deltaTime; 我想要实现的是根据红色箭头而不是棕色箭头旋转(在案例2中)。 注意:我不是编程方面的专家,我在过去的一年中不时完成它(主要是简单的2D射击/射击游戏),所以深入解释将不胜感激。 我也是学生学习编程。 PS:标题的建议也会受到赞赏,因为我完全不知道该放什么。

沿XNA中的曲线路径动画精灵

我想在XNA游戏中实施弹道轨迹,并试图找出让弹丸遵循引力曲线的最佳方法。 我能想到的最好的事情就是先计算曲线并存储在“曲线”类中。 然后让精灵沿着那条曲线移动。 但我无法弄清楚如何沿着该曲线实际移动精灵。 我该怎么做,还是只有更好的方法?

XNA – 键盘文本输入

好的,基本上我希望能够检索键盘文本。 就像将文本输入文本字段或其他内容一样。 我只是为Windows编写游戏。 我忽略了使用Guide.BeginShowKeyboardInput,因为它打破了自包含游戏的感觉,而且指南总是显示XBOX按钮这一事实对我来说也不合适。 是的,这是最简单的方法,但我不喜欢它。 接下来我尝试使用System.Windows.Forms.NativeWindow。 我创建了一个inheritance自它的类,并将它传递给了Games窗口句柄,实现了WndProc函数来捕获WM_CHAR(或WM_KEYDOWN),尽管WndProc被调用了其他消息,WM_CHAR和WM_KEYDOWN从未这样做过。 所以我不得不放弃这个想法,此外,我还引用了整个Windows表单,这意味着不必要的内存占用空间。 所以我的最后一个想法是创建一个Thread级别的低级键盘钩子。 到目前为止,这是最成功的。 我收到WM_KEYDOWN消息,(还没试过WM_CHAR)将Win32函数MapVirtualKey的虚拟键码转换为char。 我收到了我的文字! (我现在只是用Debug.Write打印) 但有几个问题。 好像我有大写锁定,并且没有响应的移位键。 (当然不是,它只是每个键只有一个虚拟键代码,所以只翻译它有一个输出)并且它增加了开销,因为它将自己附加到Windows Hook列表并且没有我那么快d喜欢它,但缓慢可能更多是由于Debug.Write。 有没有其他人接近这个并解决它,而不必求助于屏幕键盘? 或者有没有人有进一步的想法让我尝试? 提前致谢。 吉米问的问题 也许我不理解这个问题,但为什么你不能使用XNA Keyboard和KeyboardState类? 我的评论: 这是因为虽然您可以读取密钥状态,但您无法访问键入的文本以及用户输入的方式。 所以让我进一步澄清一下。 我想实现能够从用户读取文本输入,就像他们在文本框中键入是Windows一样。 键盘和KeyboardState类获取所有键的状态,但我必须将每个键和组合映射到它的字符表示。 当用户不使用与我特别用符号相同的键盘语言时,这就会失败(我的双引号是shift + 2,而美国键盘在返回键附近有它们的位置)。 似乎我的窗口挂钩是要走的路,只是我没有得到WM_CHAR的原因是因为XNA消息泵没有做翻译消息。 每当我收到WM _ KEYDOWN消息时添加TranslateMessage意味着我得到了WM_CHAR消息,然后我用它在我的MessageHuff类中发出了一个字符类型的事件,我的KeyboardBuffer类已订阅了该事件,然后将其缓存到文本缓冲区:D (或StringBuilder,但结果是一样的) 所以我按照自己的意愿工作。 非常感谢Jimmy提供了一个非常丰富的信息链接。