DotSpatial性能测试(关于DotSpatial要素图层闪烁的问题)

本文通过在DotSpatial中创建包含200个图层的图层组,并使用10个线程实时更新坐标,进行了多线程压力测试。实验结果显示,在1000的并发量下,地图偶尔出现闪烁现象,但在其他情况下运行流畅。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

精良的架构设计,健壮的代码使DotSpatial十分强大。近日某人说DotSpatial有闪烁问题,我半信半疑,决定亲自试验一下。首先新建一个地图函数,取名为MultithreadFunction,声明一些变量,代码如下:

using DotSpatial.Controls;
using DotSpatial.Data;
using DotSpatial.Symbology;
using DotSpatial.Topology;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace CustomLayer
{
    class MultithreadFunction : MapFunction
    {
        MapGroup layerGroup;
        List<Thread> threads;
        bool bRunning;
        private const double COORDINATE_STARTX = 880468.25;
        private const double COORDINATE_STARTY = 3828144.59;
        private Random random;
        private Extent orignalExtent;

        public MultithreadFunction(IMap mapCtrl, MapGroup layerGroup)
            : base(mapCtrl)
        {
            this.layerGroup = layerGroup;
            threads = new List<Thread>();
            random = new Random();
            bRunning = false;
        }
    }
}


layerGroup是一个图层组,增加到地图控件即可。图层组可以容纳多个图层。threads是线程列表。为了进行压力测试,我将开启十个线程,100个图层,同时刷新。bRunning变量是线程是否运行的标志。两个常量坐标是北京54坐标系(中央经线105度,高斯三度带投影,东向加常数是50公里,单位是米)下武汉市东西湖区某个位置的坐标。random用来产生随机坐标。originalExtent用来记录此地图函数激活前的视野范围,以便此地图函数失效后还原地图控件的视野。

一、重载地图函数激活事件,初始化图层、线程列表等 等,代码如下:

protected override void OnActivate()
        {
            base.OnActivate();
            layerGroup.Layers.Clear();
            orignalExtent = Map.ViewExtents;
            Map.ViewExtents = new Extent(COORDINATE_STARTX + 5000, COORDINATE_STARTY, COORDINATE_STARTX + 105000, COORDINATE_STARTY + 100000);
            for (var i = 1; i <= 200; i++)
            {
                var layer = new MapLineLayer();
                var coord = new Coordinate(COORDINATE_STARTX, COORDINATE_STARTY + i * 5000);
                layer.Symbolizer = new LineSymbolizer(Color.Red, 2.5);
                layer.FeatureSet.AddFeature(new Feature(FeatureType.Line, new List<Coordinate>() { coord, coord }));
                layerGroup.Layers.Add(layer);
            }
            for (var i = 0; i < 10; i++)
                threads.Add(new Thread(DoThread) { });
            bRunning = true;
            foreach (var t in threads)
                t.Start();
        }


二、声明线程体,执行添加随机坐标点,以简单锁的形式保证多线程加坐标的安全性,代码如下:

private void DoThread(object obj)
        {
            while (bRunning)
            {
                lock (layerGroup)
                {
                    for (var i = 0; i < layerGroup.Layers.Count; i++)
                    {
                        var line = layerGroup.Layers[i] as MapLineLayer;
                        var coords = line.FeatureSet.Features[0].Coordinates;
                        var coord = new Coordinate(coords.Last().X + random.Next(1000, 5000), COORDINATE_STARTY + i * 5000 + random.Next(1000, 5000));
                        coords.Add(coord);
                        line.FeatureSet.InitializeVertices();
                    }
                }
                Map.ViewExtents = Map.ViewExtents;
                Thread.Sleep(random.Next(2000, 5000));
            }
        }

三、重载地图函数失效事件,结束并清理线程,代码如下:

protected override void OnDeactivate()
        {
            base.OnDeactivate();
            bRunning = true;
            foreach (var thread in threads)
                thread.Abort();
            threads.Clear();
            Map.ViewExtents = orignalExtent;
        }

实验证明,在保证1000的并发量下,地图偶尔会闪烁一下。其它情况下,地图运行非常流程。这一点DotSpatial不比ArcGIS逊色,一次为DotSpatial点赞。下面是运行效果截图:



转载于:https://my.oschina.net/zhtqs/blog/1509839

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值