CN115690239A - 一种帧动画实现方法及装置 - Google Patents
一种帧动画实现方法及装置 Download PDFInfo
- Publication number
- CN115690239A CN115690239A CN202211298293.7A CN202211298293A CN115690239A CN 115690239 A CN115690239 A CN 115690239A CN 202211298293 A CN202211298293 A CN 202211298293A CN 115690239 A CN115690239 A CN 115690239A
- Authority
- CN
- China
- Prior art keywords
- texture
- animation
- compressed
- file
- frame
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Image Generation (AREA)
- Processing Or Creating Images (AREA)
Abstract
本发明提供帧动画实现方法及装置,方法包括:步骤1、读取纹理文件压缩包到内存中,每次读取一个ZipEntry作为当前动画的帧;步骤2、将读取到的InputStream流转换为ETC1纹理对象,生成压缩纹理对象;步骤3、将所述压缩纹理对象通过OpenGL渲染成可视图像;步骤4、加载所述压缩纹理对象的控件,并根据动画配置展示动画效果。本发明提高了帧动画的流畅度。
Description
技术领域
本发明涉及动画技术领域,尤其涉及一种帧动画实现方法及装置。
背景技术
随着硬件设备的发展,高清、色彩丰富的动画也逐渐成为主流。时长为3秒的动画一般至少由90张图片组成,如果采用帧动画的传统方法,除了磁盘空间占用大以外,播放帧动画的时候需要一次性加载该动画所有的图片,将一张PNG图片解码成BMP格式的图片需要200ms左右,而那么仅解码全部动画图片需要的时间就长达20秒左右,导致首次加载时间长、卡顿、图片内存占用高,甚至出现内存溢出的问题。
发明内容
本发明提供一种帧动画实现方法及装置,旨在解决现有技术中的缺陷,提高帧动画的流畅度。
为达到上述目的,本发明所采取的技术方案为:
本发明一方面提供一种帧动画实现方法,包括:
步骤1、读取纹理文件压缩包到内存中,每次读取一个ZipEntry作为当前动画的帧;
步骤2、将读取到的InputStream流转换为ETC1纹理对象,生成压缩纹理对象;
步骤3、将所述压缩纹理对象通过OpenGL渲染成可视图像;
步骤4、加载所述压缩纹理对象的控件,并根据动画配置展示动画效果。
具体地,所述步骤1包括:通过ZipInputStream的getNextEntry方法读取ZipEntry。
具体地,所述读取ZipEntry包括:通过ZipEntry的getName()获取当前帧的名称,通过ZipInputStream的read(byte[])读取当前帧的内容。
具体地,所述步骤2包括:
步骤201、将当前帧的inputStream流数据读取到输入缓冲区中;
步骤202、根据预设关系式计算所述输入缓冲区中实际编码数据大小;
步骤203、根据所述实际编码数据大小在内存空间中申请相同大小的数据缓冲区;
步骤204、从所述输入缓冲区中首字节开始读取所述实际编码数据字节数的内容拷贝至所述数据缓冲区中;
步骤205、根据所述数据缓冲区中的数据,创建一个ETC1的压缩纹理对象。
具体地,所述步骤3包括:
步骤301、创建OpenGL的渲染程序Shader;
步骤302、所述渲染程序Shader根据xml属性或者set方法中的读取顺序参数确定加载顺序;
步骤302、所述渲染程序Shader叠加Alpha透明纹理以及RGB颜色纹理,完成渲染。
具体地,所述步骤302包括:
步骤A1、激活第一纹理单元;
步骤A2、调用glBindTexture,将RGB颜色纹理textTure绑定到已激活的所述第一纹理单元;
步骤A3、调用glUniform1i将所述RGB颜色纹理传递给所述渲染程序Shader的片段着色器;
步骤A4、激活第二纹理单元;
步骤A5、调用glBindTexture,将Alpha透明纹理绑定到已激活的所述第二纹理单元;
步骤A6、调用glUniform1i将所述Alpha透明纹理传递给所述渲染程序Shader的片段着色器;
步骤A7、完成渲染。
进一步地,在所述步骤1之前还包括:
步骤0、创建压缩纹理动画文件。
具体地,所述步骤0包括:
步骤01、将带Alpha通道的PNG格式的全部动画序列图转换为动画序列图纹理,所述动画序列图纹理包括RGB颜色纹理和Alpha透明度纹理文件;
步骤02、将所有的所述动画序列图纹理创建纹理文件压缩包,生成压缩纹理动画文件。
本发明另一方面提供一种帧动画实现装置,包括依次连接的压缩文件提取模块、纹理创建模块、纹理渲染模块、动画显示模块;
所述压缩文件提取模块,用于读取纹理文件压缩包到内存中,并提取所述纹理文件压缩包中的动画序列图纹理文件;
所述纹理创建模块,用于将所述动画序列图纹理文件转换成压缩纹理对象;
所述纹理渲染模块,用于通过OpenGL将所述压缩纹理对象渲染成可视图像;
所述动画显示模块,用于加载所述压缩纹理对象的控件,并根据动画配置展示动画效果。
进一步地,所述帧动画实现装置还包括与所述压缩文件提取模块连接的压缩纹理模块,所述压缩纹理模块用于创建压缩纹理动画文件。
本发明的有益效果在于:本发明通过压缩文件的形式存储图片文件,在高清动画时可显著减少磁盘空间的消耗;通过压缩纹理的方式存储图片像素,使用GPU直接加载渲染,无需经过CPU解码,大大降低CPU负荷以及图片加载速度;并采用逐帧加载的方式,避免一次性加载所有序列图到内存中,大大减少了内存的消耗,提高了帧动画的流畅度。
附图说明
图1是本发明的帧动画实现方法的流程示意图;
图2是本发明的帧动画实现装置的结构示意图;
图3是本发明的帧动画实现装置的另一结构示意图。
具体实施方式
下面结合附图具体阐明本发明的实施方式,附图仅供参考和说明使用,不构成对本发明专利保护范围的限制。
在本发明的说明书、权利要求书或附图中描述的流程中,包含各个步骤的序号(如步骤10、20等),所述序号仅用于区分开各个步骤,所述序号本身不代表任何的执行顺序。需要说明的是,本文中的“第一”、“第二”等描述,仅用于区分描述对象等,不代表先后顺序,也不表示“第一”、“第二”等是不同的类型。
实施例1
如图1所示,本实施例提供一种帧动画实现方法,包括:
步骤1、读取纹理文件压缩包到内存中,每次读取一个ZipEntry作为当前动画的帧。
在本实施例中,通过ZipInputStream的getNextEntry方法读取ZipEntry。
在具体实施时,所述读取ZipEntry包括:通过ZipEntry的getName()获取当前帧的名称,通过ZipInputStream的read(byte[])读取当前帧的内容。
ZipInputStream是Java中用于读取磁盘上的压缩文件的输入流,一个ZipEntry表示一个压缩文件。
纹理文件压缩包可根据实际需要存放在工程的assets目录或者系统的sdcard目录,如果是assets目录,则ZipInputStream的读取方式需要修改为AssetManager;如果是sdcard目录,则ZipInputStream的读取方式需要修改为File读取。
在本步骤中,采用逐帧加载的方式,避免一次性加载所有序列图到内存中,大大减少了内存的消耗。
步骤2、将读取到的InputStream流转换为ETC1纹理对象,生成压缩纹理对象mTexture。
在本实施例中,所述步骤2包括:
步骤201、将当前帧的inputStream流数据读取到输入缓冲区inputBuffer中。
步骤202、根据预设关系式计算所述输入缓冲区InputBuffer中实际编码数据大小encodesSize。
在本实施例中,所述预设关系式为:当前帧的像素大小减去当前帧纹理头文件大小。
步骤203、根据所述实际编码数据大小encodesSize在内存空间中申请相同大小的数据缓冲区dataBuffer。
步骤204、从所述输入缓冲区inputBuffer中首字节开始读取所述实际编码数据字节数encodesSize的内容拷贝至所述数据缓冲区dataBuffer中。
步骤205、根据所述数据缓冲区dataBuffer中的数据,创建一个ETC1的压缩纹理对象mTexture。
步骤3、将所述压缩纹理对象mTexture通过OpenGL渲染成可视图像。
在本实施例中,所述步骤3包括:
步骤301、创建OpenGL的渲染程序Shader。
步骤302、所述渲染程序Shader根据xml属性或者set方法中的读取顺序参数确定加载顺序。
在具体实施时,所述渲染程序Shader首先判断Alpha透明纹理通道、RGB颜色纹理通道的排列顺序,如果Alpha透明纹理通道排在RGB颜色纹理通道之前,则第一次执行getNexture方法得到的即是Alpha透明纹理;再次执行getNexture时得到RGB颜色纹理;反之,第一次得到的RGB颜色纹理,第二次得到的是Alpha透明纹理。
步骤302、所述渲染程序Shader叠加Alpha透明纹理以及RGB颜色纹理,完成渲染。
在本实施例中,所述步骤302包括:
步骤A1、激活第一纹理单元GL_TEXTURE0;
步骤A2、调用glBindTexture,将RGB颜色纹理textTure绑定到已激活的所述第一纹理单元GL_TEXTURE0;
步骤A3、调用glUniform1i将所述RGB颜色纹理传递给所述渲染程序Shader的片段着色器;
步骤A4、激活第二纹理单元GL_TEXTURE1;
步骤A5、调用glBindTexture,将Alpha透明纹理绑定到已激活的所述第二纹理单元GL_TEXTURE1;
步骤A6、调用glUniform1i将所述Alpha透明纹理传递给所述渲染程序Shader的片段着色器;
步骤A7、完成渲染。
本步骤使用GPU直接加载渲染,无需经过CPU解码,大大降低CPU负荷以及图片加载速度。
步骤4、加载所述压缩纹理对象的控件,并根据动画配置展示动画效果。
所述动画配置包括图像大小、是否轮播以及播放速度。
在本发明的另一个实施例中,在所述步骤1之前还包括:
步骤0、创建压缩纹理动画文件。
在本实施例中,所述步骤0包括:
步骤01、将带Alpha通道的PNG格式的全部动画序列图转换为动画序列图纹理,所述动画序列图纹理包括RGB颜色纹理和Alpha透明度纹理文件。
在具体实施时,通过etcpack工具结合脚本指令将带Alpha通道的PNG格式的全部动画序列图批量转换为动画序列图纹理。
etcpack是mali开源的压缩/解压缩ETC格式的图像工具。例如,将如下命令写入批处理程序中,即可将animation_xxxx.PNG文件转换成分离alpha通道的两个压缩纹理文件animation_xxxx.pkm以及animation_xxxx_alpha.pkm:
etcpack animation_xxxx.PNG outputDir-c etc1-as–progress
其中,xxxx表示动画序列图的编号。
所述RGB颜色纹理和Alpha透明度纹理文件的扩展名为.pkm。
步骤02、将所有的所述动画序列图纹理创建纹理文件压缩包,生成压缩纹理动画文件。
在具体实施时,纹理文件压缩包为zip压缩文件,在PC机上使用压缩工具创建。根据压缩工具不同,生成的纹理文件压缩包中每张图片的Alpha透明度纹理文件的排序可能在RGB颜色纹理文件之前,也可能在RGB颜色纹理文件之后。
本步骤采用压缩文件的形式存储图片文件,在高清动画时,可显著减少磁盘空间的消耗。
实施例2
如图2所示,本实施例提供一种帧动画实现装置,包括依次连接的压缩文件提取模块、纹理创建模块、纹理渲染模块、动画显示模块;
所述压缩文件提取模块,用于读取纹理文件压缩包到内存中,并提取所述纹理文件压缩包中的动画序列图纹理文件;
所述纹理创建模块,用于将所述动画序列图纹理文件转换成压缩纹理对象;
所述纹理渲染模块,用于通过OpenGL将所述压缩纹理对象渲染成可视图像;
所述动画显示模块,用于加载所述压缩纹理对象的控件,并根据动画配置展示动画效果。
如图3所示,在本发明的另一个实施例中,所述帧动画实现装置还包括与所述压缩文件提取模块连接的压缩纹理模块,所述压缩纹理模块用于创建压缩纹理动画文件。
所述帧动画实现装置的工作过程如实施例1中对应的帧动画实现方法所述,不再赘述。
以上所揭露的仅为本发明的较佳实施例,不能以此来限定本发明的权利保护范围,因此依本发明申请专利范围所作的等同变化,仍属本发明所涵盖的范围。
Claims (10)
1.一种帧动画实现方法,其特征在于,包括:
步骤1、读取纹理文件压缩包到内存中,每次读取一个ZipEntry作为当前动画的帧;
步骤2、将读取到的InputStream流转换为ETC1纹理对象,生成压缩纹理对象;
步骤3、将所述压缩纹理对象通过OpenGL渲染成可视图像;
步骤4、加载所述压缩纹理对象的控件,并根据动画配置展示动画效果。
2.根据权利要求1所述的帧动画实现方法,其特征在于,所述步骤1包括:通过ZipInputStream的getNextEntry方法读取ZipEntry。
3.根据权利要求2所述的帧动画实现方法,其特征在于,所述读取ZipEntry包括:通过ZipEntry的getName()获取当前帧的名称,通过ZipInputStream的read(byte[])读取当前帧的内容。
4.根据权利要求1所述的帧动画实现方法,其特征在于,所述步骤2包括:
步骤201、将当前帧的inputStream流数据读取到输入缓冲区中;
步骤202、根据预设关系式计算所述输入缓冲区中实际编码数据大小;
步骤203、根据所述实际编码数据大小在内存空间中申请相同大小的数据缓冲区;
步骤204、从所述输入缓冲区中首字节开始读取所述实际编码数据字节数的内容拷贝至所述数据缓冲区中;
步骤205、根据所述数据缓冲区中的数据,创建一个ETC1的压缩纹理对象。
5.根据权利要求1所述的帧动画实现方法,其特征在于,所述步骤3包括:
步骤301、创建OpenGL的渲染程序Shader;
步骤302、所述渲染程序Shader根据xml属性或者set方法中的读取顺序参数确定加载顺序;
步骤302、所述渲染程序Shader叠加Alpha透明纹理以及RGB颜色纹理,完成渲染。
6.根据权利要求5所述的帧动画实现方法,其特征在于,所述步骤302包括:
步骤A1、激活第一纹理单元;
步骤A2、调用glBindTexture,将RGB颜色纹理textTure绑定到已激活的所述第一纹理单元;
步骤A3、调用glUniform1i将所述RGB颜色纹理传递给所述渲染程序Shader的片段着色器;
步骤A4、激活第二纹理单元;
步骤A5、调用glBindTexture,将Alpha透明纹理绑定到已激活的所述第二纹理单元;
步骤A6、调用glUniform1i将所述Alpha透明纹理传递给所述渲染程序Shader的片段着色器;
步骤A7、完成渲染。
7.根据权利要求1所述的帧动画实现方法,其特征在于,在所述步骤1之前还包括:
步骤0、创建压缩纹理动画文件。
8.根据权利要求7所述的帧动画实现方法,其特征在于,所述步骤0包括:
步骤01、将带Alpha通道的PNG格式的全部动画序列图转换为动画序列图纹理,所述动画序列图纹理包括RGB颜色纹理和Alpha透明度纹理文件;
步骤02、将所有的所述动画序列图纹理创建纹理文件压缩包,生成压缩纹理动画文件。
9.一种帧动画实现装置,其特征在于,包括:依次连接的压缩文件提取模块、纹理创建模块、纹理渲染模块、动画显示模块;
所述压缩文件提取模块,用于读取纹理文件压缩包到内存中,并提取所述纹理文件压缩包中的动画序列图纹理文件;
所述纹理创建模块,用于将所述动画序列图纹理文件转换成压缩纹理对象;
所述纹理渲染模块,用于通过OpenGL将所述压缩纹理对象渲染成可视图像;
所述动画显示模块,用于加载所述压缩纹理对象的控件,并根据动画配置展示动画效果。
10.根据权利要求9所述的帧动画实现装置,其特征在于,还包括与所述压缩文件提取模块连接的压缩纹理模块,所述压缩纹理模块用于创建压缩纹理动画文件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211298293.7A CN115690239A (zh) | 2022-10-22 | 2022-10-22 | 一种帧动画实现方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211298293.7A CN115690239A (zh) | 2022-10-22 | 2022-10-22 | 一种帧动画实现方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115690239A true CN115690239A (zh) | 2023-02-03 |
Family
ID=85067087
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211298293.7A Pending CN115690239A (zh) | 2022-10-22 | 2022-10-22 | 一种帧动画实现方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115690239A (zh) |
-
2022
- 2022-10-22 CN CN202211298293.7A patent/CN115690239A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109600666B (zh) | 游戏场景中的视频播放方法、装置、介质以及电子设备 | |
CN111193876B (zh) | 视频中添加特效的方法及装置 | |
CN104272740B (zh) | 颜色缓冲和深度缓冲压缩 | |
KR102444240B1 (ko) | 텍스쳐 처리 방법 및 장치 | |
CN104244087B (zh) | 一种视频渲染的方法及设备 | |
CN111311716B (zh) | 动画播放方法、装置、终端设备以及存储介质 | |
JP5120987B2 (ja) | 画像処理のための装置および方法、およびシステム | |
CN111866408B (zh) | 图形处理芯片及视频解码显示方法 | |
Kainz et al. | Technical introduction to OpenEXR | |
CN111221596B (zh) | 字体渲染方法、装置及计算机可读存储介质 | |
EP3580726B1 (en) | Buffer index format and compression | |
CN112714357B (zh) | 视频播放方法、视频播放装置、电子设备和存储介质 | |
JP3454914B2 (ja) | 画像生成方法および画像生成装置 | |
US20180129419A1 (en) | Updating data stored in a memory | |
CN105719321A (zh) | 一种压缩纹理的方法及装置 | |
KR20170113011A (ko) | 슬라이스 업데이트 맵을 이용하는 장치 및 방법 | |
US20050116946A1 (en) | Graphic decoder including graphic display accelerating function based on commands, graphic display accelerating method therefor and image reproduction apparatus | |
US11138786B1 (en) | Vertex attribute representation in graphics processing systems for executing a graphics processing pipeline | |
CN115690239A (zh) | 一种帧动画实现方法及装置 | |
US20230162329A1 (en) | High quality ui elements with frame extrapolation | |
KR20050040712A (ko) | 명령어 기반 그래픽 출력 가속 기능이 포함된 2차원그래픽 디코더, 그 그래픽 출력 가속 방법 및 영상 재생장치 | |
CN115391692A (zh) | 视频处理方法和装置 | |
CN118043842A (zh) | 一种渲染格式选择方法及其相关设备 | |
CN110930480B (zh) | 液晶仪表的开机动画视频直接渲染方法 | |
US20030016226A1 (en) | Apparatus and method for pixel block compression during rendering in computer graphics |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |