我有一个问题,它会侵入嵌套的命名空间和模板化的类.我还能够创建测试用例,它产生与实际代码相同的错误,但更具可读性.
使用VS2012和2010平台工具集编译以下代码会导致错误:
namespace A
{
namespace B
{
namespace C1
{
struct SMeasResult{};
}
namespace C2
{
struct SMeasResult{};
}
}
}
namespace C1Test
{
using namespace A::B::C1;
template<typename T>
class Fook
{
public:
void Yu()
{
SMeasResult Field;
}
};
}
namespace C2Test
{
using namespace A::B::C2;
template<typename T>
class Fook
{
public:
void Yu()
{
SMeasResult Field;
}
};
}
void m(){
C1Test::Fook<int> yu;
C2Test::Fook<int> me;
yu.Yu();
me.Yu();
}
Run Code Online (Sandbox Code Playgroud)
具体错误如下:
1>------ Build started: Project: MultiVicomTest (Visual Studio 2010), …Run Code Online (Sandbox Code Playgroud) 这是我的第一个问题,但是我是一个很长时间的潜伏者.我将其分为两部分,一部分解释我正在做什么以及为什么我认为这是要走的路,第二部分是我无法为自己解决的实际问题.
我在做什么? 我目前正在开发一个用于渲染二维特征的框架,以便实时显示.您可以在浏览器中考虑Google地图等应用程序,但该框架旨在呈现各种地理数据(而不仅仅是轴对齐的栅格数据,如Google Tiles).
该框架将集成到我们(公司)的最新产品中,该产品是用于台式机和笔记本电脑的WPF应用程序.
因此,我选择了WPF的实际渲染几何只 ; 可见性和遮挡剔除由我自己完成,输入处理(鼠标拾取),移动相机等.
作为实时应用程序,它需要至少达到30 FPS.渲染图像时框架表现得足够:我可以每帧绘制几千个位图而不会出现问题,但多边形数据却成为一个主要问题.
我正在使用WPF渲染相当数量的折线和多边形数据的实际问题,特别是使用DrawingContext和StreamGeometry.到目前为止,我的理解是,如果我需要表现,这就是我要采取的方法.但是,我无法达到我期望的结果.
这就是我用实际数据填充StreamGeometry的方法:
using (StreamGeometryContext ctx = Geometry.Open())
{
foreach (var segment in segments)
{
var first = ToWpf(segment[0]);
ctx.BeginFigure(first, false, false);
// Skip the first point, obviously
List<Point> points = segment.Skip(1).Select(ToWpf).ToList();
ctx.PolyLineTo(points, true, false);
}
}
Geometry.Freeze();
Run Code Online (Sandbox Code Playgroud)
这就是我绘制几何体的方式:
_dc.PushTransform(_mercatorToView);
_dc.DrawGeometry(null, _pen, polyline);
_dc.Pop();
Run Code Online (Sandbox Code Playgroud)
作为测试,我将OpenStreetMap中的ESRI形状加载到我的应用程序中以测试其性能,但我完全不满意:我的测试数据包含~3500个线段,总共约20k行.
将每个段映射到它自己的StreamGeometry表现得非常糟糕,但我已经预料到了:渲染大约需要14秒.
然后我尝试使用多个数字将更多段包装到相同的StreamGeometry中:80 StreamGeometry,渲染大约需要50ms.
但是我得不到比这更好的结果.将行数增加到大约100k使我的应用程序几乎无法使用:渲染需要超过100毫秒. 除了在渲染矢量数据时同时冻结几何体和笔,我还能做些什么呢?
我现在更喜欢使用DirectX而不是依赖WPF来做它,因为某些东西似乎非常错误.
编辑
为了进一步阐明我在做什么:该应用程序实时显示地理数据,非常像浏览器中的谷歌地图等应用程序:但它应该可视化更多,更多的数据.您可能知道,谷歌地图允许缩放和平移,它需要> 25 FPS才能显示为流畅的动画; 任何不足都不会流利.
*对不起,我不应该在实际产品发布之前上传这个视频.然而,您可以设想像谷歌地图这样的东西,但是有大量的矢量数据(多边形和折线).*
有两种解决方案,其中一种经常被陈述:
在位图中缓存重图
实现看起来有点简单,但我发现这种方法存在一些问题:为了正确实现平移,我需要避免 …
问题
我需要在 sqlite 数据库中存储有向图,我想知道如何解决这个问题。
我的第一个解决方案是创建两个表,一个用于节点,一个用于边缘,但是与问题的非关系模型相比,我对插入性能不满意。
给定一个包含 10 万个节点的典型图,每个节点都有 50 个传出边,插入到关系模型中大约需要 20 秒,而使用扁平方法则需要 7 秒。
实际问题
附加信息
我写了两个示例来演示我的问题:
关系法
public sealed class RelationalGraphDatabase
: IDatabase
{
private readonly SQLiteConnection _connection;
public RelationalGraphDatabase()
{
const string fname = @"E:\relational_graph.db";
if (File.Exists(fname))
File.Delete(fname);
var conn = new SQLiteConnectionStringBuilder
{
DataSource = fname
};
_connection = new SQLiteConnection(conn.ToString());
_connection.Open();
using (
var command = new SQLiteCommand("CREATE TABLE Node (Id INTEGER PRIMARY KEY, Name TEXT)", _connection))
{
command.ExecuteNonQuery(); …Run Code Online (Sandbox Code Playgroud)