gpt4 book ai didi

c# - 最佳实践 : efficient sprite drawing in XNA

转载 作者:可可西里 更新时间:2023-11-01 08:12:22 28 4
gpt4 key购买 nike

在我的 2D XNA 游戏中绘制 Sprite 的有效方法是什么?更具体地说,我将这个问题分成了 4 个问题。


我曾经声明 Game1 的 spriteBatch static,并调用了 SpriteBatch.Begin.Close在每个IDrawable.Draw .效果不佳。为每个可绘制对象提供自己的 SpriteBatch 也效果不佳。

Q1:我认为最好有一个 SpriteBatch 实例,并且只调用开始/关闭一次。这是正确的吗?


目前,我的 Game1.Draw看起来像这样:

spriteBatch.Begin();

base.Draw(gameTime); // draws elements of Game.Components

// ...

spriteBatch.End();

Q2:这边,Begin只被调用一次。这是要走的路吗?你们是如何解决这个问题的?


Q3:此外,每个组件都有自己的 IGameComponent.LoadContent方法。我应该在那里加载我的内容吗?或者在父类中加载内容更好,例如 Game1.LoadContent


我意识到我永远不应该加载相同的内容两次,所以我为我的可绘制组件提供了静态和非静态 Texture2D ,并给了他们 2 个构造函数:

static Texture2D defaultTexture;
public Texture2D MyTexture;

public Enemy()
: this(defaultTexture) { }

public Enemy(Texture2D texture)
{
MyTexture = texture;
}

protected override void LoadContent()
{
if (MyTexture == null)
{
if (defaultTexture == null)
{
defaultTexture = Content.Load<Texture2D>("enemy");
}

MyTexture = defaultTexture;
}
}

这样,一个类的默认纹理只在第一次加载LoadContent在那个类上被调用。但是,当参数 texture在构造函数中指定,我必须事先加载该纹理。

Q4:我认为应该有更好的方法来做到这一点。我正在考虑创建一个纹理字典,其 Assets 名称为字符串。你有什么建议?

最佳答案

I used to declare Game1's spriteBatch static

您不必将其设为静态。只做一个单例。 Draw 方法内部

SpriteBatch spriteBatch = ScreenManager.SpriteBatch; // singletion SpriteBatch
spriteBatch.Begin();
// Draw the background
spriteBatch.Draw(background, ...
foreach (var enemy in enemys)
{
enemy.Draw(gameTime);
}
// etc.
spriteBatch.End(); // call here end
base.Draw(gameTime); // and then call the base class

I assume it's best to have one SpriteBatch instance, and only call begin/close once. Is this correct?

我建议您在一个方法中打开和结束 SpriteBatch。它将帮助您避免与开始绘制但未完成的 SpriteBatch 发生冲突。

您要将您的元素添加到全局组件集合中吗?向该集合添加可绘制对象不是一个好主意。您无法控制绘制顺序,组件是全局的。 See this answer .

在您的组件中实现 IUpdatable 和 IDrawable,并在您需要的代码中调用它们。摆脱静态的东西并使用 Dependency Injection代替。

Also, every component has it's own IGameComponent.LoadContent method. Am I supposed to load my content there? Or is it better to load content at a parent class, such as Game1.LoadContent?

您应该在需要时加载 Assets ,并对此负责。您不必在用户刚开始游戏时加载所有 30 个级别,对吗?例如,当您的游戏开始时,您会加载开始屏幕和主菜单所需的所有 Assets 。如果你只加载你需要的东西,玩家会很高兴游戏开始得很快。然后玩家想要开始游戏。在这里,您可以在单独的线程上加载 Assets 以保持应用程序响应。

I think there should be better ways to do this. I'm thinking of creating a texture dictionary with their asset names as string. What would you suggest?

Content.Load 已缓存,因此您不必执行此操作。

关于c# - 最佳实践 : efficient sprite drawing in XNA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13970726/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com