老师您好,有一个问题请教下

来源:3-4 UI图像显示原理 相关面试问题

PeterSix3244453

2018-04-02

有一个比较复杂的绘制部分,是使用drawRect每次实时绘制相对更好,还是计算一次,生成一个imageView,然后每次渲染这张图即可,或者说,imageView的编解码渲染处理,和实时绘制到屏幕,哪个从成本或者性能上,更划算一些呢?

写回答

4回答

于海

2018-04-03

同学你好,我来解答一下您的这个问题,比如微博APP的场景下,每条微博卡片UI元素极其复杂,实际的业务场景是采用的实时绘制的,而这个实时绘制是发生在子线程当中的,最终由子线程将绘制结果也就是位图回传给主线程,在主线程当中设置对应UI控件Layer的contents属性。

相当于实际的业务场景是采用实时绘制的,但这个实时绘制是发生在子线程的,也就是课程当中讲的异步绘制。

我们假设采用您说的方案1,那么如果缓存每个控件的位图,会造成内存的大量消耗,而我们的TableViewCell又是高度复用的控件;另外,一般情况下数据变化会导致UI变化,这样缓存下来的位图,更没有太大的实际意义。

实际业务开发过程当中,都是需要经过平衡多方面的取舍提出最终的解决方案的,你能有不同方案的思考,是难能可贵的!


1
2
慕雪848360
老师,你的意思是如果cell的样式比较复杂,且样式是变化的,这种情况下cell复用是不好的选择对吗?
2021-09-01
共2条回复

ImoocZhang

2018-04-02

系统的UI控件当我们在某种时机下触发了setNeedsDisplay的话,就会重新进行drawRect:方法调用,每次绘制的结果可以理解为一张bitmap,并不是您说到的imageview。另外设置imageView的image,一般情况下是在主线程当中对图片进行解码操作,会占用一部分的主线程耗时。

0
0

PeterSix3244453

提问者

2018-04-03

老师,其实我还想了解下,加载一张图到屏幕上,到底发生了什么呢?

0
0

PeterSix3244453

提问者

2018-04-02

首先,感谢AndroidZhang同学的回答。可能我没说清楚导致你没有理解我想问的,但是我描述的场景是:
一个复杂的绘制场景,我的方案1是:
绘制一次,然后绘制成一张图,后面不去绘制了,每次加载这张图片;
方案2是:

每次实时绘制。

0
0

资深大牛带你深度剖析ios高级面试

从BAT/TMD名企真题入手,结合源码及应用,构建完整iOS知识体系

1749 学习 · 600 问题

查看课程