关于c++/c#/java 多线程绘图问题说明
2016-06-28 17:04
633 查看
起初是在做android意识到主线程绘图的问题,只能在主线程中将图形绘制到屏幕上,在子线程中,也只能发送消息通知主线程绘图。后来看了下,所有语言亦是如此。作为初学者,我想不免会有疑问,为什么只能在主线程中绘图呢?为什么要有这样的限制?我多个线程绘图不是更快吗?其实如果你有这样的想法,就和当时的我一样,对线程没有理解到位。
首先,先说说在设计上为什么绘制都选择了单线程,很简单,其实就是因为你只有一双眼睛,一个线程足够满足绘制需求。如果说为什么不多线程分块绘制呢?因为多个线程绘制可能导致图形绘制的不同步。你看到了这个区域已经绘制出来了,而这个窗口的另外一个部分还没有绘制出来,显然这会造成极大的混乱。有人又问,线程同步不就能解决问题了么?那么,你得明白,线程是有开销的,在线程同步的情况下,仅仅是绘制屏幕上的点,顺序执行的时间是小于在线程上的开销的。
其次,你得清楚你的程序为什么慢。如果你绘制一个复杂的图形,发现很卡的话,那么我告诉你,这肯定不是绘制图形慢,而是你程序的分工不明确。将耗时操作放在了绘图的线程里,或者是复杂的计算冗余在一起。
最后我想说,多线程绘图一定是存在的。如果你确实需要使用多线程绘图,其实很简单,正如当时一个人让我恍然大悟。如果绘制一个极为复杂的图形,可以在内存中对这个图形进行分区绘制,然后,将这块内存交给主线程让它显示在屏幕上不就得了。这样不就相当于一张贴图吗。
记住,最最最最主要的目的就是避免主线程的耗时操作。
首先,先说说在设计上为什么绘制都选择了单线程,很简单,其实就是因为你只有一双眼睛,一个线程足够满足绘制需求。如果说为什么不多线程分块绘制呢?因为多个线程绘制可能导致图形绘制的不同步。你看到了这个区域已经绘制出来了,而这个窗口的另外一个部分还没有绘制出来,显然这会造成极大的混乱。有人又问,线程同步不就能解决问题了么?那么,你得明白,线程是有开销的,在线程同步的情况下,仅仅是绘制屏幕上的点,顺序执行的时间是小于在线程上的开销的。
其次,你得清楚你的程序为什么慢。如果你绘制一个复杂的图形,发现很卡的话,那么我告诉你,这肯定不是绘制图形慢,而是你程序的分工不明确。将耗时操作放在了绘图的线程里,或者是复杂的计算冗余在一起。
最后我想说,多线程绘图一定是存在的。如果你确实需要使用多线程绘图,其实很简单,正如当时一个人让我恍然大悟。如果绘制一个极为复杂的图形,可以在内存中对这个图形进行分区绘制,然后,将这块内存交给主线程让它显示在屏幕上不就得了。这样不就相当于一张贴图吗。
记住,最最最最主要的目的就是避免主线程的耗时操作。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories