在drawRect中绘制对象与添加子视图并移动它们的框架的区别

3

(第一次在这里提问,请原谅我的礼仪错误)

基本情况:我有多个可以在屏幕上移动的图像。

简单解决方案#1
主循环将遍历对象数组,告诉每个对象移动自己,然后告诉视图刷新自己 [self.view setNeedsDisplay] 。然后,视图会获取数组并逐个绘制其在屏幕上的位置处的对象。

非常简单的示例项目,在其中放置了200个箭头的NSArray并将它们移动这里


简单解决方案#2
然后,我开始尝试让对象具有自己的视图作为属性。

当将对象添加到主要NSArray中时,视图会添加到主绘图视图中。 [self.view addSubView:newThing.view]

主循环将遍历对象并告诉它们移动。在对象类内部,移动将导致视图的frame.origin移动,从而导致它们在主视图上移动。

这也具有优势,即对象可以添加子视图到其图像中(如果需要),例如粒子效果或相关的子视图。

缺点是它似乎将更多类似视图的代码放入模型中,并隐藏了一些视图工作。

简单示例项目这里
注意:两个示例项目都绘制了比我在实际模拟器中预期需要的更多的内容。


我的“问题?”
解决方案#2使代码看起来更加清洁,进行一些简短的分析表明,在我达到数千个对象之前,似乎没有太多性能或内存差异,然后绘图版本可以节省大量内存开销。但即使在400个对象时,持有所有这些视图所需的额外内存也不是很多。

我是否忽略了不应使用解决方案#2的某些原因?让模型对其最终绘制内容更加聪明,是否会“破坏”VMC?

1个回答

0

你可以通过在对象和视图之间添加另一层来避免MVC违规,使用了解模型对象和视图的对象,并告诉视图如果有变化就移动。

方案#2需要更多的内存和计算,特别是如果你有很多对象。它也给你更少的绘制控制,如果你想要特殊效果可能会有问题。因此,至少对于游戏来说,通常不会使用。但最终,如果它确实让你的生活更轻松,而且你对性能满意,那么没有理由不选择它。

不过,看看核心动画可能是个好主意。它允许你实现类似的模式(然后每个对象都有自己的层而不是视图),但对于特殊效果来说更快更灵活。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接