SilverLining 的故障排除技巧
"应用程序未能启动,因为应用程序的配置不正确。"
如果你在运行链接在SilverLining中的应用程序时收到这个消息,那是由于我们链接SilverLining的动态运行库和你系统上安装的动态运行库之间不匹配。
一个解决办法是,确保你已经为Visual Studio安装了最新的服务包,并运行Windows Update来应用自那以后发布的任何安全补丁。SilverLining总是与微软的最新更新相联系。请确保在你的应用程序中安装来自微软的最新的可重新分配的依赖项,以防止在你的用户的系统中出现同样的问题。
一个更好的解决方案是完全避免Visual Studio运行系统上的动态依赖。如果你可以的话,将你的项目设置为使用非DLL版本的运行时。你可以在C++/语言设置属性页下的 "运行时库 "属性下进行更改。然后,你可以把SilverLining库的非DLL版本也连接进来,并通过静态地把正确的运行时直接连接到你的应用程序中来避免通常被称为 "DLL地狱 "的情况。
另一个解决方案是,如果你有SilverLining的全源授权,可以从源头重新编译SilverLining库。这将导致它们与安装在你的系统上的任何运行时库相链接,这也应该解决这个问题。同样,如果你使用DLL运行时,你必须将相同的运行时与你的应用程序一起重新发布。
SilverLining在启动时崩溃或挂起
在Windows下,很有可能你所链接的C++运行时库与SilverLining所建立的不同。在SilverLining中的一个迭代器或一个互斥对象中的崩溃,表明这就是发生的事情。当你使用 "忽略特定库 "的链接器设置来解决你正在使用的其他第三方库的链接器错误时,就会出现这种麻烦。
通常,这可以通过忽略引起麻烦的 "msvcrt "变体来解决。哪一个将取决于你的具体配置。例如,有一个客户在使用多线程调试(非DLL)运行时遇到麻烦,他排除了libcmt.lib来解决C运行时库的其他链接器问题,并通过排除msvcprtd.lib来启动和运行。
如果你使用的是Windows SDK的评估版,SilverLining会在调用Atmosphere构造函数时显示一个对话框,警告你关于SDK的时间限制。如果你在你的应用程序处于全屏模式之后实例化你的Atmosphere对象,一些应用程序将不能处理在全屏模式激活时显示的对话框。为了解决这个问题,请在进入全屏模式之前实例化你的Atmosphere对象。
如果你在第一次调用Atmosphere::DrawSky()时遇到崩溃,你很可能是从一个不同的线程和/或渲染上下文中调用DrawSky(),而不是调用Atmosphere::Initialize()时的那个。Initialize()、DrawSky()和DrawObjects()都应该从同一个上下文中调用,而且你应该为每个上下文维护单独的Atmosphere对象。
另一种情况可能是OpenSceneGraph应用程序在多个监视器下运行。SDK中包含的唯一一个处理多窗口的OSG样本是 "OpenSceneGraph MultiWindow "的例子;请参考它来指导在多窗口设置中使用SilverLining。
Atmosphere::Initialize() 返回一个错误代码
有几种情况可能会导致SilverLining的初始化失败;下面是Atmosphere::Initialize对每种情况返回的错误代码:
E_RESOURCES_PATH_INVALID: 如果在你调用Atmosphere::Initialize()时指定的资源路径中无法打开SilverLining.config文件,就会发生这个错误。通常情况下,这意味着你的资源路径是不正确的。请确保你的路径中的反斜线被转义了,而且你的路径包括一个尾部的反斜线,并仔细检查你指定的路径是否存在。例如,SilverLining SDK将被安装到不同的路径上,这取决于你是在32位还是64位操作系统上。
E_CONFIGURATION_FILE_NOT_FOUND: 如果你的资源目录中的SilverLining.config文件由于任何原因不能被解析,这个错误将被返回。一般来说,这意味着配置文件被错误地修改了,或者被破坏了。
E_CANT_LOAD_RENDER_DLL: SilverLining会根据你使用的是DirectX还是OpenGL,你的Visual Studio版本,以及32位还是64位的构建,构建一个通往适当的渲染器DLL的路径。这些 DLL 存储在你的资源目录中;例如,一个示例路径最终可能是 resources/vc10/win32/SilverLiningOpenGL-MT.dll。如果渲染器在运行时无法加载这个DLL,那么就会返回这个错误。如果你没有把这些DLL移出这个位置,而且你为Atmosphere::Initialize的渲染器参数指定了一个有效的值,请联系support@sundog-soft.com,并说明你使用的是什么渲染器,什么版本的Visual Studio,以及你使用的是我们库的32位还是64位版本。同时给我们发送一份你对Atmosphere::Initialize()的调用的副本。
E_CANT_INITIALIZE_RENDER_SUBSYSTEM:这意味着SilverLining无法从OpenGL或DirectX获得一些基本的信息,也无法为渲染到纹理设置缓冲区。通常情况下,这意味着你在渲染上下文建立之前调用了Atmosphere::Initialize(),或者完全是从渲染线程之外调用的。在调用Initialize()时,要确保你是在你打算用来渲染的上下文中。SilverLining还需要一个可锁定的缓冲区,如果你使用的引擎没有提供这个功能(比如Ogre3D),请将resources/Silverlining.config中的render-offscreen设置为 "yes",以禁用对缓冲区的直接使用。
E_CANT_LOAD_METABALL_TEXTURE:如果不能从你指定的资源目录路径中加载wispy-metaball.tga文件,将返回这个错误。如果你没有移动或修改这个文件,请联系support@sundog-soft.com。
我的天空是侧向的/颠倒的/其他方向错误的
确保在调用Atmosphere::Initialize()之前调用Atmosphere::SetUpVector()和Atmosphere::SetRightVector(),这样我们就知道哪个方向是向上的。另外,在设置Atmosphere::Initialize的手性参数时要注意。
我的天空没有出现,或者没有随相机移动
当调用Atmosphere::DrawSky()时,SilverLining假定当前的模型视图和投影矩阵代表你的摄像机的视图。有些引擎会在他们自己的内部渲染代码之外重置他们的模型视图和投影矩阵。当这种情况发生时,你的天空会显得很静态,或者根本就不在正确的位置上。你可能需要明确地获得你的模型视图和投影矩阵,并在调用Atmosphere::DrawSky()之前通过OpenGL或DirectX直接设置它们。
SilverLining使我的帧速率降低得太多了
场景中过多的积云往往是主要的性能障碍;你应该做的第一件事是确保你的积云层不比它们需要的大。我们需要渲染的云的数量随着这些云层大小的平方而增加。降低这些云层的密度也会有帮助。
除此之外,在resources/SilverLining.config文件中还有一些设置,你可以进行调整,以便在性能和视觉质量之间做出自己的权衡。
从设置cumulus-congestus-voxel-dimension开始。你设置得越大,渲染每个积云拥挤云所需的体素就越少。增加这个尺寸会有很大帮助,但云层看起来会因此而不那么复杂。
如果你使用的是层积云,它们的瓶颈是碎片处理--显示器的分辨率对性能的影响比什么都大。你可以通过调整层积云着色器本身的预处理器定义来调整性能--从你所使用的渲染器的资源/着色器文件中打开它们,你会在着色器的顶部看到调整采样率的方法。如果你需要大型云层,将STRATOCUMULUS切换到STRATOCUMULUS_PARTICLES也会对性能有很大帮助。
如果你的视角变化缓慢,将SilverLining配置为更积极地使用冒牌货可能会有相当大的帮助。默认情况下,云层-背景-距离的设置被设定为50公里的距离。把这个距离拉近,将导致更多的积云被渲染成围绕着摄像机的冒失鬼环,这可以产生很大的帧率改进。
cull-interior-voxels将防止SilverLining渲染那些不太可能被看到的体素,也有一点帮助。
最后,如果你注意到只有当太阳出现在视野中时才会变慢,这可能是由于进行了遮挡测试,以防止太阳在被云层或其他物体遮挡时产生镜头闪光。如果你可以不用这个测试,设置lens-flare-disable-occlusion = yes会有很大的帮助(在Resources/SilverLining.config中)。如果你使用OpenGL,你可以通过设置lens-flare-use-pbo = yes来配置SilverLining使用异步像素缓冲器对象来完成这个任务。这将让你在太阳上进行镜头炫光的闭塞测试,但没有遮挡。然而,如果你正在对纹理进行延迟渲染,这可能会导致问题--在这种情况下,你最好完全禁用镜头炫光闭塞。
当我使用SilverLining时,我的帧速率会随着时间的推移而变慢,没有明显的原因
这似乎是老的NVidia驱动特有的问题,与我们使用顶点缓冲器对象有关。要解决这个问题,要么更新你的驱动程序,要么在你的系统上把环境变量SILVERLINING_NO_VBO设置为1(并重新启动你的开发环境来接收它。)
我的天空或云彩的渲染很奇怪
试着在文本编辑器中打开resources/SilverLining.config文件,并将 "disable-shaders "设置为 "yes"。尽管我们在各种各样的系统上测试SilverLining,但我们的着色器有时会在我们还没有遇到的新硬件上以意想不到的方式进行编译。禁用着色器会导致SilverLining退回到更兼容的顶点转换方法,但会有轻微的性能损失。如果你遇到这种情况,请联系 https://www.dhorde.com/ 在线客服,电话 023-62585653,或邮箱 sales@dhorde.com,提供你的系统信息(特别是你使用的显卡),以便我们能够在你的系统上支持着色器。
我使用了一个不寻常的坐标系,而云层没有显示在我期望的地方
如果你使用的是地心坐标系统("以地球为中心的固定坐标"),请务必阅读 "在地心或ECEF(以地球为中心的固定坐标)坐标中使用SilverLining "一节,以了解如何在这些系统中定位云层的重要信息。
有些用户渲染的东西都是相对于眼点的。这就造成了问题,因为SilverLining假定你传入的modelview矩阵代表摄像机的位置和旋转,并且这个矩阵与OpenGL或DirectX用于绘图的矩阵是一致的。解决这类问题的最好方法是在调用Atmosphere::DrawSky或Atmosphere::DrawObjects之前,使用glPushMatrix将你自己的特殊模型视图矩阵推入堆栈,然后构造一个假设原点在(0,0,0)而不是眼点的同等模型视图矩阵。这样一个矩阵将包括相机的旋转和平移。让这个新的矩阵成为你的模型视图矩阵,并把它传递给Atmosphere::SetCameraMatrix - 然后调用Atmosphere::DrawSky或Atmosphere::DrawObjects,然后在你自己绘图之前恢复你的原始模型视图矩阵。
SilverLining会对所有活动的渲染目标进行绘制,但我只想让它对特定的目标进行绘制。
Atmosphere::DrawSky()和Atmosphere::DrawObjects()将渲染到当前活动的任何渲染目标。如果你需要只对特定的渲染目标进行渲染,你就需要编辑resources/shaders目录下的片段着色器。OpenGL 2.0着色器的扩展名是-frag.glsl15,而DirectX着色器的扩展名是.fx。在OpenGL下,你要用gl_FragData[]的特定元素来代替我们对gl_FragColor的赋值。在OpenGL中,你可以在UserFunctions-frag shader文件(OpenGL 2使用glsl,OpenGL 3使用glsl15)的writeFragmentData函数中做到这一点。
我的问题并没有在这里列出!
请联系我们 https://www.dhorde.com/ 在线客服,电话 023-62585653,或邮箱 sales@dhorde.com。即使你还没有购买许可证,我们也会尽我们所能帮助你启动和运行。
渝公网安备50010702505508