关于NGUI 什么时候用UIPanel,我找了一下相关的资料,我们先看一下的一个比喻例子:  

UIGeometry好比为煮菜准备食材,UIDrawCall好比是煮菜的工具(锅,炉子等),UIPanel就是大厨了决定着什么时候该煮菜,UIWidget(UILabel,UISprite和UITexture)是这道菜怎么样的最终呈现。

现在讲一下UIpanel工作流程,前面介绍UIDrawCall的产生过程,当然这是UIPanel最重要的工作之一,在对UIDrawCall进行更新是要对UIPanel的其他信息(transform,layer,widget)等进行更新:
  1. /// <summary>
  2. /// Main update function
  3. /// </summary>
  4. void LateUpdate ()
  5. {
  6. // Only the very first panel should be doing the update logic
  7. if (list[0] != this) return;
  8. // Update all panels
  9. for (int i = 0; i < list.size; ++i)
  10. {
  11. UIPanel panel = list[i];
  12. panel.mUpdateTime = RealTime.time;
  13. panel.UpdateTransformMatrix();
  14. panel.UpdateLayers();
  15. panel.UpdateWidgets();
  16. }
  17. // Fill the draw calls for all of the changed materials
  18. if (mFullRebuild)
  19. {
  20. UIWidget.list.Sort(UIWidget.CompareFunc);
  21. Fill();
  22. }
  23. else
  24. {
  25. for (int i = 0; i < UIDrawCall.list.size; )
  26. {
  27. UIDrawCall dc = UIDrawCall.list[i];
  28. if (dc.isDirty)
  29. {
  30. if (!Fill(dc))
  31. {
  32. DestroyDrawCall(dc, i);
  33. continue;
  34. }
  35. }
  36. ++i;
  37. }
  38. }
  39. // Update the clipping rects
  40. for (int i = 0; i < list.size; ++i)
  41. {
  42. UIPanel panel = list[i];
  43. panel.UpdateDrawcalls();
  44. }
  45. mFullRebuild = false;
  46. }

就不进行文字描述了,贴一张自己的画的LateUpdate()函数调用栈图(不光文笔不好,画图也不行,硬伤呀,就这样也是琢磨很久画的):

NGUI 什么时候用UIPanel