- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
自从我将我的所有 c# SlimDX DX11 渲染代码从我的表单(是的,我是一个懒惰的开发人员)移动到定制类后,我最近遇到了一些延迟。我将我的程序打入 EQATEC Profiler 并将其作为我延迟的主要贡献者:
现在很明显,postRender() 中的任何内容都占用了宝贵的毫秒数。事实上,无论我有什么疯狂的、令人费解的代码,它都能有效地将我的帧率降低到 ~15 FPS。
那么 postRender() 中有什么?只需一行代码:
swapChain.Present(0, PresentFlags.None);
我只是不知道是什么导致它如此缓慢,我根本没有对交换链代码进行任何更改。我只改变了屏幕分辨率 (1680x1050),但这绝对没问题(作为引用,这台机器可以在该分辨率下以最大设置运行 crysis2 而不会出汗)。
有没有人知道什么可能导致交换链在呈现时花费如此长的时间,或者我下一步应该去哪里寻找问题?
编辑:
查看我的代码结构,我的RenderFrame()函数如下:
preRender();
DeferredRender(preShader);
//Composite scene to output image
CompositeScene(compositeShader);
//Post Process
PostProcess(postProcShader);
//Depth of Field
DoF(dofShader);
//Present the swapchain
postRender();
其中一些功能的结果是基于之前的功能(例如,DeferredRender 使用四个渲染目标以逐像素的方式捕获 Diffuse lighting、Normals、Positions 和 Color。然后 CompositeScene 将它们放在一起。这将要求 GPU 在继续之前计算出上一步。整个过程继续进行,DoF 需要 PostProcess 等的结果。因此,唯一可能保持 Swapchain.Present() 的着色器必须是着色器它在 DoF 函数中运行,因为所有其他着色器都会导致 CPU 锁定,直到它们完成。对吗?
最佳答案
有几个原因可能会导致您发现 Present() 在您的框架中占用了那么多时间。 Present 调用是 CPU 和 GPU 之间同步的主要方法;如果 CPU 生成帧的速度比 GPU 处理帧的速度快得多,它们就会排队。一旦缓冲区变满, Present() 就会变成一个美化的 Sleep() 调用,同时等待它清空。
当然,根据您在此处提供的少量信息,这几乎是不可能的。仅仅因为一台机器运行孤岛危机并不意味着你可以随心所欲地在卡片上扔任何你想要的东西。仔细检查您不希望渲染大量的几何体,并且您的着色器没有异常长和复杂。
还可以使用可用的 GPU 分析器之一查看您的应用; PIX 是一个很好的基点,而 NVIDIA 和 AMD 各自为自己的产品提供更具体的产品。最后,确保您的驱动程序已更新。如果驱动程序中存在错误,您对问题进行推理的任何机会都会消失。
关于c# - Swapchain.Present() 花费的时间太长,导致滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10373169/
let appDelegate = UIKit.UIApplication.shared.delegate! if let tabBarController = appDelegate
我的演示文稿终于成功了。我的第一个屏幕有一个主要的 activity,第二个屏幕有一个 Presentation。我的问题是,我无法更改演示 View 中的内容。 为什么我不能在第二个屏幕上显示演示文
这个问题在这里已经有了答案: ios, getting a pointer to a controller from a view (5 个答案) 关闭 4 年前。 我有一个 uiview 文件,我
我有一个表示小部件的 View 类和一个随附的演示者类。我还有一个 View 类,用于拥有小部件的窗口,以及窗口 View 的随附演示者。窗口操作小部件,所以我需要窗口展示器与小部件展示器进行通信。可
关闭相机后。它给了我这个警告:在演示过程中尝试继续演示! - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picke
由于这个错误,我无法切换到另一个 View Controller 。我想在成功扫描二维码后切换到另一个 View Controller 。 2015-01-27 17:59:16.093 *[5416
有时它会发生 - 从代码的不同地方 - 我们想要做 UIViewController.presentViewController(a, b, c),有时我们已经在呈现了,在这种情况下我们得到: 警告:
这是我的第一个 iOS 应用程序。 所以我有一个 UIVIewController 和一个 UITableView,其中我按顺序集成了一个 UISearchBar 和一个 UISearchContro
我的模式允许一个特定的元素是可选的,但是当我稍后在文件中遇到一个不同的也是可选的元素时,我需要前一个元素存在。我如何通过 XSD 确保这一点? 例子: true 应该是有效的,
我正在使用 xcode 4.5.2 并为相机按钮创建了自己的 OverlayViewController。 现在,当我的委托(delegate) Controller - TakePhotoViewC
如何在 MVP 中创建 View ? Presenter 是否总是创建它们(除了 subview 的 View 之外)?或者它是一个单独的第三方组件或应用程序或创建它们的东西? 我们还要补充一点,我可
当我调用viewController.presentViewController时,如果已经存在另一个 Controller ,则会出现以下警告。 Warning: Attempt to presen
我有一个关于 React Native 的模块,并在这个问题的标题中抛出错误。这是模块的代码,我不知道 swift 或 Objective-C,所以我需要你像“swift for idiots”一样解
我在 didSelectRowAtIndexPath 中选择一个 segue 时收到上面的警告。这发生在 iPad 上。 iPhone 给出了不同的警告,我会看看是否可以解决这个问题。 我在方法中确实
我的应用程序中有一个包含两个场景的 StoryBoard - 它使用自动转场(在 IB 中创建)。当在第一个 UIViewController 中单击按钮时,第二个 UIViewController
如何在成功验证登录后转到我的第二页? 我已经从登录页面 View Controller (不是登录按钮)拉出一个 segue 到下一页,并将该 segue 命名为“nextPage”。 (如果我从登录
我正在构建一个应用程序,最近发现了由传统转场引起的巨大内存泄漏。因此我了解了 unwind segue。如果我简单地使用,一切都很好: @IBAction func prepareForUnw
我不知道如何将按钮添加到 link_to_add_fields 中 在我制作的 Rails 应用程序中。 我尝试在各处添加 class: "btn btn-mini btn-info",但我一直收到
大家好,感谢阅读。我正在制作一个应用程序,您可以在其中拍照并从相机胶卷中检索照片并将其显示在 View 中。问题是,当我尝试使用调出相机胶卷的按钮时,出现如上标题中的错误“演示正在进行中”。 如果我注
我有一个模型,其中有两个字段在技术上可以为空。字段名称是 :is_activated 和 :activated_at。 :activated_at 仅在 :is_activated 设置为 true
我是一名优秀的程序员,十分优秀!