精华内容
下载资源
问答
  • 关于android中的图片缓冲区问题

    千次阅读 2012-05-04 15:33:09
     android中的图片缓冲一直是个问题,包括超出虚拟机所分配的资源上限,重用已回收的bitmap等等,解决这个问题,每个人有每个人不同的方式,这里记录下我项目中学到的的图片缓冲区的实现方式。  一个bitmap...
    
        android中的图片缓冲区一直是个问题,包括超出虚拟机所分配的资源上限,重用已回收的bitmap等等,解决这个问题,每个人有每个人不同的方式,这里记录下我在项目中学到的的图片缓冲区的实现方式。

        一个bitmap,可以携带一个属性,标识着这个bitmap最后的使用时间。而我们如果创建一个缓冲区,这个区里的bitmap数量是有一定限制的,否则就会出现内存溢出,超出了虚拟机分给程序的内存空间。而这个bitmap的最后使用时间就是确定删不删除这个bitmap的标志。

       
    Java代码  收藏代码
    1. /** 
    2.     * A Bitmap associated with its last modification date. This can be used to check 
    3.     * whether the book covers should be downloaded again. 
    4.     */  
    5.    public static class ExpiringBitmap {  
    6.        public Bitmap bitmap;  
    7.        public Calendar lastModified;  
    8.    }  

       
        通过url去得到bitmap这个方法基本都是一致的,也许有的人写的强壮一点,功能会多一些。下边这个添加了附带cookies。其实多数时候是用不到的。

    Java代码  收藏代码
    1. /** 
    2.     * Loads an image from the specified URL with the specified cookie. 
    3.     * 
    4.     * @param url The URL of the image to load. 
    5.     * @param cookie The cookie to use to load the image. 
    6.     * 
    7.     * @return The image at the specified URL or null if an error occured. 
    8.     */  
    9.    public static ExpiringBitmap load(String url, String cookie) {  
    10.        ExpiringBitmap expiring = new ExpiringBitmap();  
    11.   
    12.        final HttpGet get = new HttpGet(url);  
    13.        if (cookie != null) get.setHeader("cookie", cookie);  
    14.   
    15.        HttpEntity entity = null;  
    16.        try {  
    17.            final HttpResponse response = HttpManager.execute(get);  
    18.            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {  
    19.                setLastModified(expiring, response);  
    20.   
    21.                entity = response.getEntity();  
    22.   
    23.                InputStream in = null;  
    24.                OutputStream out = null;  
    25.   
    26.                try {  
    27.                    in = entity.getContent();  
    28.                    if (FLAG_DECODE_BITMAP_WITH_SKIA) {  
    29.                        expiring.bitmap = BitmapFactory.decodeStream(in);  
    30.                    } else {  
    31.                        final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();  
    32.                        out = new BufferedOutputStream(dataStream, IOUtilities.IO_BUFFER_SIZE);  
    33.                        IOUtilities.copy(in, out);  
    34.                        out.flush();  
    35.   
    36.                        final byte[] data = dataStream.toByteArray();  
    37.                        expiring.bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);  
    38.                    }  
    39.                } catch (IOException e) {  
    40.                    android.util.Log.e(LOG_TAG, "Could not load image from " + url, e);  
    41.                } finally {  
    42.                    IOUtilities.closeStream(in);  
    43.                    IOUtilities.closeStream(out);  
    44.                }  
    45.            }  
    46.        } catch (IOException e) {  
    47.            android.util.Log.e(LOG_TAG, "Could not load image from " + url, e);  
    48.        } finally {  
    49.            if (entity != null) {  
    50.                try {  
    51.                    entity.consumeContent();  
    52.                } catch (IOException e) {  
    53.                    android.util.Log.e(LOG_TAG, "Could not load image from " + url, e);  
    54.                }  
    55.            }  
    56.        }  
    57.   
    58.        return expiring;  
    59.    }  



        在上边的方法里,可以看到有一个setLastModified(expiring, response);这个方法就是给bitmap这个数据添加上最后的修改时间,默认的会赋值成下载完成的时间,当二次访问的时候,我们可以重新赋值新的时间点。
       
       
    Java代码  收藏代码
    1. private static void setLastModified(ExpiringBitmap expiring, HttpResponse response) {  
    2.         expiring.lastModified = null;  
    3.   
    4.         final Header header = response.getFirstHeader("Last-Modified");  
    5.         if (header == nullreturn;  
    6.           
    7.         if (sLastModifiedFormat == null) {  
    8.             sLastModifiedFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");  
    9.         }  
    10.   
    11.         final Calendar calendar = GregorianCalendar.getInstance();  
    12.         try {  
    13.             calendar.setTime(sLastModifiedFormat.parse(header.getValue()));  
    14.             expiring.lastModified = calendar;  
    15.         } catch (ParseException e) {  
    16.             // Ignore  
    17.         }  
    18.     }  


         从缓冲区中获取bitmap,这个方法基本都是给外部调用的,如果缓冲区存在这个bitmap,会返回,如果不存在就调用load(url)方法去获得这个bitmap数据并且放入缓冲区中。

       
    Java代码  收藏代码
    1. /** 
    2.     * Retrieves a drawable from the book covers cache, identified by the specified id. 
    3.     * If the drawable does not exist in the cache, it is loaded and added to the cache. 
    4.     * If the drawable cannot be added to the cache, the specified default drwaable is 
    5.     * returned. 
    6.     * 
    7.     * @param id The id of the drawable to retrieve 
    8.     * @param defaultCover The default drawable returned if no drawable can be found that 
    9.     *         matches the id 
    10.     * 
    11.     * @return The drawable identified by id or defaultCover 
    12.     */  
    13.    public static FastBitmapDrawable getCachedCover(String id, FastBitmapDrawable defaultCover) {  
    14.        FastBitmapDrawable drawable = null;  
    15.   
    16.        SoftReference<FastBitmapDrawable> reference = sArtCache.get(id);  
    17.        if (reference != null) {  
    18.            drawable = reference.get();  
    19.        }  
    20.   
    21.        if (drawable == null) {  
    22.            final Bitmap bitmap = loadCover(id);  
    23.            if (bitmap != null) {  
    24.                drawable = new FastBitmapDrawable(bitmap);  
    25.            } else {  
    26.                drawable = NULL_DRAWABLE;  
    27.            }  
    28.   
    29.            sArtCache.put(id, new SoftReference<FastBitmapDrawable>(drawable));  
    30.        }  
    31.   
    32.        return drawable == NULL_DRAWABLE ? defaultCover : drawable;  
    33.    }  


        在文件的一开始,我们需要生成一个静态的缓冲区,一般都采用HashMap。

       
    Java代码  收藏代码
    1. private static final HashMap<String, SoftReference<FastBitmapDrawable>> sArtCache =  
    2.             new HashMap<String, SoftReference<FastBitmapDrawable>>();  


        从缓冲区中删除文件,从一个好的思路上来说,应该是对于缓冲区中所有文件进行一个对比,把那些长时间没有用到的文件删除。这给出的方法比较简单,就是删除所有的缓冲区文件。
       
       
    Java代码  收藏代码
    1. /** 
    2.      * Removes all the callbacks from the drawables stored in the memory cache. This 
    3.      * method must be called from the onDestroy() method of any activity using the 
    4.      * cached drawables. Failure to do so will result in the entire activity being 
    5.      * leaked. 
    6.      */  
    7.     public static void cleanupCache() {  
    8.         for (SoftReference<FastBitmapDrawable> reference : sArtCache.values()) {  
    9.             final FastBitmapDrawable drawable = reference.get();  
    10.             if (drawable != null) drawable.setCallback(null);  
    11.         }  
    12.     }  


        这样一个简单的缓冲区文件基本雏形就有了,其他的需要自己按照自己的需求去写一下方法。或者进行一些有话,比如说这里提出的思路是每次读取一个bitmap时都会重置他的lastModified这个属性,然后在删除时,我们对这个属性进行遍历,删掉低于平均访问水瓶的bitmap,当然这个在以上程序代码中没有明确代码,因为以上代码是为了各自不同需求的基本代码,可以自己进行修改。对于前边这个思路的优化,可以删除掉lastModified这个属性,而采用一个队列的缓冲区方式,每次访问,都把这个bitmap先从队列中取出来,也就是删除,然后添加到队尾,这样的思路好处在于,当缓冲区多大,需要删除掉一些图片时,可以直接删除队首的若干个元素,节约了遍历所有元素的时间。

        其他的对于缓冲区的使用还需要对线程进行一下控制,如果用的不好,也会出现一个线程的空间需求超出了分配给他的大小的异常。一般情况用线程池可以缓解这样的情况。
    展开全文
  • 然而以上问题依然没有解决,我推测可能是对方的接收缓冲区被填满,然后其连接的处理程序可能被无限期阻塞,从而导致接收缓冲一直处于被填满的状态,进而导致我的发送缓冲区也一直保持被填满的状态,最终表现为调用...
  • 关闭硬件加速会导致NiceImageView不画圆角,RoundImageView图片不显示,腾讯云视频点播一直缓冲不播放等问题

    AndroidManifest

    关闭硬件加速会导致NiceImageView不画圆角,RoundImageView图片不显示,腾讯云视频点播一直缓冲不播放等问题

    展开全文
  • MFC之缓冲绘图

    2013-07-23 19:05:52
    使用缓冲绘图只有以下几步: 1. 创建内存缓冲区 2.加载背景图片,如果...由于网上一般都是缓冲绘图,而双缓冲绘图应该以上步骤中加一个内存缓冲,然后创建一个虚拟图片缓冲区。之后将绘制了的实体图片缓冲区绘制到

    使用缓冲绘图只有以下几步:
    1. 创建内存缓冲区
    2.加载背景图片,如果需要用到图片宽高的话,再将CBitmap转成BITMAP类型
    3. 将背景图片选入到内存缓冲区中
    4.使用
    StretchBlt(可自动缩放图片)跟BitBlt将缓冲区拷贝到界面

    由于网上一般都是缓冲绘图,而双缓冲绘图应该在以上步骤中加一个内存缓冲,然后创建一个虚拟图片缓冲区。之后将绘制了的实体图片缓冲区绘制到新加的这个内存缓冲区中,最后才是将缓冲区拷贝到界面

    以下代码中:

    bufferDC跟picDC都是CDC对象,m_frameRect是主界面大小,bitmap是在init中加载的bmp图片。在init中设置定时器,并在定时器中不断更新文字位置(m_txtRect)跟文字颜色(m_curColor).


    void MyDialog::OnPaint()
    {
    	CPaintDC dc(this);
    	//之间加载图片是放在这里,后面导致无论定时器设置时间多短画的速度依旧慢。后面发现加载图片很耗时间
    	//所以加载最好是在Init那加载一次就行,关闭时记得释放图片
    	if(!m_bInit)
    	{//此处是创建一个内存背景图缓冲区
    		bufferDC.CreateCompatibleDC(&dc);//创建缓冲区	
    		picDC.CreateCompatibleDC(&dc); //创建用于图片绘图的缓冲区
    
    		bufferBMP.CreateCompatibleBitmap(&dc,m_frameRect.Width(),m_frameRect.Height());
    
    		picDC.SelectObject(&bitmap);//将位图选入选入角色位图DC
    		bufferDC.SelectObject(&bufferBMP); 
    
    		//bufferDC.BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,&picDC,0,0,SRCCOPY);
    		//为了拉伸图片全屏使用StretchBlt,可能会失真,所以要求高的尽量将背景图做到跟界面一样大小
    		bufferDC.StretchBlt(0,0,m_frameRect.Width(),m_frameRect.Height(),&picDC,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
    
    		m_bInit = true;
    	}
    	else
    	{//文字背景透明
    		//创建文字缓冲区
    		CBitmap bmpTemp;
    		CDC textDC;
    		textDC.CreateCompatibleDC(&dc);
    		bmpTemp.CreateCompatibleBitmap(&dc,m_frameRect.Width(),m_frameRect.Height());
    		CBitmap *pOldbmp = textDC.SelectObject(&bmpTemp);
    
    		//先将图片内存缓冲区绘制到bomoffDC当做背景
    		textDC.StretchBlt(0,0,m_frameRect.Width(),m_frameRect.Height(),&bufferDC,m_frameRect.left,m_frameRect.top,m_frameRect.Width(),m_frameRect.Height(),SRCCOPY);
    
    		textDC.SetBkMode(TRANSPARENT);
    		HGDIOBJ hOldFont = ::SelectObject(textDC,(HGDIOBJ)m_font);
    		textDC.SetTextColor(::GetSysColor(COLOR_3DHILIGHT | COLOR_BACKGROUND));
                    //为了增加阴影效果,所以在坐标位置挪动一个像素之后绘制下文字
    textDC.DrawText(m_curText,-1,m_txtRect + CPoint(1,1),DT_EDITCONTROL | DT_WORDBREAK);textDC.SetTextColor(m_curColor);//textDC.SetTextColor(::GetSysColor(COLOR_BTNTEXT));//绘制文字textDC.DrawText(m_curText,-1,m_txtRect,DT_EDITCONTROL|DT_WORDBREAK);dc.StretchBlt(m_frameRect.left,m_frameRect.top,m_frameRect.Width(),m_frameRect.Height(),&textDC,0,0,m_frameRect.Width(),m_frameRect.Height(),SRCCOPY);//下面两句环境还原,之前一直以为这个没作用就没加,导致程序运行第二次第三次时画不出背景图文字也不移动了::SelectObject(textDC,hOldFont); textDC.SelectObject(pOldbmp); textDC.DeleteDC();bmpTemp.DeleteObject();}// TODO: Add your message handler code here// Do not call CDialog::OnPaint() for painting messages}
    
    

    展开全文
  • framebuffer 的大小与屏幕大小、屏幕分辨率、图片显示方式有关。对与 gui 而言,所有的调用 lcd 驱动刷新 framebuffer 到屏幕上显示之前都是通过对 framebuffer 的操作完成。这里提及的操作主要使用 memcpy、...

    gui 中的显示功能

    嵌入式中,gui 中图像的显示最终通过调用底层 lcd 驱动提供的接口来将 【framebuffer】 刷新到屏幕上。framebuffer 的大小与屏幕大小、屏幕分辨率、图片显示方式有关。对于 gui 而言,所有调用 lcd 驱动刷新 framebuffer 到屏幕上显示之前的绘制操作都是通过对 framebuffer 的操作完成的。这里提及的操作主要是 memcpy、memset ,它们的速度将直接限制操作 framebuffer 的速度,因此一般都会编写多个版本的 memset、memcpy 来优化设置、拷贝的速度。

    上面的叙述表明 gui 中完全可以实现一套底层 lcd 驱动的接口,用以适配不同的 lcd 控制器。这样就能够屏蔽 lcd 控制器的差别,便于在不同的平台上进行移植。

    lcd 控制器的基本工作过程

    lcd 控制器的正常工作需要配置一些显示参数。如前肩后肩的延时等等。这里提及的前后肩延时其实只是为了兼容老的 lcd 控制器。这些控制器必须在刷新 framebuffer 到屏幕上的前后进行延时,这个延时实际是为了消抖,以得到更好的显示效果。

    当配置完成 lcd 控制器后,你还要设置 lcd 刷新时使用的 framebuffer 地址,与 framebuffer 大小。这一般在 gui 调用 lcd 提供的绘制接口中进行设定,设定后 lcd 控制器便会持续的从该地址按照指定的大小刷新数据到屏幕上。

    对于需要持续刷新的 lcd 控制器而言,其对设定的 framebuffer 的读取是一直在进行的,除非关闭 lcd 控制器。这就使得软件的代码逻辑中必须对缓冲区交换的时机进行判断。这个判断可以通过帧同步信号来完成。一般来说,常见的 lcd 控制器会在刷完一帧之后发出一个帧同步信号,这个帧同步信号就相当于通知用户时机已到,可以设置下一帧的地址了。

    单缓冲

    顾名思义,单缓冲就是仅仅使用一个 framebuffer 来完成绘制。此 framebuffer 的地址在设定给 lcd 控制器中的对应寄存器之前由 gui 填充。

    由于我们只是用了一个 framebuffer,这就可能导致 gui 在操作这个 framebuffer 的同时,lcd 控制器也在同时操作相同的内存。这样如果 framebuffer 的内容有所变化,那么我们可能会看到一个重叠的显示效果。这常见于用单缓冲去实现动态切换的内容及复杂的页面的场景中。这也就说明单缓冲并不适合用来设计复杂的页面,这是它的一大缺点。不过相较多缓冲机制,它的实现相对简单,使用的内存也相对较少,这是单缓冲的优势。

    双缓冲

    诚如其名,双缓冲使用了两个 framebuffer。常见的实现中这两个 framebuffer 一个称为 online fb、一个称为 offline fb。这两个 framebuffer 也可称为一个前置缓冲与一个后置缓冲。前置缓冲是 lcd 控制器绘制正使用的缓冲区,后置缓冲是 gui 能够继续填充的缓冲区。

    在实际的实现中,我们需要对这两个缓冲区进行交换。缓冲区的交换并不会再次进行 memcpy,而是通过交换指针来实现。也就是说,lcd 当前正在使用的 online fb 指针将会与 offline fb 指针进行切换,这样会极大的提高效率。

    该在什么时候进行缓冲区交换呢?

    这个时机的确定要以 lcd 控制器提供的功能为准。常见的方式是使用帧同步信号来完成,其它的方式请参考 lcd 控制器的用户手册。使用帧同步信号来实现的情况中,获取到一个帧同步信号就表明 lcd 已经刷完了上一帧,可以交换指针来刷新的一帧。

    **在这里我们需要注意交换指针一定要在新的一帧刷新开始之前完成。**一般在 lcd 控制器中设置的前后肩时间为交换指针操作提供了缓冲,不太容易出现问题。对于那些有两个 framebuffer 地址寄存器的 lcd 控制器而言,交换可以通过写入地址到当前未被用于显示的地址寄存器中,由 lcd 控制器来完成具体的指针切换工作。

    交换指针的安全保证让双缓冲的方式避免了单缓冲方式在动态内容显示中的问题,增加的一个缓冲区也在一定程度上提高了 gui 绘制的效率,这种方式的使用十分广泛。

    三缓冲

    三缓冲的工作原理与双缓冲类似,只是缓冲区的数目增加了一个。这个增加的缓冲区让缓冲区交换的实现更为复杂,却也提供了一个提高 gui 绘制效率的机会。在这种实现中我们将三个缓冲区分为一个前置缓冲区与两个后置缓冲区。当 cpu 填充 framebuffer 的速度非常快的时候,双缓冲方式可能会出现两个缓冲区都被占用的情况。这种情况下,由于缓冲区已经被用完,gui 无法绘制新的数据到framebuffer 中,这意味着它必须等待一次缓冲区交换的完成才能继续填充新的缓冲区。

    在相同的情况下,三缓冲增加的一个缓冲区能够在有限范围内避免不必要的等待。当两个缓冲区都被占用,gui 仍旧能够获取到一个后置缓冲区,不用等待就能继续在此缓冲区上进行绘制,这样就能提高绘制的效率。

    不过可以想象,在这种方式下缓冲区的交换比双缓冲更难实现。如果我们再增加缓冲区数目,不仅内存占用会成倍增加,且缓冲区交换功能实现的难度会不断上升,而绘制效率的提升空间却可能微乎其微,因此我们很难看到诸如四缓冲、五缓冲之类的实现。

    framebuffer 的内存属性对显示的影响

    gui 在实际绘制中可能存在许多问题。这里我想重点讲讲 framebuffer 内存属性配置对显示的一些影响,以 armv7-m 架构为例。

    armv7-m 的内存模型

    armv7-m 参考手册的第三章讲解了 arm 架构的内存模型。其中提到了内存的类型和属性及内存的序列模型。

    内存类型主要有三种——Normal、Device、Strongly-ordered。framebuffer 的内存分配主要与 Normal 类型的内存有关。

    Normal 内存可以分为非共享与共享两个类别。这种分类是以内存是否能被多个处理器访问划分的。非共享 Normal 内存只能被单个处理器访问。共享 Normal 内存能够被多个处理器或其它系统主控访问。

    对于非共享 Normal 内存,有四个具体的属性可以配置。

    1. Write-through cacheable
    2. Write-back,write-allocate
    3. Write-back,no write-allocate
    4. Non-cacheable

    潜在的问题

    这里的可能存在的问题主要与 cache 有关。对于可 cache 的内存属性,第一种属性会在数据写入到 cache 之后立刻将改动更新到内存中,第二、三种属性不会立刻将 cache 缓存的内存数据改动立刻写回到内存中,最后一种属性标志内存区域不可 cache。

    当你使用第二、三中属性配置 framebuffer 所属的内存区域时,显示时可能会出现部分数据残缺,且很有规律。在这种情况中,由于内存属性配置为写回型, cache 中缓存的一些界面数据没有立刻更新到内存中,导致显示出现部分残缺。将内存属性修改为第一种写通型就能显示正常的界面效果。第四种不可 cache 的配置也可以解决这个问题,只是它的效率不及第一种,因此不推荐使用。

    按照我的理解。写回型的配置其实是将数据变动更新到内存的时间延后了,一般会在当前的 cache 行被置换出去之前进行。这样的方式在大多数时间内都有助于提高性能,却并不适用于所有的情况,这里就是一个具体的例子。

    总结

    本文描述了嵌入式中 lcd 控制器的基本工作原理及在 gui 显示中经常使用的不同缓冲技术。通过对这几种不同缓冲技术的描述,我们对 gui 调用 lcd 控制器完成绘制的过程有了更好的了解。在文章最后我讲了一个与 framebuffer 内存属性配置有关的问题,这是一个相对基础的问题。实际开发中 gui 显示不正常可能有多种原因。其中既可能有内存属性配置不正确的问题,也可能有其它的问题,需要根据实际情况进行判定!

    展开全文
  • GID+ 双缓冲

    2014-11-13 22:09:15
    写创建选区的时候就发现屏幕一直闪烁,以为我是MouseMove事件里不断重绘整个窗口。这时我想到了双缓冲。GDI+ 的双缓冲很简单,下面贴一下我的代码: void OnDraw(CDC* pDC) { ... CRect rc; ...
  • 从去年到现在一直在断断续续学习Qt,这是第一次写博客,感觉学到的东西很少,希望以后能多学、多练、多写吧!(还有部分功能没有实现,等实现了再来补全。)  首先使用了一个窗口布局来实现这三个功能,包括如何...
  • canvas 图片加载 pen.drawImage(ele, showX, showY, imgWidth, imgHeight); ele 将 img 元素 加载到画布上 步骤 1. 创建一个 <img> 对象 var imgNode = new Image(); imgNode.src = "./img/bird....
  • vlc缓冲事件添加及缓冲进度

    千次阅读 2016-07-29 14:56:00
    1.缓冲事件添加:vlc已内置好事件,只不过未开放API。  主要参考:http://blog.csdn.net/memegood123/article/details/8769008 2.缓冲进度添加:  主要参考...
  • C缓冲

    千次阅读 2015-03-22 18:22:03
    其实gets这个函数还是有很多安全性的问题需要注意的,比如他要一直等EOF或者换行符才会结束,所以当程序无法预知可能存在的输入串长度时,是非常危险的,上一篇文章提到过缓冲区溢出的攻击,那么这里就是一个漏洞,...
  • 动画缓冲 - CAMediaTimingFunction

    千次阅读 2016-08-10 16:45:54
    关于CAAnimation的懂画执行,我们见过的组多的都是以匀速运动的,而实际上,物体的运动速度并不是匀速的,要么一直加速,要么先加速后减速等等,为了实现这一缓冲的过程,需要设置CAAnimation的timingFunction属性,...
  • C#绘图双缓冲

    千次阅读 2012-12-06 17:02:55
    简单说就是当我们进行画图操作时,系统并不是直接把内容呈现到屏幕上,而是先内存中保存,然后一次性把结果输出来,如果没用双缓冲的话,你会发现画图过程中屏幕会闪的很厉害,因为后台一直在刷新,而如果等...
  • C++缓冲区的理解

    千次阅读 多人点赞 2018-03-05 17:23:32
    也就是说,内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。二、为什么要引入...
  • PHP的输出缓冲

    2014-12-30 17:18:36
    至于为什么要有缓冲区,这是一个很广泛的问题,如果有兴趣,可以网山找下资料. 其实缓冲区最本质的作用就是,协调高速CPU和相对缓慢的IO设备(磁盘等)的运作.   PHP执行的时候,什么地方有用到缓冲区? 想要了解PHP...
  • php的缓冲区问题

    千次阅读 2016-04-21 01:52:03
    以下内容是看了别人的讲解和自己调试后对php缓冲... //打开一个输出缓冲区,所有的输出信息不再直接发送到浏览器,而是保存输出缓冲区里面。 ob_clean(); //删除内部缓冲区的内容,不关闭缓冲区(不输出)。 ob_end
  •   因为ROS一直在入门(从未踏入过),所以当时对“把缓冲区中的数据读完”产生了疑惑。回调函数每次只读取缓冲区中最旧的数据,而回调函数“返回”的指针也无法操作读取缓冲区中的其它数据,那如何实现把缓冲区的...
  • c# 双缓冲绘图GDI

    2014-07-28 20:13:11
    // 加载原图片 Bitmap oldBmp = new Bitmap(ParentControl.BackgroundImage); // 创建新图片 Bitmap bmp = new Bitmap(ParentControl.Width, ParentControl.Height);
  • 关于C++流的缓冲区的讨论

    千次阅读 2017-06-03 09:44:46
    现在来讨论一下关于C++的输入输出流的缓冲区问题 一般 C++ 我们使用输出流cout都会用到endl这个操纵符。是吧 C++里有几个可以来控制缓冲区刷新的操纵符。 endl flush ends unitbuf nounitbuf...
  • 执行IO操作我们通常会设置一个字节数组作为缓冲区用来写/读数据,一般情况下一个合理大小的缓冲区是有利于提升性能的,但是有一个问题一直困扰着我,为什么缓冲区可以提升IO操作的性能?  经查阅资料之后,总结...
  • PHP输出缓冲区的总结

    千次阅读 2019-02-26 15:59:26
     缓冲区:实际上是一个内存地址空间。它用来存储速度不同步的设备或者优先级不同的设备之间传输数据的区域。通过缓冲可  以使进程之间的交互时间等待变小,从而使从速度慢的设备读取数据时,速度快的设备的操作...
  • 屏幕刷新率一般是固定的,比如60Hz的每16ms就刷一次屏幕,可以类比一下黑白电视的电子扫描枪,每16ms电子枪从上到下从左到右一行一行逐渐把图片绘制出来,如果GPU显卡性能非常强悍,帧率可以非...
  • VC6.0双缓冲绘图和自绘控件

    千次阅读 2017-04-24 10:34:12
    一直在使用第三方控件TeeChart和MsChart,但是总有点不方便,无法做到自定义样式,移植的时候也有麻烦,所以想自己做画图控件,那就需要先学MFC的绘图功能(GDI绘图),之后就需要有一块画布来画图,从网上了解到,...
  • 一、为什么使用双缓冲图形刷新技术 双缓冲图形刷新技术能解决绘图时屏幕闪烁...很长一段时间我一直认为绘图过程中出现的屏幕闪烁是图形刷新速度过快而造成的(相信有很多朋友也跟我一样有这样的想法),但是通过编
  • cximage双缓冲绘图

    千次阅读 2013-04-01 08:59:34
    本来是想用gdi绘图的,但是一想到用gdi+libpng,还要自己处理一些比如alpha的效果之类的巨麻烦(而且涉及到处理每一个像素点的计算,一般都很耗时),我对自己处理像素点的能力一直持有怀疑态度。。so,先用cximage...
  • 验证本地缓冲区溢出漏洞攻击

    千次阅读 2016-10-30 19:03:31
    Info:本篇主要是为了验证本地缓冲区溢出,这是理解缓冲区溢出攻击的第一步,有了这一步,才能更深刻的理解到什么是缓冲区漏洞攻击,从而对以后的学习奠定一定的基础(注意:以下请linux环境下实验) 基本概念 NOP ...
  • c# GDI+的双缓冲问题

    千次阅读 2012-09-14 15:18:31
    一直以来的误区:.net1.1 和 .net 2.0 处理控件双缓冲上是有区别的。 .net 1.1 中,使用:this.SetStyle(ControlStyles.DoubleBuffer, true);  .net 2.0中,使用:this.SetStyle(ControlStyles....
  • QT_双缓冲技术1

    千次阅读 2013-03-05 13:51:55
    Rubber band(橡皮筋线,或者橡皮线), pixmap(图像,双缓冲中用到的图像,有时也直呼pixmap),off-screen pixmap(离线图像) Plot(plot,这一节实现的就是一个绘制曲线的控件Plotter,有时原文也叫plot,有点...
  • MFC 双缓冲技术和兼容DC

    千次阅读 2014-04-15 15:13:46
    很长一段时间我一直认为绘图过程中出现的屏幕闪烁是图形刷新速度过快而造成的(相信有很多朋友也跟我一样有这样的想法),但是通过编写一些绘图程序,我发现事情并非如此,至少刷新速度快不会是造成屏幕闪烁的根本...
  • c#双缓冲绘图(不闪烁的几种方法)

    千次阅读 2018-04-28 14:44:54
    简单说就是当我们进行画图操作时,系统并不是直接把内容呈现到屏幕上,而是先内存中保存,然后一次性把结果输出来,如果没用双缓冲的话,你会发现画图过程中屏幕会闪的很厉害,因为后台一直在刷新,而如果等...
  • 如果不使用深度缓冲,创建的立方体的某些本应被遮挡住的面被绘制了这个立方体其他面之上。OpenGL是一个三角形一个三角形地来绘制你的立方体的,所以即便之前那里有东西它也会覆盖之前的像素。因为这个原因,有些...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,239
精华内容 12,895
关键字:

一直在缓冲的图片