问题标签 [spritebatch]

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 投票
2 回答
429 浏览

c# - SpriteBatch System.ArgumentNullException

我正在写一个基于网格运动的简单游戏,比如推箱子游戏。我需要使用几个不同的文本文件来存储关卡。我写了一些代码,现在我得到错误:

System.ArgumentNullException “此方法不接受此参数的 null。Nazwa 参数:纹理”

整个代码在几个文件中。我的代码有什么问题?

游戏1.cs

风景.cs

ObiektyGry.cs

level1.txt(例如)

0 投票
2 回答
570 浏览

c# - 将矩形绘制为精灵时如何更改其旋转中心?

我通过使用一个像素的绘画图片在 XNA 中绘制一条线,然后将该像素拟合到一个高度为 100 的矩形中,长度为 2,因此它显示为一条线。这样我以后可以画一个矩形。

我也想旋转矩形,但旋转中心总是它的左上角。我怎样才能改变这个?

0 投票
1 回答
203 浏览

c# - XNA。如何构建它,以便您使用尽可能少的 spritebatch 开始/结束语句

我在 XNA 中制作 2d 游戏。我开始使用可绘制的游戏组件并且非常高兴。每个精灵都派生自 drawable-game-component 并且每个精灵都有自己的开始/结束语句(甚至每个图块构成一堵墙)。我在读了一点之后意识到这是一种不好的方式来提高性能。

现在我想知道有什么好的方法来做到这一点......让我们说我游戏中的每个房间......

我要问的原因是我必须公开每个块中的字段负载,以便 Room 类可以让它们执行其 _spritebatch.Draw 例如。块._位置

我假设这并不重要,性能会提高,但是有没有人可以推荐的更好的架构来做到这一点?

此外,由于该代码在那里,任何人都可以评论我正在使用的 SpriteBatch.Begin 参数吗?他们是最快的吗?我需要的只是变换

0 投票
1 回答
3225 浏览

3d - XNA/Monogame,绘制多个剪切/倾斜精灵的最快方法

我通常SpriteBatch在 XNA/Monogame 中为 2d 游戏工作,并且最近刚刚研究了诸如DrawUserIndexedPrimatives之类的 3D 绘图方法。我正在做一个项目,我们的动画师希望能够剪切精灵和纹理。

随着您可以在开始剪切对象SpriteBatch时传入一个矩阵。SpriteBatch就像是:

这样做的明显缺点是它需要您SpriteBatch为每个剪切的精灵进行新的开始和结束调用。我们目前只需要 2 次调用即可SpriteBatch开始我们的游戏。一个用于 UI,一个用于 World 的东西。我们的美工想要使用剪切来处理摇摆的树木或为生物的腿和四肢设置动画,所以如果我们给他们选择的话,我可以看到这个数字会跃升至 10 多个单独的批次。

平均水平有大约 250 个元素,每个元素包含 10-20 个精灵。

我已经为 Android 编写了一个测试,该测试调用了 1000 个精灵。在没有任何倾斜的情况下,它可以在大约 11 秒或大约 53fps 内绘制全部 1000、600 次。但如果我每十个精灵倾斜一次(添加 100 个新SpriteBatch调用),则需要 47 秒,或大约 12fps。

这真的很糟糕。即使只有 200 个精灵(每十分之一倾斜),测试也会下降到 28fps。

因此,我还使用使用DrawUserIndexedPrimitives. 每个 Quad 使用BasicEffect在 Game 类中创建并通过Sprite类构造函数传入的共享。我在每个之前设置了世界矩阵和纹理,pass.Apply()如下所示:

对于 1000 个精灵,没有歪斜,这给了我 12fps(我想这就像拨打 1000 次spriteBatch电话)。这真的很糟糕。但是对于每 10 个精灵倾斜的只有 200 个精灵,我得到 46fps,这明显好于SpriteBatch(即使我调用了DrawUserIndexedPrimitives200 次)。

- -我的问题 - -

我怎么能批量调用DrawUserIndexedPrimitives(或类似的东西),同时保持我的精灵每个都包含在他们自己的继承类中DrawableGameComponent?由于我们游戏引擎的性质以及它处理动画、碰撞和其他东西的方式,最后一部分非常重要。

我已经阅读了有关 Vertex Buffers 和的内容DrawIndexedPrimitives,但并没有完全理解它,也不知道如何为以这种方式绘制的精灵分配新的纹理和世界变换。

SpriteBatch我是否应该期望与批处理这些调用相比具有相似/更好的性能?

0 投票
2 回答
5924 浏览

java - 设置 SpriteBatch 颜色(用于着色)影响所有绘图

我创建了一个AnimatedSprite类,它绘制了一个特定的TextureRegion. 有时我需要一个 tint 颜色效果,所以我设置(this.color 是Colormy 的一个字段AnimatedSprite):

但是,当我将AnimatedSprite的颜色设置为黑色或任何颜色时,其他所有颜色都具有该颜色。我什至尝试flush(),结束批次并开始一个新的,等等......但似乎没有任何效果。

请帮我正确应用色调效果。我会很感激任何想法。

0 投票
1 回答
266 浏览

c++ - 将 SpriteBatch 与 Direct3D 和 XAML 一起使用

我创建了一个在 Windows Phone 8 上运行的项目,该项目使用由 Windows Phone SDK 提供的模板 Direct3D With XAML。我还合并了 DirectXTK 并std::unique_ptr<DirectX::SpriteBatch> m_SB;在 CubeRenderer.h 中声明了

当我尝试在函数 CreateDeviceResources 中分配它时:

它给出了错误:未知模块中发生了“System.AccessViolationException”类型的未处理异常。

我不知道这是为什么。如果我使用 Direct3D (Native) 模板创建项目,这将非常有效。

任何帮助,将不胜感激。

0 投票
2 回答
633 浏览

cocos2d-iphone - Cocos2d 和 SpriteBatchNode:无法识别是哪个精灵帧导致 Assertion 失败

我已经问过类似的问题,但我不知道如何正确调试它。这就是问题

我添加了一些异常处理程序(捕获所有 Objective-C)异常,这就是我所看到的结果:

调用堆栈跟踪

控制台输出

问题在于 setTexture 方法,它在断言验证需要显示的纹理名称是否与当前精灵批处理节点中的相同时失败。

当试图用另一个场景替换一个场景时会发生这种情况,但并非总是发生。它与新场景有关,因为我试图通过从游戏的不同部分调用替换来“隔离”问题,但它仍然会带来麻烦。

在游戏场景中,我有几个精灵表和精灵批处理节点,但由于我无法隔离精灵表 ID,我无法理解哪个精灵帧给我带来了问题,我也不明白为什么会这样只是偶尔发生。

我想:

  • 了解哪个精灵帧名称给了我 AssertionFailure
  • 了解它属于哪个精灵表

这应该有助于我了解这是命名问题还是与其他问题有关。

希望不要对这个问题太蹩脚..

编辑:我尝试了答案,但我无法读取“文件名”信息,这是调试器所说的“摘要不可用”:

摘要不可用

这就是我创建文件名属性的方式:

0 投票
1 回答
363 浏览

c# - spriteBatch.DrawString 如何从编译的 spritesheet 纹理中绘制文本?

每个spriteBatch.DrawString(spriteFont, "text", new Vector2(10, 20), Color.White)调用是分别绘制文本字符串spriteBatch.Draw的每个字母(每帧调用每个字母),还是制作一个纹理并重新绘制它,还是以其他方式工作?

0 投票
1 回答
527 浏览

xna - 带有 DrawIndexedPrimitives 的 SpriteBatch

这是我创建的第一个 3D 应用程序,如果这看起来像一个简单的问题,我很抱歉,但我已经搜索了互联网和这些论坛,试图找到答案。

我正在尝试使用 spriteBatch.DrawString 命令在屏幕上绘制一个简单的字符串。

该应用程序类似于 Minecraft,屏幕上有大量立方体。为了解决滞后问题,所有立方体都是通过顶点创建的,并且已经实现了硬件实例化。

问题是当我调用 spriteBatch.Begin() 时,所有其他多维数据集看起来都不同。我知道 spritebatch 更改了某些状态,因此添加了以下行

Bellow 是用来绘制玩家的代码

这是主类中用于绘制所有内容的代码

我想发布问题的屏幕截图以更清楚地显示它,但由于这是我的第一篇文章,我无权发布图像。我很高兴将图像通过电子邮件发送给人们。

我很乐意提供任何其他信息,但这似乎是一个简单的问题。

感谢您提供的任何帮助。

山姆维克里

0 投票
1 回答
861 浏览

xna - 在哪里调用 SetRenderTarget?

我想在SpriteBatch.Begin和之间更改我的 RenderTargets SpriteBatch.End。我已经知道这有效:

但我真的很想让这项工作:

我曾经见过有人这样做,但我没有找到任何原因。

编辑:关于我为什么要这样做的更多信息:

在我的项目中,我使用 SpriteSortMode.Immediate(以便能够在需要时更改 BlendState),并且我只是遍历一个排序的精灵列表,然后将它们全部绘制出来。但是现在我想在一些精灵上应用多通道着色器,但不是全部!我对着色器很陌生,但据我了解,我必须使用第一遍将我的精灵绘制在中间精灵上,并使用第二遍在最终渲染目标上绘制中间精灵。(我使用的是高斯模糊像素着色器)。这就是为什么我想在我想要的目标上绘制,使用所需的着色器,而不必重新开始/结束。