WPF下30万次DrawLine/DrawRectangle调用的替代方案,不可使用WriteableBitmap
K线图表绘制性能优化方案
- 批量合并绘图指令:WPF中
DrawingContext的单次调用开销极高,你当前的30万次调用是性能瓶颈核心。将相同颜色、相同描边属性的图形合并为单组几何数据绘制:比如所有上涨蜡烛实体统一合并为一个StreamGeometry、所有下跌蜡烛实体合并为另一个StreamGeometry、所有影线合并为第三组几何对象,同类指标线也按颜色合并为多段线几何,最终绘制调用次数可从30万次降至10次以内,性能提升可达两个数量级。 - 视口可见性剔除:1500根蜡烛不可能全部在当前视口显示,每次绘制前先计算当前可见的蜡烛索引范围,仅生成可见范围内的几何数据,若当前视口仅展示200根蜡烛,可直接减少85%以上的几何计算和绘制开销。
- 绘图资源预创建与冻结:不要每次绘制时动态生成
Pen、Brush对象,提前全局静态创建所有需要的画刷、画笔资源,调用Freeze()方法冻结后复用。冻结后的资源无线程同步开销,绘制性能比动态创建的资源高80%以上,同时可避免频繁GC导致的帧率波动。 - 分层缓存静态内容:结合你需要的分层透明度需求,可将不常更新的图层(历史K线、网格、坐标轴、历史指标线)用
RenderTargetBitmap预渲染缓存,仅在视图平移、缩放时才重绘静态层;每次刷新仅需重绘包含最新蜡烛、实时价格线的动态层,静态层直接叠加绘制即可,可将单次刷新的绘制量减少99%。RenderTargetBitmap原生支持透明度,完全可以替代你无法使用的WriteableBitmap。 - 底层API替换:若以上优化仍无法达到90帧要求,可接入Direct2D互操作绘制,通过SharpDX等封装库直接调用Direct2D接口在WPF的D3D渲染表面绘制,相同绘制量下性能比默认
DrawingContext高3-5倍,30万次绘制调用也可轻松跑满90帧。
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

