- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在考虑为 WPF 编写一个声波可视化控件。事实上,它可以呈现任何类型的线图数据;它不一定是声波。只要数据是一组离散的样本,它就会呈现它。
我让它工作;但是性能并不理想。我做了很多代码优化,使 OnRender 方法可以快速运行。我已经用性能分析器对其进行了测试,它显示它的运行时间约为 110 毫秒,应该没问题。
但是,我发现应用程序经常停顿,而探查器没有显示原因。
在我的测试中,我注意到它可能与填充率有关。我的意思是绘制的像素数。我的测试数据包含一个正弦波,频率为 41000hz,持续时间超过 20 秒。这会产生 812000 个样本。现在我的控件根据用户查看波浪的缩放比例优化此数据。将使用大约 6000 条线条绘制整个波浪。
如果我放大波浪很长一段距离,所以我只渲染两个完整的正弦波,我仍然会绘制大约 6000 条线。 CPU 时间大致相同,为 110 毫秒,但应用程序运行平稳且不会停止,起初这似乎很奇怪。
然而,当观察它时,全波绘制几乎触及每个像素。图表绘制了一条绿线,当缩小时它会覆盖图形控件的整个背景。当仅少量放大时,背景会 overdraw 。
我是一名游戏程序员,所以我知道这个问题可能是由填充率限制引起的。如果线条绘制接触到每个像素,那么无论线条绘制的数量如何,绘制都会变慢。但是我不希望出现这种情况,因为图表在屏幕上并没有那么大。如果我更改窗口的大小,那么它确实会变慢,这再次通过猜测填充率问题得到加强。现代图形卡应该能够处理此问题,因此控件可能正在使用软件渲染。我不确定如何证明这一点!!
因此,就逻辑而言,我的 OnRender 方法非常优化。在上述两种情况下,在 CPU 上绘制所需的时间变化不大。然而,在某些情况下,如果触摸了大量像素,则会出现大约一秒的可怕滞后。
有人知道我该如何改进吗?
我考虑过的一种方法是在另一个线程上渲染屏幕外纹理,一旦完成,然后在更新纹理后调用 InvalidateVisual。我还可以经常执行无效化,这样图形渲染就会随着时间的推移而更新,而不是突然出现。
任何人都有这种事情的经验,我如何实际分析 WPF 的内部结构?
有谁知道分析器会告诉我到底是什么导致了这个问题,但正如我所说,我认为这可能归结为实际的硬件渲染和填充率问题。
请注意,我的图形控件继承自 Canvas,线条绘制是使用 StreamGeometryContext 完成的。我还卡住了几何体和所有的画笔和笔。
谢谢
最佳答案
我编写的软件需要非常快速地绘制大量频谱数据。 WPF 的保留图形系统不适合绘制(图形化)大量频繁变化的数据。我们使用 D3D9 来绘制图形。 WPF 提供了一种通过 D3DImage 类将其放入其渲染系统的方法,在该类中它可以成为 ImageBrush。因此,它以牺牲一点性能为代价避免了与空域限制相关的问题,但仍然比使用 WPF 对象渲染快得多。
我还看到了两个非常好的图形库,它们各有优缺点。
关于您关于软件渲染的问题... WPF Performance Suite具有分析工具和叠加层,可以显示您的应用程序的哪些部分正在被软件渲染。您可能想从 Microsoft 下载它并尝试一下。
据我所知,WPF 的呈现系统几乎不是最佳的 (A Critical Deep Dive into the WPF Rendering System)。对于 WPF 的设计目的,它很棒,但也有其局限性。
我的建议是,如果您有游戏开发和 DirectX 方面的经验,并且需要一种方法来快速绘制大量数据的图形,则可以通过 WPF 中的 D3DImage 类查看与 D3D 的互操作。
关于用于自定义声波控制的 WPF Performance 渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20953030/
在我的 OpenGL 程序中,我按顺序执行以下操作: // Drawing filled polyhedrons // Drawing points using GL_POINTS // Displa
我想传递一个包含原始页面的局部变量,这个变量只包含一个带有值的符号。 当我使用此代码时,它运行良好,可以在部分中访问 origin 变量: render :partial => "products",
为什么这个 HTML/脚本(来自“JavaScript Ninja 的 secret ”)不渲染? http://jsfiddle.net/BCL54/
我想在阅读完 View 后返回到特定的网页位置(跳转到页内 anchor )。换句话说,在 views.py 中,我想做类似的事情: context={'form':my_form} return r
我有一个包含单条折线的 PathGeometry,并以固定的间隔向该线添加一个新点(以绘制波形)。使用 Perforator 工具时,我可以看到每次向直线添加一个点时,WPF 都会将整个 PathGe
尝试了解如何消除或最小化网站上不同 JavaScript 库的渲染延迟。 例如,如果我想加载来自许多社交网络的“即时”关注按钮,它们似乎会相互阻止渲染,并且您会收到令人不快的弹出窗口。 (func
我有以 xyz 点格式表示 3D 表面(即地震断层平面)的数据。我想创建这些表面的 3D 表示。我使用 rgl 和 akima 取得了一些成功,但是它无法真正处理可能会自行折叠或在同一 x,y 点具有
我正在用 Libgdx 编写一个小游戏。 我有一个 Render[OpenGL] 线程,它不断对所有对象调用 render() 和一个更新线程不断对所有对象调用 update(double delta
我有一个 .Rmd 文件包含: ```{r, echo=FALSE, message=FALSE, results='asis'} library(xtable) print(xtable(group
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
请不要评判我,我只是在学习 Swift。 最近我安装了 MetalPetal 框架,并按照说明操作: https://github.com/MetalPetal/MetalPetal#example-
如果您尝试渲染 Canvas 宽度和高度之外的图像,计算机是否仍会尝试渲染它并使用资源来尝试渲染它?我只是想找出在尝试渲染图像之前检查图像是否在 Canvas 内是否更好。 最佳答案 我相信它仍然在无
我在 safari 中渲染时遇到问题。 在 firefox、chrome 和 IE 上。如下图所示: input.searchbox{-webkit-border-radius:10px;-moz-b
我正在尝试通过远程桌面在 Windows7 下运行我在 RHEL7 服务器中制作的 java 程序。 服务器中的所有java程序都无法通过远程桌面呈现。如果我在服务器位置访问服务器本身,它们看起来没问
我正处于一个新项目的设计阶段,该项目将采用数据集并将其加载到文档中,然后围绕模板呈现文档。呈现的文件可以是 CSV 数据集、PDF 营销信函、电子邮件……很多东西。数据不会是数学方程式,我只是在寻找一
有没有办法在不同的 div 下渲染 React 组件的子组件? ... ... ... ... ...
使用以下代码: import numpy as np from plotly.offline import iplot, init_notebook_mode import plotly.graph_
截至最近, meteor 的所有文档都指出 onRendered是一种在模板完成渲染时获取回调的新方法。和 rendered只是为了向后兼容。 但是,这似乎对我不起作用。 onRendered永远不会
所以在我的基本模板中,我有:{% render "EcsCrmBundle:Module:checkClock" %} 然后我创建了 ModuleController.php ... getDoctr
我正在使用 vue-mathjax 来编译我的 vue 项目中的数学方程。它正在编译第一个括号 () 之间的文本。我想防止编译括号内的字符串。在文档中我发现,对于$符号,如果我们想逃避编译,我们需要使
我是一名优秀的程序员,十分优秀!