成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

突破內存的桎梏:移動端紋理壓縮應用與分析

企業動態
最近一段時間AR技術成為了時下熱門,越來越多的應用開發者投身到這些技術中來。應用中出現了3D的AR場景,圖形學也成為了必備的技術基礎。在開發過程中,往往為了追求更好的效果而使用了更加高清的素材,使得本就內存吃緊的手機面對更加嚴峻的挑戰,尤其是對iOS開發者而言。

導語

最近一段時間AR技術成為了時下熱門,越來越多的應用開發者投身到這些技術中來。應用中出現了3D的AR場景,圖形學也成為了必備的技術基礎。在開發過程中,往往為了追求更好的效果而使用了更加高清的素材,使得本就內存吃緊的手機面對更加嚴峻的挑戰,尤其是對iOS開發者而言。 為了解決這個問題,我們使用了紋理壓縮技術。使用這個技術可以大幅度的降低APP的內存(共享顯存)占用,從而在有限的內存限制下,使用更豐富的素材。

1 前言

最近一段時間AR技術成為了時下熱門,越來越多的應用開發者投身到這些技術中來。應用中出現了3D的AR場景,圖形學也成為了必備的技術基礎。在開發過程中,往往為了追求更好的效果而使用了更加高清的素材,使得本就內存吃緊的手機面對更加嚴峻的挑戰,尤其是對iOS開發者而言。

為了解決這個問題,我們使用了紋理壓縮技術。使用這個技術可以大幅度的降低APP的內存(共享顯存)占用,從而在有限的內存限制下,使用更豐富的素材。

2 什么是紋理壓縮

常見的圖片文件格式,比如PNG,JPG,BMP等,是圖像為了存儲信息而使用的對信息的特殊編碼方式。它存儲在磁盤中,或者內存中,但是并不能被GPU所識別。

這些文件格式當被讀入后,還是需要經過CPU解壓成bitmap,再傳送到GPU端進行使用。

紋理格式是能被GPU所識別的像素格式,能被快速尋址并采樣。壓縮紋理,是一種GPU能直接讀取并顯示的格式,使得圖像無需解壓即可進行渲染,節約大量的內存。

3 常見的壓縮紋理格式

3.1 DXT

DXT紋理壓縮格式來源于S3(Silicon & Software Systems)公司提出的S3TC(S3 Texture Compression),基本思想是把4x4的像素塊壓縮成一個64或128位的數據塊,是有損壓縮方式。DXT1-DXT5是S3TC算法的五種變化,用于各種Windows設備。

壓縮率:DXT1,DXT4,DXT5為4:1,DXT2、DXT3為2:1

主要支持Windows平臺及Tegra系列的GPU的Android手機

支持GPU:

3.2 ETC

Ericsson Texture Compression,是由 Khronos 支持的開放標準,在移動平臺中廣泛采用。它是一種為感知質量設計的有損算法,其依據是人眼對亮度改變的反應要高于色度改變。類似于DXT,ETC也是把4x4的像素塊壓縮成一個64或128位的數據塊,也是有損壓縮。

這個系列,可以說是適用機型最廣的格式。

ETC1支持幾乎所有市面上的Android機,所有iPhone

ETC2支持大部分高端Android機,iPhone 5S及以上

3.3 PVRTC

PowerVR Texture Compression,PVRTC格式與基于塊的壓縮格式,比如S3TC、ETC的不同之處是,它使用2張雙線性放大的低分辨率圖,根據精度和每個像素的權重,融合到一起來呈現紋理,并且2-bpp和4-bpp都支持ARGB數據。PVRTC格式壓縮比較高,也是有損壓縮。

這個系列,是iPhone支持最廣的格式

只支持長寬相等且為2的冪次方的紋理

支持部分Android機(GPU:PowerVR系列),iPhone全系列機型

支持的GPU

3.4 ASTC

ASTC(Adaptive Scalable Texture Compression,自適應擴展紋理壓縮),這是ARM提出的,去年被Khronos組織認可,納入到標準中來,不過并不是強制性的

有多種壓縮方式可選,具有不同的壓縮率

這個系列,可以說是綜合性能和使用便捷性最好的系列。

支持部分高端Android機型,iPhone6及以上機型

4 主要優缺點

在幾乎不損害圖片質量和顯示性能的情況下,大幅度降低內存(顯存)開銷,紋理壓縮就是這樣的一個技術。

不過,任何的技術都有其適用范圍和優缺點,需要仔細評估再決定。

4.1 主要優點

占用內存(顯存)大幅度降低

無額外性能開銷

使用方便,只需少量代碼

4.2 主要缺點

硬件相關,要考慮兼容性

壓縮紋理文件大小比常規PNG和JPG文件大

需要額外的制作工具,無法直接在移動端生成

5 如何使用壓縮紋理

5.1 保存格式

壓縮紋理是圖片數據的一種編碼方式,我們還缺少一個容器去承載。就像MP4文件是H264的視頻的容器一樣。

我們選擇了使用KTX的格式。

KTX是一個為OpenGL和OpenGLES程序設計的紋理存儲格式。它可以簡單的辨別里面所存儲的紋理格式和其他相關信息。

5.2 文件結構

  1. Byte[12] identifier 
  2. UInt32 endianness 
  3. UInt32 glType 
  4. UInt32 glTypeSize 
  5. UInt32 glFormat 
  6. Uint32 glInternalFormat 
  7. Uint32 glBaseInternalFormat 
  8. UInt32 pixelWidth 
  9. UInt32 pixelHeight 
  10. UInt32 pixelDepth 
  11. UInt32 numberOfArrayElements 
  12. UInt32 numberOfFaces 
  13. UInt32 numberOfMipmapLevels 
  14. UInt32 bytesOfKeyValueData 
  15.  
  16. for each keyValuePair that fits in bytesOfKeyValueData 
  17.     UInt32   keyAndValueByteSize 
  18.     Byte     keyAndValue[keyAndValueByteSize] 
  19.     Byte     valuePadding[3 - ((keyAndValueByteSize + 3) % 4)] 
  20. end 
  21.  
  22. for each mipmap_level in numberOfMipmapLevels* 
  23.     UInt32 imageSize;  
  24.     for each array_element in numberOfArrayElements* 
  25.        for each face in numberOfFaces 
  26.            for each z_slice in pixelDepth* 
  27.                for each row or row_of_blocks in pixelHeight* 
  28.                    for each pixel or block_of_pixels in pixelWidth 
  29.                        Byte data[format-specific-number-of-bytes]** 
  30.                    end 
  31. end 
  32.            end 
  33.            Byte cubePadding[0-3] 
  34.        end 
  35.     end 
  36.     Byte mipPadding[3 - ((imageSize + 3) % 4)] 
  37. end 

5.3 使用KTX格式

  1. typedef struct __attribute__((packed)) 
  2.     uint8_t identifier[12]; 
  3.     uint32_t endianness; 
  4.     uint32_t glType; 
  5.     uint32_t glTypeSize; 
  6.     uint32_t glFormat; 
  7.     uint32_t glInternalFormat; 
  8.     uint32_t glBaseInternalFormat; 
  9.     uint32_t width; 
  10.     uint32_t height; 
  11.     uint32_t depth; 
  12.     uint32_t arrayElementCount; 
  13.     uint32_t faceCount; 
  14.     uint32_t mipmapCount; 
  15.     uint32_t keyValueDataLength; 
  16. } KTXHeader; 
  17.  
  18.  
  19.  
  20.  
  21. KTXHeader *header = (KTXHeader *)[data bytes]; 
  22.  
  23. BOOL endianSwap = (header->endianness == 0x01020304); 
  24.  
  25. self.width = endianSwap ? CFSwapInt32(header->width) : header->width; 
  26. self.height = endianSwap ? CFSwapInt32(header->height) : header->height; 
  27. self.internalFormat = endianSwap ? CFSwapInt32(header->glInternalFormat) : header->glInternalFormat; 
  28.  
  29. uint32_t mipCount = endianSwap ? CFSwapInt32(header->mipmapCount) : header->mipmapCount; 
  30. uint32_t keyValueDataLength = endianSwap ? CFSwapInt32(header->keyValueDataLength) : header->keyValueDataLength; 
  31.  
  32. const uint8_t *bytes = [data bytes] + sizeof(KTXHeader) + keyValueDataLength; 
  33. constsize_tdataLength = [data length] - (sizeof(KTXHeader) + keyValueDataLength); 
  34.  
  35. NSMutableArray *levelDatas = [NSMutableArrayarrayWithCapacity:MAX(mipCount, 1)]; 
  36.  
  37. const uint32_t blockSize = 16; 
  38. uint32_t dataOffset = 0; 
  39. uint32_t levelWidth = self.width, levelHeight = self.height; 
  40. while (dataOffset<dataLength) 
  41.     uint32_t levelSize = *(uint32_t *)(bytes + dataOffset); 
  42.     dataOffset += sizeof(uint32_t); 
  43.  
  44.     NSData *mipData = [NSDatadataWithBytes:bytes + dataOffsetlength:levelSize]; 
  45.     [levelDatasaddObject:mipData]; 
  46.  
  47.     dataOffset += levelSize; 
  48.  
  49.     levelWidth = MAX(levelWidth / 2, 1); 
  50.     levelHeight = MAX(levelHeight / 2, 1); 

 原文鏈接:https://www.qcloud.com/community/article/897529,作者:柯靈杰

【本文是51CTO專欄作者“騰訊云技術社區”的原創稿件,轉載請通過51CTO聯系原作者獲取授權】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2014-10-23 17:39:32

百度

2017-11-09 16:07:00

Web應用內存

2010-10-25 10:10:27

ibmdwJava

2015-03-12 10:36:11

Adobe

2011-03-01 09:23:47

移動Web應用開發成本

2024-07-11 11:19:05

2017-12-19 10:41:29

人工智能UCloudARKie

2017-07-04 15:10:20

移動端圖片旋轉壓縮

2015-12-09 10:24:23

數據輸入存儲

2016-09-28 21:30:41

移動搜索搜索

2022-07-27 17:40:47

技術人臉識別移動

2016-12-05 16:33:30

2020-06-02 15:22:41

新金融科技

2014-03-25 14:21:18

WebSocket實時

2019-10-25 10:42:51

框架Web開發

2011-08-02 09:04:02

移動應用開發

2015-08-19 10:07:18

云應用移動云應用云應用開發

2023-09-04 08:32:43

web開發圖像

2012-07-20 10:02:48

移動中間件web appPhoneGap

2014-12-10 14:34:40

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一本大道久久a久久精二百 国产成人免费在线 | 精品综合久久 | 欧美一区二区久久 | 青娱乐自拍| 91网视频 | 亚州无限乱码 | 性欧美hd | 亚洲精品一区二区三区四区高清 | 欧美日韩视频在线 | 在线视频一区二区 | 欧美性猛交 | 国产婷婷精品av在线 | 国产激情福利 | 欧美亚洲国产一区二区三区 | 国产精品一区二区三区久久久 | 久久久久国产一区二区三区 | 欧美精品一区二区蜜桃 | 超碰在线播 | 一区免费视频 | 欧美精品久久久久久久久老牛影院 | 欧美一二三区 | 日韩欧美在线不卡 | 日韩欧美国产成人一区二区 | 91精品国产一区二区在线观看 | 久久亚洲国产精品 | 精品无码三级在线观看视频 | 亚洲性人人天天夜夜摸 | 成人欧美一区二区三区在线播放 | 久久久精品久久久 | 99精品欧美一区二区三区 | 亚洲精品不卡 | 日日摸夜夜添夜夜添特色大片 | 99re超碰| 亚洲福利视频一区二区 | 伊人99| 成人午夜精品 | 久久久久久综合 | 日韩欧美一区二区三区 | 国产精品久久久久一区二区三区 | 免费黄色片在线观看 | 91视频在线看 |