请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

正在回答

4回答

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

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

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

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


1 回复 有任何疑惑可以回复我~
  • 提问者 PeterSix3244453 #1
    谢谢老师仔细的回答
    回复 有任何疑惑可以回复我~ 2018-04-03 09:57:18
  • 老师,你的意思是如果cell的样式比较复杂,且样式是变化的,这种情况下cell复用是不好的选择对吗?
    回复 有任何疑惑可以回复我~ 2021-09-01 10:02:04
ImoocZhang 2018-04-02 15:55:05

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

0 回复 有任何疑惑可以回复我~
提问者 PeterSix3244453 2018-04-03 10:02:41

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

0 回复 有任何疑惑可以回复我~
提问者 PeterSix3244453 2018-04-02 16:02:40

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

每次实时绘制。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信