0

PowerPoint 有一个奇怪的问题:我们有一个基于 .NET 的插件,它以编程方式在当前幻灯片中插入一组形状。第一次生成形状集时,整个操作需要不到一秒的时间。如果用户重复该操作,持续时间会一次又一次地增加,直到达到 15 秒,可能更多(我们已经停止测试该值)。如果我们重新启动 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 秒。

4

1 回答 1

1

我找到了解决方案:在每个形状删除/创建批次后,调用 StartNewUndoEntry。通过此调用,渲染时间不再随每个批次增加。

于 2013-06-10T08:18:55.337 回答