D3DERR_INVALIDCALL错误,TeamCity构建程序

5

我一直在尝试使用TeamCity 4.5自动构建XNA项目,但是遇到了一个小问题。我的项目在Visual Studio 2008下编译正确,但是使用TeamCity作为构建器时却无法编译。配置文件使用sln2008设置,编译进行得很顺利,但是一旦开始将.png纹理编译成.xnb格式,就会出现以下错误:

[11:28:41]: [Project "Content.contentproj" (default targets):] Content\head.png Building content threw InvalidOperationException: D3DERR_INVALIDCALL
at Microsoft.Xna.Framework.Content.Pipeline.CommonHelperFunctions.InitD3D()
at Microsoft.Xna.Framework.Content.Pipeline.TextureImporter.InitD3D()
at Microsoft.Xna.Framework.Content.Pipeline.TextureImporter.Import(String filename, ContentImporterContext context)
at Microsoft.Xna.Framework.Content.Pipeline.ContentImporter`1.Microsoft.Xna.Framework.Content.Pipeline.IContentImporter.Import(String filename, ContentImporterContext context)
at Microsoft.Xna.Framework.Content.Pipeline.BuildCoordinator.ImportAssetDirectly(BuildItem item, String importerName)
at Microsoft.Xna.Framework.Content.Pipeline.BuildCoordinator.ImportAsset(BuildItem item)
at Microsoft.Xna.Framework.Content.Pipeline.BuildCoordinator.BuildAssetWorker(BuildItem item)
at Microsoft.Xna.Framework.Content.Pipeline.BuildCoordinator.BuildAsset(BuildItem item)
at Microsoft.Xna.Framework.Content.Pipeline.BuildCoordinator.RunTheBuild()
at Microsoft.Xna.Framework.Content.Pipeline.Tasks.BuildContent.RemoteProxy.RunTheBuild(BuildCoordinatorSettings settings, TimestampCache timestampCache, ITaskItem[] sourceAssets, String[]& outputContent, String[]& rebuiltContent, String[]& intermediates, Dictionary`2& dependencyTimestamps, KeyValuePair`2[]& warnings)
Inner exception: COMException: Exception from HRESULT: 0x8876086C

我不知道是什么原因导致了这个问题。就像我说的那样,它能够正确编译 .fbx 模型以及我的 ContentPipeline 项目和 SharedContent 项目 (这些都是解决方案的一部分)。

实际上,我希望得到一些指针,了解问题的根源 (如果可能的话,解决问题的方法)。据我所理解,似乎存在 D3D 库的问题。我还要提醒您,整个解决方案都可以在 Visual Studio 2008 下编译,因此 TeamCity 存在一个小问题,要么我没有提供某些东西,要么某些设置实际上是错误的。

4个回答

2
XNA和DirectX 9需要当前登录的用户才能编译Content文件夹。
解决方案很简单,设置一个构建代理机器(真实物理机器),并安装XNA的先决条件(VS2008,XNA Game Studio 3.0等),并在启动时登录,然后创建一个脚本来运行团队服务器代理(通过将代理运行脚本的快捷方式放置在开始菜单中的启动文件夹中)。
这样代理就会作为本地用户运行,并可以正常构建。
我已经这样做了,并确认它是有效的。

2

我没有解决方案,但一直在思考。

错误是D3DERR_INVALIDCALL,因此我认为某些原因导致设备在那个时候不可用。

1)运行构建的机器是否安装了DirectX/显卡? 我假设是的,因为XNA需要使用带有着色器的卡,但TeamCity是一个构建分发工具,因此可能在没有它的机器上运行?

2)也许TeamCity在同一台机器/进程上创建了太多的Direct3D设备(完全猜测)?

编译正确的模型文件是否使用纹理或仅使用几何数据? 我有一种感觉,内容构建器不需要访问DirectX来构建模型,但是对于纹理数据则需要。 您可以构建其他需要访问Direct3D的内容吗? 您可以构建一个在其内容文件夹中只包含一个纹理的项目吗?

我不确定这是否有效,但您可以在调试模式下运行DirectX并查看输出以获取更多信息吗?

希望这在某种程度上有所帮助。


我会选择(2)。作为解决(1)的方案,他可以安装DX SDK - 它有参考设备,不会引起这些问题。 - Jonathan C Dickinson
@Kath:感谢回复。我忘记说明服务器和构建机器是相同的,因此可以从方程式中删除1。在DirectX调试模式下,我得到了一个进程退出代码:-2146233082。我制作了一个小项目,只包含一张图片和基本的游戏项目,没有图片,它可以编译,但有了图片,就不能编译。 - tomzx

2
几乎可以确定的是,Team City正在以本地系统的非交互模式运行其构建过程,并不是作为实际具有访问和抓取图形设备能力的用户。我知道,即使通过远程桌面接口尝试批处理纹理也会遇到问题,因为DirectX无法抓取图形设备。
解决方案可能是查看Team City是否提供您请求其构建器以已登录用户身份运行,而不是作为本地系统或服务运行,尽管我不能告诉您在Team City中是否实际上可能这样做。

@Jeff:谢谢回复。我实际上已经改变了服务用于登录的用户。问题仍然存在,但我认为现在与服务属性中的“硬件配置文件”有关。我似乎只有一个“未连接配置文件”(可能仍然无法访问显卡,很难确定)。此外,这个硬件配置文件看起来不像可以从其他地方编辑(我在Google上搜索它,返回了很多人抱怨它)。 - tomzx

2

很抱歉打扰了一个旧帖子,但我刚刚遇到了完全相同的问题,试图让TC在Windows Server上构建我的XNA项目,并希望帮助其他遇到同样问题的人。

我刚刚找到了这篇文章和博客,看起来是一个非常有前途的解决方案:http://forums.create.msdn.com/forums/p/86699/532976.aspx

&

http://blogs.msdn.com/b/astebner/archive/2011/07/07/10184338.aspx

Aaron基本上表示,Win Phone SDK 7.1 Beta 2的新版包含XNA Game Studio 4.0 Refresh Beta 2,现在可以通过以下类型的配置通过内容管道构建内容:

如果您的屏幕在构建期间被锁定 如果您正在无头计算机上运行构建 如果您从非交互式用户帐户运行构建

但它似乎只能在Vista或更高版本上运行-希望也包括服务器。更新:不幸的是,它不会安装在我的Windows Server上:(


我正在通过CTRL-ALT-DELETE进入任务管理器,但在此过程中锁定了屏幕,并在构建时收到了此错误。感谢与我分享这些信息。这是我的具体答案! - Xonatron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接