Android如何关闭硬件加速



原文地址:http://developer.android.com/guide/topics/graphics/hardware-accel.html
译文地址:http://blog.chenming.info/blog/2012/09/18/android-hardware-accel/

硬件加速

Android 3.0 (API level 11), 开始支持
所有的View 的canvas都会使用GPU,但是硬件的加速会占有一定的RAM。
在API >= 14上,默认是开启的,如果你的应用只是标准的View和Drawable,全局都打开硬件加速,是不会有任何问题的。
然而,硬件加速并不支持所有的2D画图的操作,这时开着它,可能会影响到你的自定义控件或者绘画,出现异常等行为,
所以android对于硬件加速提供了可选性

如果你的应用执行了自定义的绘画,可以通过在真机上测试开启硬件加速查找问题

硬件加速的级别

Application

<application 
    android:hardwareAccelerated="false" 
...>
</application>

Activity

<application 
    android:hardwareAccelerated="true">
    <activity ... />
    <activity android:hardwareAccelerated="false" />
</application>

Window

getWindow().setFlags(
   WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
   WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

View

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

Note: 你可以关闭View级别的硬件加速,但是你不能在View级别开启硬件加速,因为它还依赖其他的设置

两种获取是否支持硬件加速的方式

View.isHardwareAccelerated()   //returns true if the View is attached to a hardware accelerated window.
Canvas.isHardwareAccelerated() //returns true if the Canvas is hardware accelerated

如果必须进行这样的验证,建议你在draw的代码块中使用:Canvas.isHardwareAccelerated(),因为如果一个View被attach到一个硬件加速的Window上,
即使没有硬件加速的Canvas,它也是可以被绘制的。比如:将一个View以bitmap的形式进行缓存

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android中可以使用FFmpeg进行硬件加速。具体来说,可以通过集成FFmpeg的MediaCodec模块来实现硬件加速。MediaCodec是Android提供的一个用于音视频编解码的API,它可以利用设备的硬件加速功能来提高编解码的性能。 在FFmpeg中,可以使用libavcodec模块的硬件加速功能来调用Android的MediaCodec。通过设置合适的解码器和编码器,可以实现对音视频数据的硬件加速处理。 以下是一个使用FFmpeg进行硬件加速的示例代码: ```c #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavutil/avutil.h> #include <libavutil/opt.h> int main() { // 初始化FFmpeg av_register_all(); // 打开输入文件 AVFormatContext *inputFormatContext = NULL; avformat_open_input(&inputFormatContext, "input.mp4", NULL, NULL); avformat_find_stream_info(inputFormatContext, NULL); // 查找视频流 int videoStreamIndex = -1; for (int i = 0; i < inputFormatContext->nb_streams; i++) { if (inputFormatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { videoStreamIndex = i; break; } } // 获取视频解码器 AVCodec *videoCodec = avcodec_find_decoder(inputFormatContext->streams[videoStreamIndex]->codecpar->codec_id); AVCodecContext *videoCodecContext = avcodec_alloc_context3(videoCodec); avcodec_parameters_to_context(videoCodecContext, inputFormatContext->streams[videoStreamIndex]->codecpar); avcodec_open2(videoCodecContext, videoCodec, NULL); // 创建硬件加速上下文 AVBufferRef *hwDeviceContext = NULL; av_hwdevice_ctx_create(&hwDeviceContext, AV_HWDEVICE_TYPE_MEDIACODEC, NULL, NULL, 0); // 设置解码器的硬件加速上下文 av_opt_set_int(videoCodecContext, "mediacodec", 1, 0); av_opt_set_q(videoCodecContext, "refcounted_frames", 1, 0); av_hwframe_ctx_init(videoCodecContext->hw_frames_ctx, hwDeviceContext); // 解码视频帧 AVPacket packet; while (av_read_frame(inputFormatContext, &packet) >= 0) { if (packet.stream_index == videoStreamIndex) { AVFrame *frame = av_frame_alloc(); avcodec_send_packet(videoCodecContext, &packet); avcodec_receive_frame(videoCodecContext, frame); // 处理解码后的视频帧 av_frame_free(&frame); } av_packet_unref(&packet); } // 释放资源 avformat_close_input(&inputFormatContext); avcodec_free_context(&videoCodecContext); av_buffer_unref(&hwDeviceContext); return 0; } ``` 这段代码使用FFmpeg打开一个视频文件,并通过硬件加速的方式解码视频帧。你可以根据自己的需求对解码后的视频帧进行处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值