精华内容
下载资源
问答
  • 它采用独特的软件算法,效率地将物理内存虚拟成物理硬盘,使得对硬盘文件的数据读写转化为对内存的数据访 问。由于物理内存的访问速度远远超过传统硬盘,因此可以极大的提高数据读写速度,从而突破硬盘瓶颈,飞速...
  • 占用硬盘空间合理,每路每小时占用硬盘空间在30M~300M之间。 ◆ 支持同时最多16路通道同时备份; ◆ 备份文件支持媒体播放器等第三方软件播放,保证录像资料的客观性; ◆ 支持预录像功能; ◆ 支持移动侦测录像...
  • 子程序 超级延时, , 公开, 精度延时,cpu占用低,窗口不卡死,一次最大可延时几年 (无返回值) .参数 延时间隔, 整数型, , 1000微秒 = 1毫秒 ; 1000毫秒 = 1秒 .参数 延时单位, 整数型, 可空, 可空:毫秒 0 毫秒 1 ...
  • 它采用独特的软件算法,效率地将物理内存虚拟成物理硬盘,使得对硬盘文件的数据读写转化为对内存的数据访问。由于物理内存的访问速度远远超过传统硬盘,因此可以极大的提高数据读写速度,从而突破硬盘瓶颈,飞速...
  • 它采用独特的软件算法,效率地将物理内存虚拟成物理硬盘,使得对硬盘文件的数据读写转化为对内存的数据访问。由于物理内存的访问速度远远超过传统硬盘,因此可以极大的提高数据读写速度,从而突破硬盘瓶颈,飞速...
  • 由于内存的白菜价和硬盘不下的贵族价,致使一些朋友升级硬盘的梦想暂时破灭!其实我们可以另辟蹊径,将物理内存虚拟成物理磁盘来使用,这样一方面可以解决暂时的磁盘空间紧张问题,更重要的是,内存的传输速度要...
  • Bitmap使用优化

    2021-03-14 15:51:04
    需要仅记的一点是,将一张图片解析成一个Bitmap对象时所占用内存并不是这个图片在硬盘中的大小(那是各种压缩格式压缩后的大小),可能一张图片只有100k你觉得它并不大,但是读取到内存当中是按照像素点来算的

    BItmap使用优化可以从三个方面进行:内存压缩、对象复用、内存磁盘缓存

    一. BItmap内存压缩

    当我们读取一个Bitmap图片的时候,有一点一定要注意,就是千万不要去加载不需要的分辨率。在一个很小的ImageView上显示一张高分辨率的图片不会带来任何视觉上的好处,但却会占用我们相当多宝贵的内存。需要仅记的一点是,将一张图片解析成一个Bitmap对象时所占用的内存并不是这个图片在硬盘中的大小(那是各种压缩格式压缩后的大小),可能一张图片只有100k你觉得它并不大,但是读取到内存当中是按照像素点来算的,比如这张图片是15001000像素,使用的ARGB_8888颜色类型,那么每个像素点就会占用4个字节,总内存就是15001000*4字节,也就是5.7M,这个数据看起来就比较恐怖了。

    Android中的图片是以Bitmap方式存在的,Bitmap所占用的内存 = 图片长度 x 图片宽度 x 一个像素点占用的字节数,所以Bitmap的内存优化可以从这三个参数入手,减少任意一个值,就可以减小内存占用。

    图片常用像素类型

    • ALPHA_8:表示8位Alpha位图,即透明度占8个位,一个像素点占用1个字节,它没有颜色,只有透明度。
    • ARGB_4444:表示16位ARGB位图,即A=4,R=4,G=4,B=4,一个像素点占4+4+4+4=16位,2个字节。
    • ARGB_8888:表示32位ARGB位图,即A=8,R=8,G=8,B=8,一个像素点占8+8+8+8=32位,4个字节。
    • RGB_565 :表示16位RGB位图,即R=5,G=6,B=5,它没有透明度,一个像素点占5+6+5=16位,2个字节

    通过改变图片的像素类型,可以改变每个像素点占用的内存大小,从而起到压缩作用。

    常见压缩方式

    1.质量压缩(对内存没有影响)
        private void compressQuality() {
            Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
            mSrcSize = bm.getByteCount() + "byte";
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);
            byte[] bytes = bos.toByteArray();
            mSrcBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
        }
    

    将BItmap的压缩到指定的OutputStream,可以理解成将Bitmap保存到文件中。这种方式其实就是吧Bitmap对象转为指定压缩格式的图片文件,减小图片文件的大小,方便保存和传递图片。

    如果将图像原始格式直接存储到文件中将会非常大,如果用zip或rar之类的通用算法来压缩像素数据,得到的压缩比例通常不会太高,因为这些压缩算法没有针对图像数据结构进行特殊处理。
    于是就有了jpeg,png等格式,jpeg,png文件之于图像,就相当于zip,rar格式之于普通文件。

    质量压缩不会减少图片的像素,它是在保持像素的前提下改变图片的位深及透明度,来达到压缩图片的目的,图片文件大小会变小。图片的长,宽,像素都不会改变,那么bitmap所占内存大小是不会变的。
    我们可以看到有个参数:quality,可以调节你压缩的比例,但是还要注意一点就是,质量压缩对png格式这种图片没有作用,因为png是无损压缩。

    质量压缩适合去保存和传递图片

    2.内存压缩

    2.1 采样率压缩

        private void compressSampling() {
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 2;
            mSrcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test, options);
        }
    

    采样率压缩其原理其实也是缩放bitamp的尺寸,通过调节其inSampleSize参数,比如调节为2,宽高会为原来的1/2,内存变回原来的1/4.

    2.2 缩放法压缩(martix)

        private void compressMatrix() {
            Matrix matrix = new Matrix();
            matrix.setScale(0.5f, 0.5f);
            Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
            mSrcBitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
            bm = null;
        }
    

    放缩法压缩使用的是通过矩阵对图片进行裁剪,也是通过缩放图片尺寸,来达到压缩图片的效果,和采样率的原理一样。

    2.3 createScaledBitmap

        private void compressScaleBitmap() {
            Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
            mSrcBitmap = Bitmap.createScaledBitmap(bm, 600, 900, true);
            bm = null;
        }
    

    直接将图片压缩成用户所期望的长度和宽度,来减少占用内存。

    2.4 RGB_565压缩

        private void compressRGB565() {
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.RGB_565;
            mSrcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test, options);
        }
    

    这是通过压缩像素占用的内存来达到压缩的效果,由于ARGB_4444的画质惨不忍睹,一般假如对图片没有透明度要求的话,可以改成RGB_565,相比ARGB_8888将节省一半的内存开销。


    加载长图大图的Bitmap优化

    Android加载长图优化

    Android 性能优化(五)之细说 Bitmap


    二. Bitmap对象复用

    使用Bitmap对象的复用和回收,解决的是减少频繁申请内存带来的性能(抖动、碎片)问题。

    可以维护一个Bitmap对象池,模仿glide:
    BitmapPool是Glide中的Bitmap复用池,同样适用LRU来进行管理。在每次解析一张图片为Bitmap的时候(磁盘缓存、网络/文件)会从其BitmapPool中查找一个可被复用的Bitmap。当一个Bitmap从内存缓存 被动 的被移除(内存紧张、达到maxSize)的时候并不会被recycle。而是加入这个BitmapPool,只有从这个BitmapPool 被动的被移除的时候,Bitmap的内存才会真正被recycle释放。


    三. 内存磁盘缓存

    使用LruCache对Bitmap进行缓存,当再次使用到这个Bitmap的时候直接获取,而不用重走加载和编码流程。(模仿Glide四级缓存)


    可以参考Glide的实现方式来加深理解: Glide实现原理解析

    展开全文
  • primo ramdisk5.1 crack

    2011-12-22 09:19:29
    它采用独特的软件算法,效率地将物理内存虚拟成物理硬盘,使得对硬盘文件的数据读写转化为对内存的数据访问。由于物理内存的访问速度远远超过传统硬盘,因此可以极大的提高数据读写速度,从而突破硬盘瓶颈,飞速...
  • 原因是内存不足以存下所有数据,或者要在内存中存下所有数据的成本过,所以我们期望只在内存中存热数据,通过压缩减少内存中冷数据的占用,甚至把冷数据逐出到更廉价的存储设备上(例如SSD或硬盘)。冷数据压缩发表...

    背景

    数据库领域经常提到冷热数据识别的问题,为啥要区分冷数据和热数据呢,原因是内存不足以存下所有数据,或者要在内存中存下所有数据的成本过高,所以我们期望只在内存中存热数据,通过压缩减少内存中冷数据的占用,甚至把冷数据逐出到更廉价的存储设备上(例如SSD或硬盘)。

    冷数据压缩

    发表于SIGMOD 2016的论文Reducing the Storage Overhead of Main-Memory OLTP Databases with Hybrid Indexes提出了一种Hybrid Indexes的技术将冷数据的索引进行压缩,达到减小内存使用的目的。这篇文章将索引分为两种格式,对应的数据也分为两个阶段,其中Dynamic Stage表示未压缩可以读写的热数据,Static Stage表示压缩后的只读的冷数据(索引和数据都被压缩)。读数据时先访问bloom过滤器,快速判断该数据是不是处于Static Stage的冷数据,如果bloom过滤器返回negative,那么只要查Dynamic Stage的数据即可,否则两边都需要查。写数据时只需要更新Dynamic Stage中的数据。

    这种方法的优点是冷数据的读性能不会下降,甚至由于索引更紧凑读性能可能还有所提升,且冷数据占用的内存大幅降低,缺点是压缩后的冷数据依然会占用不少内存。

    冷数据逐出

    将冷数据从内存中逐出到更廉价的存储设备上,是一种常规做法,它的优点是冷数据不再占用内存,缺点是冷数据的读写性能较差,因为需要先读到内存才能提供读写。该方法需要注意两个问题:一个是数据逐出的策略,包括逐出的时机和逐出数据在内存中的元信息,另一个是数据取回的策略,包括取回数据的粒度和合并回索引的策略。

    何时逐出冷数据,一般看内存使用率是否超过设置的阈值,超过后则触发冷数据的逐出流程。冷数据逐出后需要在内存中记录元信息,这样在用户查询时才能从存储设备中取回到内存中。逐出数据的元信息有三种实现方式:第一种使用Tombstones,它在独立的table heap里留下一个标识tombstone,记录该tuple或page被逐出到磁盘的具体位置pageId+offset,并更改索引指向该tombstone。第二种使用bloom过滤器,每个逻辑索引分为两个物理索引,分别记录热数据和冷数据,冷数据的索引可以逐出到存储设备中,如果bloom过滤器返回negative,说明该数据是热数据,只要查热数据的索引,否则除了查热数据的索引外,还需要查冷数据的索引,该方法被Hekaton使用。第三中使用OS的mmap技术,由OS来决定内存数据的换入换出,该方法看似简单,但由于数据库无法决定数据何时逐出到磁盘,这样就无法保证redo log的落盘要在数据落盘之前,也就无法保证数据库的持久性。

    识别冷数据

    识别冷数据常见的方法是LRU,跟踪每个tuple或page的访问并记录访问频率,逐出时可以选择访问频率低于阈值的tuple或page进行逐出,也可以对访问频率做个排序,优先逐出访问频率最低的tuple或page。该方法的优点是对访问频率有个定量的分析,可以优先逐出访问频率最低的tuple或page,缺点是对每个tuple或page需要额外的内存开销来记录访问频率信息,内存占用较多,而且访问频率的记录是在访问的关键路径上,会造成rt的增加。

    发表于ICDE 2018的论文LeanStore: In-Memory Data Management Beyond Main Memory提出了一种Hierarchical + Randomized逐出方法,该方法随机选择一批page将其置于cooling stage,就是认为它们是冷数据但依然保留在内存中,并跟踪一段时间这些page,如果在这段时间内某个page被访问,那么认为该page是热数据,将其放回热数据中,否则该page等到内存不够时就会被逐出。该方法的优点是内存开销少,不需要对每个page记录访问频率,只有cooling stage中少数的page需要额外内存开销,而且在访问的关键路径上不需要有额外的操作,不会增加rt。

    这个方法换个角度也可以用来识别热数据,跟踪一段时间这些page时,只要保留有访问的page,如果连续跟踪若干次该page都是热数据的话,那么就可以认为它肯定是热数据,识别出热数据对业务也是很有帮助的。

    参考Reducing the Storage Overhead of Main-Memory OLTP Databases with Hybrid Indexes

    Larger-than-Memory Data Management on Modern Storage Hardware for In-Memory OLTP Database Systems

    LeanStore: In-Memory Data Management Beyond Main Memory

    CMU 15-721

    展开全文
  • 它采用独特的软件算法,效率地将物理内存虚拟成物理硬盘,使得对硬盘文件的数据读写转化为对内存的数据访问。由于物理内存的访问速度远远超过传统硬盘,因此可以极大的提高数据读写速度,从而突破硬盘瓶颈,飞速...
  • Primo Ramdisk Ultimate 中文破解注册版

    热门讨论 2012-07-07 18:48:39
    虽然内存虚拟硬盘在速度方面占用绝对优势,但内存本身的易失性也是内存虚拟硬盘的致命伤。有没有可能让内存虚拟出来的硬盘也可以像物理硬盘一样能够永久保存数据呢?Primo Ramdisk 针对此问题提出了镜像功能。它允许...
  • 概述: OpenGL扩展, 包括ARB_texture_compression和EXT_texture_compression_s3tc, 从...4. 在硬盘中的占用空间更小,访问速度更快 此外, 压缩纹理可以让程序共用一块更分辨率的纹理. 我们将按照开发和运行时...


    概述:
    OpenGL扩展, 包括ARB_texture_compression和EXT_texture_compression_s3tc, 从不同层次为渲染管线提供了强大的支持: 
    1. 渲染速度更快
    2. 内存需求更小
    3. 纹理传输到内存中的速度更快
    4. 在硬盘中的占用空间更小,访问速度更快
    此外, 压缩纹理可以让程序共用一块更高分辨率的纹理.
     
    我们将按照开发和运行时两部分来向开发者们介绍如何使用纹理压缩.
    在开发中压缩纹理
    A. 纹理制作
    a. 一般方法
         1. 使用GL压缩纹理
         2. 将压缩后的图片保存到硬盘
    b. S3TC DDS文件格式
         1. 使用ISV的S3TC压缩工具压缩图片
         2. 在GL中载入DDS图片
    运行时中使用
    B. 运行时
         1. 从硬盘中载入压缩文件
         2. 上传压缩后的文件到GL
         3. 不要压缩动态纹理
     
    纹理制作
    我们可以在使用之前, 先将所有的纹理加载好. 这可以降低图片在硬盘中的占用空间, 并且提升运行时的加载速度. 压缩纹理有两种方式: 
    1. 使用OpenGL压缩
    2. 在ISV中选择一种S3TC的文件格式, 提供给OpenGL直接使用
     
    一般方法
    ARB_texture_compression扩展可以通过调用glTexImage2D, 并设置internalFormat参数来压缩纹理. 压缩可以通过以下两种方式中的任意一种来完成: 
    1. 使用表1中一般的压缩格式(internalFormat)进行压缩
    表1. 一般的压缩格式和对应未压缩的输入格式
    通用的纹理压缩格式 基础格式
    GL_COMPRESSED_RGB_ARB
    RGB
    GL_COMPRESSED_RGBA_ARB
    RGBA
    GL_COMPRESSED_ALPHA_ARB
    ALPHA
    GL_COMPRESSED_LUMINANCE_ARB
    LUMINANCE
    GL_COMPRESSED_LUMINANCE_ALPHA_ARB
    LUMINANCE_ALPHA
    GL_COMPRESSED_INTENSITY_ARB
    INTENSITY
    2. 使用表2中的S3TC压缩格式进行压缩
    表2. S3TC压缩格式和对应未压缩的输入格式
    S3TC纹理压缩格式 基础格式
    GL_COMPRESSED_RGB_S3TC_DXT1_EXT
    RGB
    GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
    RGBA
    GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
    RGBA
    GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
    RGBA
    注: S3TC只能对未压缩的RGB或RGBA进行压缩
    压缩纹理与非压缩纹理对比, 除了内容是否压缩这点不同之外, 其他工作机制都是相同的. 此外, 使用代理纹理可以在纹理压缩之前检测纹理是否需要被压缩.
     
    接下来, 确保纹理已经被正确的压缩, 可以通过调用glGetTexLevelParameteriv, 并将pname参数设置为GL_TEXTURE_COMPRESSED_ARB, 如果返回值不为0, 则该纹理已经被成功压缩. 倘若驱动压缩失败, 则纹理将被视为支持的压缩格式.
    如果使用通用的压缩格式, OpenGL会自动选取对应的压缩格式. 而我们需要获取这个格式, 可以再次调用glGetTexLevelParameteriv, 并将pname参数设为GL_TEXTURE_INTERNAL_FORMAT.
     
    再下一步, 向OpenGL请求压缩后的纹理的宽高. 再次调用glGetTexLevelParameteriv, 并将pname参数设为GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB. 根据返回的大小, 申请一块新的内存.
     
    然后, 调用glGetCompressedTexImageARB, 并将刚才申请的内存的地址作为img的参数, 获取压缩后的纹理数据.
     
    最后, 需要将压缩后纹理的元数据保存起来. 对于压缩数据, 通常需要保存以下数据, 以在运行时中使用:
    1. 内存大小
    2. 压缩格式
    3. 宽度
    4. 高度
    5. 边缘---非S3TC格式(请看下面S3TC的注解)
    6. 深度---非S3TC格式且是3D纹理(请看下面S3TC的注解)
     
    注: 当使用S3TC格式时, border必须为0. 当border不为0时, glCompressedTexImage2DARB会产生INVALID_OPERATION的错误. 
    注: S3TC为2D图片格式, 因此不需要depth字段. 当压缩格式是S3TC时, glCompressedTexImage1DARB和glCompressedTexImage3DARB会产生INVALID_ENUM的错误.
     
    当压缩格式不是标准格式时, 会产生跨平台的问题, 因此必须确保平台所支持的压缩格式. 通过调用glGetIntegerv, 并设置参数为GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB和GL_COMPRESSED_TEXTURE_FORMATS_ARB, 可以获取到对应平台支持的压缩格式. 见代码例子1.
    GLint * compressed_format; 
    GLint num_compressed_format;
     
    glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB, &num_compressed_format); 

    compressed_format = (GLint*)malloc(num_compressed_format * sizeof(GLint)); 

    glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS_ARB, compressed_format);
    代码例子1. 如何列举支持的纹理压缩格式
     
    值得注意的是, 列举出来的格式不一定和支持的格式完全相同. 列举格式的主要目的是找出那些"普通"的格式, 然后就可以让程序测试这些格式, 而不需要其他扩展包的知识. 这解释了为什么S3TC格式的列举中找不到GL_COMPRESSED_RGBA_S3TC_DXT1_EXT---这不是一个"普通"的RGBA格式.
    代码例子2总结了这个过程.
    glBindTexture(GL_TEXTURE_2D, compressed_decal_map); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_ARB, width, height, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, pixels);
     
    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED_ARB, &compressed);
     
    /* if the compression has been successful */ 
    if (compressed == GL_TRUE)
    {
        glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &internalformat);
     
        glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB, &compressed_size);
     
        img = (unsigned char *)malloc(compressed_size * sizeof(unsigned char));
     
        glGetCompressedTexImageARB(GL_TEXTURE_2D, 0, img);
     
       SaveTexture(width, height, compressed_size, img, internalFormat, 0); 
    }
    代码例子2. 压缩一个纹理, 并保存到硬盘中.
     
    有多种方式可以评估压缩后的图片质量. 可以评估纹理的质量参数(RED_BITS, GREEN_BITS, …), 或者实际压缩一下纹理. 对于后者, 可以通过调用glGetTexImage来获取未压缩的纹理数据.
     
    S3TC DDS文件格式
    DDS文件格式提供可选的方式来处理压缩纹理. ISV工具, 比如S3的Adobe PhotoShop插件, 微软DirectX的Dxtex, 都可以将普通的纹理文件压缩为DDS文件. 即Direct Draw Surface. 这意味着文件会被转存为DirectX Direct Draw Surface. 因此, DDS的读取必须添加DirectX的ddraw.h文件以获取到DDSURFACEDESC2的定义(见代码例子3). 处理DirectX的结构体需要注意的是DirectX的坐标原点为屏幕的左上角, 而OpenGL的坐标原点是屏幕的左下角. 因此需要在转换之前, 对纹理进行竖向翻转, 或者将t纹理坐标取反.
    #include <ddraw.h>
     
    gliGenericImage *ReadDDSFile(const char *filename, int * bufsize, int * numMipmaps) 
    {
    gliGenericImage *genericImage; DDSURFACEDESC2 ddsd;
    char filecode[4];
    FILE *fp;
     
    /* try to open the file */ 
    fp = fopen(filename, "rb");
     if (fp == NULL) return NULL;
     
    /* verify the type of file */
    fread(filecode, 1, 4, fp);
    if (strncmp(filecode, "DDS", 4) != 0) {
    fclose(fp);
     
    return NULL; 
    }
     
    /* get the surface desc */ 
    fread(&ddsd, sizeof(ddsd), 1, fp);
     
    genericImage = (gliGenericImage*) malloc(sizeof(gliGenericImage));
     memset(genericImage,0,sizeof(gliGenericImage));
    /* how big is it going to be including all mipmaps? */
    *bufsize = ddsd.dwMipMapCount > 1 ? ddsd.dwLinearSize * 2 : ddsd.dwLinearSize;
    genericImage->pixels = (unsigned char*)malloc(*bufsize * sizeof(unsigned char));
     fread(genericImage->pixels, 1, *bufsize, fp);
     
    /* close the file pointer */ fclose(fp);
     
    genericImage->width = ddsd.dwWidth;
    genericImage->height = ddsd.dwHeight;
    genericImage->components = (ddsd.ddpfPixelFormat.dwFourCC == FOURCC_DXT1) ? 3 : 4;
     *numMipmaps = ddsd.dwMipMapCount;
    switch(ddsd.ddpfPixelFormat.dwFourCC)
    {
     
    case FOURCC_DXT1:
    genericImage->format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; 
    break;
     
    case FOURCC_DXT3:
    genericImage->format = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; 
    break;
     
    case FOURCC_DXT5:
    genericImage->format = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; 
    break;
     
    default: 
    free(genericImage->pixels);
    free(genericImage);
    return NULL;
     
    }
     
    /* return data */
     
    return genericImage; 
    }
    代码例子3. DDS文件读取
     
    最后需要额外注意的是, DDS文件会被视为mipmap. 每个DDS文件中都包含着全部压缩后的mipmap, 而GL对此每次只取一个mipmap. DDS文件无法直接被GL的缓存读取. 我们需要计算每个mipmap对应的缓冲区的偏移量, 并将正确的内存地址和属性传给glCompressedTexImage2DARB. 代码列表4实现了这个过程., 即如何使用glCompressedTexImage2DARB函数, 请参考运行时章节.
    /* load the .dds file */
    ddsimage = ReadDDSFile("flowers.dds",&ddsbufsize,&numMipmaps);
    height = ddsimage->height;
    width = ddsimage->width;
    offset =0;
    blockSize = (ddsimage->format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) ? 8 : 16;
     
    glBindTexture(GL_TEXTURE_2D, dds_compressed_decal_map); 
    /* load the mipmaps */
    for (i = 0; i < numMipmaps && (width || height); ++i) {
     
    if (width == 0) width = 1;
     
    if (height == 0) height = 1;
     
    size = ((width+3)/4)*((height+3)/4)*blockSize; 
     
    glCompressedTexImage2DARB(GL_TEXTURE_2D, i, ddsimage->format, width, height, 0, size, ddsimage->pixels + offset);
     
    GLErrorReport();
    offset += size; width >>= 1; height >>= 1;
     
    }
    代码列表4. 如何获取DDS的mipmap数据到GL中.
     
    最后, 微软的DirectX SDK DXTex工具中提供了将mipmap的整图压缩到一张DDS中的方式. 这个功能非常方便, 因为我们可以把所有的纹理数据压缩到一张整图中. 为了从整图中读出每个纹理, DDS的读取也需要做对应的修改. OpenGL的读取方式和DirectX相同, 可以参考DirectX的文档.
     
    S3TC数据信息
    同一种压缩格式的S3TC的压缩比是固定的, 见下表.
    S3TC压缩格式 压缩(bits/textel) 压缩比(8bits/channel)
    GL_COMPRESSED_RGB_S3TC_DXT1_EXT
    4 6:1/8:1
    GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
    8 4:1
    GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
    8 4:1
    注: 24位的纹理, 在内存中实际是被存储为32位, 因此, GL_COMPRESSED_RGB_S3TC_DXT1_EXT可以被视为8:1的压缩比. S3TC的压缩公式为:
    ImageSize = blockSize * ceil(width / 4) * ceil(height / 4)
    其中, 当格式为DXT1时, blockSize为8字节, 当格式为DXT3/5时, blockSize为16字节. 
    以下图片的对比可以看出不同的放缩比率(抖动)和不同的图像分辨率下, 压缩和未压缩图像的质量:
    例子1. 左, 128*128未压缩的纹理. 右, S3TC RGB DXT1压缩的纹理, 抖动算法为GL_NEAREST.
    例子2. 左, 128*128未压缩的纹理. 右, S3TC RGB DXT1压缩的纹理, 抖动算法为GL_LINEAR.
    例子3. 左, 64*64未压缩的纹理. 右, S3TC RGB DXT1压缩的纹理, 抖动算法为GL_NEAREST.
    例子4. 左, 64*64未压缩的纹理. 右, S3TC RGB DXT1压缩的纹理, 抖动算法为GL_LINEAR.
    有趣的是, 将64*64未压缩的纹理和128*128压缩后的纹理放在一起, 它们所占用的内存是相同的, 然而, 压缩后的纹理效果却更好一些(见例子5).
    例子5. 左, 64*64未压缩的纹理. 右, 128*128 S3TC RGB DXT1压缩的纹理, 抖动算法为GL_LINEAR. 可以看到, 它们消耗的内存相同, 但是压缩后的纹理效果看起来更好一些.
     
    运行时
    纹理被压缩之后, 在运行时就需要将其解压. 程序在从硬盘中读取压缩后的纹理, 并载入到OpenGL的过程中时, 就可以得到很大的优化了. 首先, 它降低了在硬盘中的占用空间, 并增快了整体的加载速度. 其次, 压缩后的纹理在内存中的占用比未压缩时的占用小的多. 更重要的是, 单个纹理的内存占用减少后, 可以保证更多的纹理持续缓存在内存中, 而不需要频繁地删除纹理以腾出空间供新的纹理载入, 这很大程度上减少了从AGP和主存中申请和访问内存的次数. 最后, 压缩纹理降低了渲染时占用的带宽. 以上几点都可以增快整体的渲染速度. 例如, 在32位色运行雷神之锤3, 压缩后会有20%左右的速度提升.
     
    开始之前, 首先得从硬盘中载入对应的文件. 处理好纹理的宽度, 高度, 边缘, 深度, 压缩格式, 内存大小和纹理本身之后, 可以调用glCompressedTexImage2D并设置对应的压缩格式到internalFormat参数. 处理完之后, 运行时的压缩不会出现, 因为纹理会直接被存储到纹理内存中.
    glBindTexture(GL_TEXTURE_2D, already_compressed_decal_map); 
    glCompressedTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, border, image_size, data);
    代码例子5. 如何将压缩纹理直接存储到纹理内存中.
     
    特别注意的是, 不要将动态纹理存到纹理内存中, 因为那非常非常的慢.
     
    总结
    按照以上步骤完成, 纹理的压缩处理可以很大程度的提高程序的效率, 尽管这牺牲了小部分的图片质量. 以上的扩展包描述对应所有Release 5.xx驱动的NVIDIA GPU.
     
    参考文献:
    NVIDIA Developer web site (OpenGL Code example – OpenGL S3TC):
     
    OpenGL Extension Registry:
    • ARB_texture_compression specification
    • EXT_texture_compression_s3tc
     
    DirectX 7.0 documentation (MSDN search for: Texture Compression)
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

    转载于:https://www.cnblogs.com/Ringo-D/p/3182560.html

    展开全文
  • I/O密集型指得是系统运作大部分得状况是CPU在等I/O(硬盘/内存)的读/写操作,CPU占用率仍然较低、 例如:文件处理程序,网络爬虫程序,读写数据库程序 二:多线程、多进程、多协程的对比 进程包含线程 线程包含

    一:什么是cPu密集型计算,IO密集型计算

    • cpu密集型(cpu-bound)

      cpu密集型也叫计算密集型,是指I/O在很短得时间就可以完成,cpu需要大量得计算和处理,特点是CPU占用率相当高。

       例如:压缩解压缩,加密解密,正则表达式搜索
      
    • I/O密集型(I/O bound)

      I/O密集型指得是系统运作大部分得状况是CPU在等I/O(硬盘/内存)的读/写操作,CPU占用率仍然较低、

       例如:文件处理程序,网络爬虫程序,读写数据库程序
      

    二:多线程、多进程、多协程的对比

    进程包含线程

    线程包含协程

    • 多进程Process(multiprocessing)

      优点:可以利用多核CPU并行运算

      缺点:占用资源最多,可启动数目比线程少

      适用于:CPU密集型计算

    • 多线程Thread(threading)

      优点:相比进程,更轻量级,占用资源少

      缺点:

      ​ 相比进程:多线程只能并发执行,不能利用多CPU(CIL)

      ​ 相比协程:启动数目有限制,占用内存资源,有线程切换开销

      适用于:IO密集型计算同时运行的任务数据要求不多

    • 多协程Coroutine(asycio)

      优点:内存开销最少,启动协程数量最多

      缺点:支持的库有限制(aiohttp vs requests),代码实现复杂

      适用于:IO密集型计算,需要超多任务运行,但有现成库支持的场景

      三.GIL(全局解释器)

    是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行

    即便在多核处理器上,使用GIL的解释器也只允许同一时间执行一个线程

    所以他会让你的多线程成为假的多线程

    • 为什么会有GIL

    python设计初期,为了规避并发问题引入GIL,但后面发现GIL严重的影响了程序执行效率,现在想去除缺去不掉了!算是一种缺陷吧.

    • 怎样规避GIL带来的限制

      1.在多线程中机制中依然是有用的,用于IO密集型计算

      因为I/O期间,线程会释放GIL,实现CPU和IO的并行

      因此多线程用于CPU密集型计算时,只会更加拖慢速度。

      2.使用multiprocessing的多进程机制实现并行计算、利用多核CPU优势,为了应对GIL,python提供了multiprocessing

      四.怎样根据任务选择对应技术

         拿别人现成的图,这个图能很清晰的让你知道在面对进程,线程和协程时该如何选择
      

    在这里插入图片描述

    展开全文
  • Stanford机器学习-降维

    2018-10-15 22:28:11
    促使我们使用降维的原因有很多,可能是我们希望压缩数据,来减小数据占用计算机内存或是硬盘的大小,也可能是希望通过降低数据的维度来加快我们的算法的运行。 比如我们有上面的一些数据,我们用x1表示长度,单位...
  • 直接在浏览器中压缩PDF文件,所需时间极短 是否需要减小PDF文件的大小?...占用更少内存的文档有助于节省设备的存储空间。 您也可以通过电子邮件或任何使者轻松共享文档,因为它不会太大,无法发送。 支持语言:English
  •  关于占用内存的问题,很多用户反映 WinMount 占用内存过多。这实际上是使用方法的问题。当 WinMount 把一个ZIP 或RAR文件 mount 为一个虚拟盘时,实际上并不占用多少内存,虽然你看到的虚拟盘有2GB这么大。对虚拟...
  • 4.数据库备份,压缩,恢复,软件空间占用 程序下载: 程序演示:http://www.25175.com/200710/ 技术支持:http://www.25175.com/bbs/index.asp?boardid=26&page=1 调试操作系统:windows2000 winxp win2003 ...
  • 华为网盘一点无需占用太多电脑系统内存,支持1150种类型的文件,比如游戏,视频,电影,小说,音乐,图片,壁纸,学习资料,课件,源码,素材等。下载安装一点通客户端后,可以一键备份电脑硬盘里各类应用软件。并且...
  • 病毒入侵后,首先占领内存这个据点,然后便以此为根据地在内存中开始漫无休止地复制自己,随着它越来越庞大,很快就占用了系统大量的内存,导致正常程序运行时因缺少主内存而变慢,甚至不能启动;同时病毒程序会迫使...
  • RamDisk Plus,绝对好使

    2008-12-04 13:52:08
    将其称为虚拟的,是因为它并不是一个物理硬盘,而仅仅对操作系统和程序来说看起来像一个硬盘一样。 RamDisk Plus使用RAM的一部分来产生这个虚拟磁盘。这个RAM磁盘具有一个驱动器盘符,能够具有文件系统, 并且可以...
  • 同理,数值小性能,但是对内存的质量也要求严格! DRAM RAS# to CAS# Delay: 这个项目可控制DRAM作用指令与读取/写入指令之间的延迟时间,有2,3,4几种选择。数值越小,性能越好。 DRAM RAS# Precharge: 这...
  • 文字编辑都是在内存中进行的,只有保存时才将电子书进行加密,所以能保证您的资料无论何时都在硬盘上以加密的十六进制数字保存。而且加密的程度很,极难被解密。没有对应的密码谁也打不开您的电子资料。 电子书中...
  • 4.5.4 强制把内存中的数据写回硬盘的命令sync 112 4.5.5 退出抽取式设备的命令eject 112 4.5.6 挂载/卸载指定的文件系统的命令mount/umount 113 4.6 网络设置与维护 115 4.6.1 配置网络或显示当前网络接口状态的命令...
  • 它会极大占用你的CUP,所以请量力而行。 解压后为3G. Mac OS X Panther 10.3 版为您在数码时代生活提供一切帮助。 它的整个系统和应用程序能够很好地互相配合,并且迎合每个用户的使用风格。 PearPC 软件,通过该...
  • 2 优化压缩引擎,提高图像质量,降低CPU占用率 3 探头设置,增加报警盒输出选择功能 4 录像回放,最大支持16路 5 支持新旧板卡、音频卡混插 6 全新客户端软件,支持报警显示、36画面接收、自动重连功能 7 支持中...
  • 点量BT内核SDK_3.6.2

    2011-07-15 16:03:08
    点量BT的CPU、内存硬盘等资源是目前国内资源占用最低的内核,3.4版本以后,示例程序自动设置了8M的缓存,计算内存占用时可以考虑去除8M的缓存使用。其实早在点量BT的第一个版本,就已经做到了是国内最少资源占用...
  • 暗组远控2010脱壳版

    2010-02-22 04:08:43
    修正文件传输被控端异常断开导致控制端内存占用的bug 修正文件传输控制端异常断开导致被控端出错的bug V3.5 修正Active Setup启动不稳定的bug 重写被控端网络连接逻辑判断 修正控制端关闭时导致掉机的bug 由于...
  • TEST VGA CARD GPUZ

    2011-10-25 09:27:20
    测试机类型 处理器 主板/芯片组 显卡 内存 硬盘 --------------------------------------------------------------------------------------------------------- 台式机 赛扬 2.4G Intel 845GEV/ICH4 Extreme ...
  • 5、降低程序运行时程序内存占用量 OneKey Ghost Y6.0 正式版(版本号:6.0.2.26) ======================= 1、修复 DOS 下无法恢复 Ghost 映像文件的问题 OneKey Ghost Y6.0 正式版(版本号:6.0.2.24) ========...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    因为Linux与Windows不同,其后台运行着许多进程,所以强制关机可能会导致进程的数据丢失,使系统处于不稳定的状态,甚至在有的系统中会损坏硬件设备(硬盘)。在系统关机前使用 shutdown命令,系统管理员会通知所有...

空空如也

空空如也

1 2 3
收藏数 47
精华内容 18
关键字:

压缩内存硬盘占用高