我们在PowerPoint中遇到了一个奇怪的问题:我们有一个基于.NET的加载项,它以编程方式在当前幻灯片中插入一组形状。第一次生成这组形状时,总操作需要不到一秒钟。 如果用户重复操作,持续时间会一次又一次地增加,直到它可以达到十五秒,可能更多(我们已停止测试该值)。 如果我们重新启动PowerPoint,则操作需要再少一秒钟才能完成。 我们试图在某些时间点调用GC.Collect,我们正在考虑完全重写形状集生成代码以按特定顺序生成所有形状,但这是一个非常昂贵的选择。 您对如何诊断此问题或如何解决此问题有其他建议吗?
一个简单的代码序列可以重现这个问题。
// Attach the callback below to a button in your add-in ribbon.
public void OnDevBtnReproduceRenderingPerformanceIssue(IRibbonControl control)
{
// Generate a decent set of shapes on the current slide,
// delete them, repeat until rendering time exceeds a certain value.
var slide = (Slide)Globals.ThisAddIn.Application.ActiveWindow.View.Slide;
var stopwatch = new Stopwatch();
for (var iter = 0; iter < 1000; iter++)
{
stopwatch.Start();
GenerateShapesSet(slide);
DeleteAllShapes(slide);
stopwatch.Stop();
Debug.Print("Render+delete took {0} ms", stopwatch.ElapsedMilliseconds);
stopwatch.Reset();
}
}
private static void DeleteAllShapes(Slide slide)
{
while (slide.Shapes.Count > 0)
{
slide.Shapes[1].Delete();
}
}
private static void GenerateShapesSet(Slide slide )
{
var shapesCount = 100;
for (var iter = 0; iter < shapesCount; iter ++)
{
var shape = slide.Shapes.AddTextbox(
MsoTextOrientation.msoTextOrientationHorizontal,
100,
100,
100,
100
);
shape.TextFrame2.TextRange.Text = "Test test test";
shape.TextFrame2.TextRange.Font.Name = "+mn-lt";
}
}
我们已经尝试释放所有COM引用到形状,但这并没有解决问题。 当代码执行时,可以看到渲染+删除时间从200毫秒增加到10秒。
答案 0 :(得分:1)
我找到了解决方案:在每个形状删除/创建批处理后,调用StartNewUndoEntry。 通过此调用,每个批次的渲染时间不再增加。