C# arcgis silverlight api的性能

C# arcgis silverlight api的性能,c#,silverlight,rendering,silverlight-5.0,arcgis,C#,Silverlight,Rendering,Silverlight 5.0,Arcgis,我正在使用GraphicsLayer作为带有SimpleLineSymbol的道路符号。 我的代码与下面的代码相同: for (int i = 0; i < 200000; i++) { myGraphicsLayer.Graphics[i].Symbol = mySimpleLineSymbol; } for(int i=0;i { 对于(int j=0;j { Deployment.Current.Dispatcher.BeginInvoke(

我正在使用
GraphicsLayer
作为带有
SimpleLineSymbol
的道路符号。 我的代码与下面的代码相同:

    for (int i = 0; i < 200000; i++)
    {
        myGraphicsLayer.Graphics[i].Symbol = mySimpleLineSymbol;
    }
for(int i=0;i<200000;i++)
{
myGraphicsLayer.Graphics[i].Symbol=mySimpleLineSymbol;
}
此代码运行速度很快,但在地图上绘制linesymbol非常慢(大约6秒)。
请帮助我提高符号性能。

这是很多行。一个想法是减少需要绘制的线条数量。您可以检查地图的缩放级别或比例,并使用它来确定要绘制哪些线。例如,在某些比例下,可能只绘制特定道路,例如主要道路。您可以通过在循环中添加一个if语句来检查特定属性(假设存在一个属性):

 new Thread(() =>
            {
                Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    for (int j = 0; j < 50000; j++)
                    {

                        myGraphicsLayer.Graphics[j].Symbol = mySimpleLineSymbol;
                    }
                });

            }
).Start();


            new Thread(() =>
            {
                Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    for (int k = 50000; k < 100000; k++)
                    {
                        myGraphicsLayer.Graphics[k].Symbol = mySimpleLineSymbol;
                    }
                });

            }
).Start();


            new Thread(() =>
            {
                Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    for (int l = 100000; l < 150000; l++)
                    {
                        myGraphicsLayer.Graphics[l].Symbol = mySimpleLineSymbol;
                    }
                });

            }
).Start();


            new Thread(() =>
            {
                Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    for (int m = 150000; m < 200000; m++)
                    {
                        myGraphicsLayer.Graphics[m].Symbol = mySimpleLineSymbol;
                    }
                });

            }
).Start();

因为你有很多特性,性能总是会受到影响,尽管有一些事情要考虑。首先确保您拥有Silverlight和Esri API的最新版本,因为在较新的版本中通常会有性能改进。由于您在客户端上进行渲染,因此主机的规格将影响性能。如果您无法利用依赖于比例的渲染或要素群集,并且您仅使用基本要素符号,则获得更好性能的唯一方法是使用ArcGIS server和服务器渲染服务器上的要素将其作为动态地图服务层。这意味着您将无法使用地图提示等,尽管有一些解决方法,例如在悬停时显示弹出窗口。您还可以轻松实现单击即识别。

我将所有几何图形收集到一条多段线中,并为此创建一个图形。然后我创建符号并显示。渲染和显示在地图上需要一秒钟

        var myPolyline = new ESRI.ArcGIS.Client.Geometry.Polyline();

        for (int i = 0; i < 200000; i++)
        {
            myPolyline.Paths.Add(((ESRI.ArcGIS.Client.Geometry.Polyline)myGraphicsLayer.Graphics[i].Geometry).Paths[0]);
        }

        Graphic myGraph = new Graphic();

        myGraph.Geometry = myPolyline;

        ESRI.ArcGIS.Client.Symbols.SimpleLineSymbol sym = new ESRI.ArcGIS.Client.Symbols.SimpleLineSymbol();

        sym.Color = new SolidColorBrush(Colors.Red);

        sym.Width = 2;

        myGraph.Symbol = sym;

        myGraphicsLayer.Graphics.Add(myGraph);
var myPolyline=new ESRI.ArcGIS.Client.Geometry.Polyline();
对于(int i=0;i<200000;i++)
{
myPolyline.path.Add(((ESRI.ArcGIS.Client.Geometry.Polyline)myGraphicsLayer.Graphics[i].Geometry).path[0]);
}
Graphic myGraph=新图形();
myGraph.Geometry=myPolyline;
ESRI.ArcGIS.Client.Symbols.SimpleLineSymbol sym=新的ESRI.ArcGIS.Client.Symbols.SimpleLineSymbol();
sym.Color=新的SolidColorBrush(Colors.Red);
对称宽度=2;
myGraph.Symbol=sym;
myGraphicsLayer.Graphics.Add(myGraph);

您可以在线程之间划分任务,以实现并行工作,从而获得更好的性能

 new Thread(() =>
            {
                Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    for (int j = 0; j < 50000; j++)
                    {

                        myGraphicsLayer.Graphics[j].Symbol = mySimpleLineSymbol;
                    }
                });

            }
).Start();


            new Thread(() =>
            {
                Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    for (int k = 50000; k < 100000; k++)
                    {
                        myGraphicsLayer.Graphics[k].Symbol = mySimpleLineSymbol;
                    }
                });

            }
).Start();


            new Thread(() =>
            {
                Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    for (int l = 100000; l < 150000; l++)
                    {
                        myGraphicsLayer.Graphics[l].Symbol = mySimpleLineSymbol;
                    }
                });

            }
).Start();


            new Thread(() =>
            {
                Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    for (int m = 150000; m < 200000; m++)
                    {
                        myGraphicsLayer.Graphics[m].Symbol = mySimpleLineSymbol;
                    }
                });

            }
).Start();
新线程(()=>
{
Deployment.Current.Dispatcher.BeginInvoke(()=>
{
对于(int j=0;j<50000;j++)
{
myGraphicsLayer.Graphics[j].Symbol=mySimpleLineSymbol;
}
});
}
).Start();
新线程(()=>
{
Deployment.Current.Dispatcher.BeginInvoke(()=>
{
对于(int k=50000;k<100000;k++)
{
myGraphicsLayer.Graphics[k].Symbol=mySimpleLineSymbol;
}
});
}
).Start();
新线程(()=>
{
Deployment.Current.Dispatcher.BeginInvoke(()=>
{
对于(int l=100000;l<150000;l++)
{
myGraphicsLayer.Graphics[l].Symbol=mySimpleLineSymbol;
}
});
}
).Start();
新线程(()=>
{
Deployment.Current.Dispatcher.BeginInvoke(()=>
{
对于(int m=150000;m<200000;m++)
{
myGraphicsLayer.Graphics[m].Symbol=mySimpleLineSymbol;
}
});
}
).Start();

事实上,所有行都是主要的。由于一些原因,我必须在客户端进行渲染,而且我有点受限。有没有办法让我知道代码执行完成渲染后的时间?GraphicsLayer中是否有此事件?您可以尝试侦听map progress事件,尽管我不记得是否会触发图形层。另外,您是否尝试过使用渲染器而不是在每个功能上设置符号?这会更快。不为Graphicslayer触发map progress事件,我测试渲染器属性,而不是设置符号;它比set-Symbol属性慢。我测试SimpleRenderer和UniqueValueRenderer。在此循环之后,在将该层添加到地图之前是否设置了该层的隐藏标志?我认为可以在refresh()期间利用层的update end事件,然后调用show()。{注意:我的应用程序中没有足够的符号来研究这种方法,但是您有}。