Model view controller 模型视图控制器-如何实现绘图

Model view controller 模型视图控制器-如何实现绘图,model-view-controller,Model View Controller,我正在考虑实现我自己的(玩具)MVC框架,主要是为了练习和享受其中的乐趣。我过去曾使用过这样的框架,但在考虑如何使用时,出现了几个问题。 所以最让我困惑的是我应该如何处理视觉元素的绘制。我的想法是在item的类中实现每个item的绘图逻辑,将它们组织成一个树结构,就像在WPF中一样,并传递某种画布,当遍历树时元素可以在其上绘制。 不过我还是有点怀疑,我是否应该把画布从整个视觉树上传下来。另一件有趣的事情是处理重叠的元素以及首先绘制哪些元素。我认为可视化树会按照元素在深度优先搜索中出现的顺序绘制元

我正在考虑实现我自己的(玩具)MVC框架,主要是为了练习和享受其中的乐趣。我过去曾使用过这样的框架,但在考虑如何使用时,出现了几个问题。 所以最让我困惑的是我应该如何处理视觉元素的绘制。我的想法是在item的类中实现每个item的绘图逻辑,将它们组织成一个树结构,就像在WPF中一样,并传递某种画布,当遍历树时元素可以在其上绘制。 不过我还是有点怀疑,我是否应该把画布从整个视觉树上传下来。另一件有趣的事情是处理重叠的元素以及首先绘制哪些元素。我认为可视化树会按照元素在深度优先搜索中出现的顺序绘制元素,从而解决这个问题。但后来我想,最新的元素应该在顶部,不管它离树的根有多近


因此,基本上,在绘制元素时,我找不到任何关于实现最佳实践或细节的信息,我可以就此提供一些友好的建议,或者如果您可以指出一些涵盖这方面的材料,那将非常受欢迎。

MVC模式通常不会处理这些细节。它最终归结为将问题分解为三大领域:数据和逻辑、用户输入和用户输出

不过我有点怀疑,我是否应该把画布传下去 整个视觉树

为什么?从绩效或耦合/责任的角度

如果是表现,这是一个非常坚实的开端。默认情况下,您确实需要从树上下来并重新绘制所有内容,但这可以通过将层次结构转换为加速器并跟踪屏幕/画布/图像的哪些部分需要重新绘制(“脏区域”)来缓解。仅向下延伸与此脏区域重叠的树枝

对于脏区域,可以将画布拆分为网格。由于小部件需要更新,请将它们所占据的区域标记为需要重新绘制。只有重绘小部件占用那些标记为需要重绘的网格单元。如果你想变得更加精细,并将透支减到最低程度,你可以使用四叉树(但对于所有系统来说,通常都是杀伤力过大的,只有那些最具动态性的系统才有精细的动画内容和类似的东西)

将所有缓冲区加倍并让孩子们进入他们父母的画布可能会让这个问题更容易解决,但这是一种获得一些即时性能的途径,以换取设计级别上的巨大性能障碍(内存消耗和缓存效率)。我不推荐这种方法:双缓冲窗口内容以避免闪烁的工件,但不是其中的每个控件

如果它是关于耦合和责任的,那么试图将小部件的呈现与小部件本身分离通常是对UI上下文的过度关注。在游戏体系结构中,通过实体组件系统将渲染与实体分离是很常见的,实体组件系统将提供渲染组件(通常以哑数据的形式),并将渲染功能推迟到系统,但是这些需要大量的前期工作来实现巨大的灵活性,在这种情况下,您可能永远不需要这些灵活性

另一件有趣的事情是处理重叠的元素和 先画哪个。我以为视觉树会解决这个问题 通过按元素在深度优先搜索中出现的顺序绘制元素。 但后来我认为最新的元素无论如何都应该在上面 它离树根有多近

这棵树不一定是这么硬的东西。可以将同级发送到子列表的前面或后面,以影响图形顺序。通常情况下,z顺序更改不会频繁发生,大多数情况下,使用这种方式比在渲染时动态地对图形进行排序带来的巨大开销要好


大多数情况下,我只是建议保持简单,特别是如果这是您第一次尝试构建通用MVC框架的话。你更可能犯错误,把事情弄得太复杂,把自己画在角落里。简单的设计就是柔韧的设计。

这是非常详尽的。我的印象是widget不应该知道他们画的画布,但这只是一种直觉,可能有一个更干净的解决方案。你的论点很有说服力,它给了我一些很好的想法。非常有帮助,谢谢。