Android 使用HardwareAccelerated硬件加速总结

目录

介绍

一、GPU和CPU:

二、开启方式

三、检测方式


介绍

从Android3.0(API Level 11)开始支持硬件加速,在Target API >= 14时是默认开启的。可充分利用GPU的特性,使得界面渲染更加平滑,但是会消耗更多内存RAM。硬件加速自身并非完美,在某些Android 5的rom上,由于内存RAM分配的问题,如果代码不当,会引发闪屏、花屏等渲染问题。

如果只使用系统的View和Drawable,则没有任何副作用;降低页面的内存占用,给硬件加速腾出RAM;在适当的地方关闭硬件加速。

硬件加速的主要原理,就是通过底层软件代码,将CPU不擅长的图形计算转换成GPU专用指令,由GPU完成。

一、GPU和CPU:

CPU(Central Processing Unit,中央处理器)是计算机设备核心器件,用于执行程序代码,软件开发者对此都很熟悉;GPU(Graphics Processing Unit,图形处理器)主要用于处理图形运算,通常所说“显卡”的核心部件就是GPU。

下面是CPU和GPU的结构对比图:

其中:

  • 黄色的Control为控制器,用于协调控制整个CPU的运行,包括取出指令、控制其他模块的运行等;
  • 绿色的ALU(Arithmetic Logic Unit)是算术逻辑单元,用于进行数学、逻辑运算;
  • 橙色的Cache和DRAM分别为缓存和RAM,用于存储信息。

从结构图可以看出,CPU的控制器较为复杂,而ALU数量较少。因此CPU擅长各种复杂的逻辑运算,但不擅长数学尤其是浮点运算。CPU是串行结构,以计算100个数字为例,对于CPU的一个核,每次只能计算两个数的和,结果逐步累加。和CPU不同的是,GPU就是为实现大量数学运算设计的。从结构图中可以看到,GPU的控制器比较简单,但包含了大量ALU。GPU中的ALU使用了并行设计,且具有较多浮点运算单元。

很多计算机中的GPU有自己独立的显存;没有独立显存则使用共享内存的形式,从内存中划分一块区域作为显存。显存可以保存GPU指令等信息。

 

二、开启方式

HardwareAccelerated硬件加速可以在四个级别上控制硬件加速:

1、application:(AndroidManifest.xml)

    <application
        ...
        android:hardwareAccelerated="true"
       ...
        >

2、Activity:(AndroidManifest.xml)

        <activity
            android:name=".MainActivity"
            android:hardwareAccelerated="true">

3、Window

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

4、View

 view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

在这四个层次中,应用和Activity是可以选择的,Window只能打开,View只能关闭。

 

三、检测方式

两种方式来检测应用是否在使用硬件加速:

        view.isHardwareAccelerated();

//推荐
        canvas.isHardwareAccelerated();

推荐使用Canvas.isHardwareAccelerated()来检测。因为View关联到一个硬件加速的window上,仍然可以使用非硬件加速的canvas绘制。

 

四、总结

优点:

  1. 硬件加速对渲染的流畅度有大幅提升。
  2. 在开启硬件加速后,上下拖动列表的感觉是没有跳帧的平滑拖动感,如果没有硬件加速,拖动时能感受到有丢帧。
  3. 在窗体切换动画上也类似,硬件加速开关对切换动画的影响很大。
  4. 对于video、canvas、webgl,没有硬件加速是没法商用的,Android webview里video标签里的视频如果没有硬件加速会看不到画面。

缺点:

  1. 硬件加速属于双缓冲机制,使用显存进行页面渲染(使用较少的物理内存),导致更频繁的显存操作,可能引起以下现象:白屏、花屏、闪屏;
  2. 低RAM内存配置手机上闪退。
  3. 虽然新出的Android5.0的手机整体配置较高(显存较大),但是如果页面中使用大量图片或者过于复杂的CSS样式时同样容易出现白屏、花屏、闪屏现象。

 

参考连接

《关于Android硬件加速技术分析》

https://blog.youkuaiyun.com/iblade/article/details/80240961

<think>我们正在讨论Unity中Android硬件加速的配置。根据引用[1],可以在AndroidManifest.xml的<application>标签中添加android:hardwareAccelerated="true"属性来开启硬件加速。同时,引用[2]提到在代码中可以通过View.isHardwareAccelerated()和Canvas.isHardwareAccelerated()来检查硬件加速状态。 在Unity中,我们通常通过修改AndroidManifest.xml文件来配置硬件加速。以下是最佳实践: 1. **在AndroidManifest.xml中开启硬件加速**:在<application>标签中添加`android:hardwareAccelerated="true"`属性。注意,这个设置是全局的,会影响到整个应用的所有Activity和View。 2. **考虑兼容性**:硬件加速Android3.0(API级别11)开始支持,因此如果你的minSdkVersion低于11,需要谨慎。但如今绝大多数设备都支持,所以通常可以安全开启。 3. **Unity默认行为**:在Unity2018及更高版本中,Unity默认生成的AndroidManifest.xml文件已经包含了硬件加速设置(通常为true)。但为了确保最佳性能,我们建议显式设置。4.**检查硬件加速状态**:在Unity脚本中,我们可以通过以下方式检查当前是否处于硬件加速环境(但注意,Unity的渲染本身是硬件加速的,这个检查更多是针对Android原生视图):```csharp#if UNITY_ANDROIDusingUnityEngine;usingUnityEngine.Android;publicclass HardwareAccelerationChecker: MonoBehaviour{void Start(){//在Android平台上,Unity的渲染本身就是硬件加速的,但我们可以检查当前Canvas(如果有)//注意:在Unity中,我们通常不直接使用Android的View或Canvas,所以这个检查可能不常用//但如果你在Unity中使用原生插件,可能会用到Debug.Log("Unity isrunninginhardware acceleratedmode bydefault.");}}#endif```5.**最佳配置代码**:以下是包含硬件加速设置的AndroidManifest.xml示例: ```xml<?xmlversion="1.0"encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.yourcompany.yourapp"><uses-sdkandroid:minSdkVersion="19" android:targetSdkVersion="33"/><applicationandroid:label="@string/app_name"android:icon="@mipmap/app_icon"android:theme="@style/UnityThemeSelector"android:hardwareAccelerated="true"><!--开启硬件加速 --><activity android:name="com.unity3d.player.UnityPlayerActivity"android:launchMode="singleTask"android:screenOrientation="portrait"android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"android:resizeableActivity="false"><intent-filter><actionandroid:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest> ```6.**注意事项**:-硬件加速可以显著提升图形性能,但有时可能导致某些绘图操作不兼容(例如,某些混合模式或路径效果)。如果遇到图形渲染问题,可以尝试关闭硬件加速(设置为false)进行排查。-在Unity中,由于整个渲染过程都是基于OpenGLES或Vulkan,硬件加速是必要的,因此通常不应该关闭。7.**性能优化**:除了开启硬件加速,还可以在Unity PlayerSettings中启用多线程渲染(Multithreaded Rendering)和图形API优化(如使用Vulkan)来进一步提升性能。根据以上内容,硬件加速的最佳实践就是在AndroidManifest.xml中显式设置`android:hardwareAccelerated="true"`,并确保目标API级别合适。 §§相关问题§§1. Unity中如何检测Android硬件加速是否生效? 2.开启硬件加速后UnityAndroid应用出现图形问题怎么办?3.Unity Android除了硬件加速还有哪些图形性能优化方法?</think>### Unity Android硬件加速最佳配置代码 在Unity中配置Android硬件加速的最佳实践如下: #### 1. **AndroidManifest.xml基础配置** ```xml <!-- Assets/Plugins/Android/AndroidManifest.xml --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.yourcompany.yourapp"> <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="33" /> <application android:hardwareAccelerated="true" <!-- 核心硬件加速配置 --> android:theme="@style/UnityThemeSelector" android:label="@string/app_name" android:icon="@mipmap/app_icon" tools:replace="android:hardwareAccelerated"> <!-- Unity主Activity --> <activity android:name="com.unity3d.player.UnityPlayerActivity" android:hardwareAccelerated="true" <!-- 确保Activity级别启用 --> android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> ``` #### 2. **关键配置说明** 1. **硬件加速层级**: - 应用级:`<application android:hardwareAccelerated="true">` - Activity级:`<activity android:hardwareAccelerated="true">` - 双重启用确保最大兼容性[^1] 2. **解决配置冲突**: ```xml tools:replace="android:hardwareAccelerated" ``` 防止Unity默认配置覆盖自定义设置 3. **硬件加速检测脚本**: ```csharp // HardwareAccelerationChecker.cs using UnityEngine; public class HardwareAccelerationChecker : MonoBehaviour { void Start() { #if UNITY_ANDROID && !UNITY_EDITOR // 检测Canvas硬件加速状态 Debug.Log($"Canvas硬件加速: {new Canvas().isHardwareAccelerated}"); // 检测View硬件加速状态(需要Android插件) AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); AndroidJavaObject view = currentActivity.Call<AndroidJavaObject>("getWindow").Call<AndroidJavaObject>("getDecorView"); bool isViewAccelerated = view.Call<bool>("isHardwareAccelerated"); Debug.Log($"View硬件加速: {isViewAccelerated}"); #endif } } ``` 使用引用[2]提到的检测API验证加速状态 #### 3. **性能优化补充** 1. **图形API选择**: ```csharp // Player Settings → Graphics APIs // 优先顺序:Vulkan → OpenGLES3 → OpenGLES2 ``` 在支持设备上启用Vulkan API 2. **多线程渲染**: ```csharp // Player Settings → Multithreaded Rendering → Enabled ``` 提高GPU利用率 3. **TextMesh Pro优化**: 使用引用[3]提到的TextMesh Pro替代UI Text: ```csharp // 所有动态文本使用TextMeshPro组件 using TMPro; public TMP_Text performanceText; ``` #### 4. **疑难问题解决** 1. **硬件加速冲突**: ```xml <!-- 特定Activity禁用加速 --> <activity android:name=".WebViewActivity" android:hardwareAccelerated="false"> ``` 2. **白屏问题修复**: ```xml <style name="UnityThemeSelector" parent="android:Theme.NoTitleBar.Fullscreen"> <item name="android:windowBackground">@drawable/splash_background</item> </style> ``` 3. **低端设备降级**: ```csharp if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.OpenGLES2) { QualitySettings.SetQualityLevel(0); } ``` #### 5. **最佳实践建议** 1. **目标API级别**: ```xml <uses-sdk android:targetSdkVersion="33"/> ``` 保持最新SDK以获得最佳硬件加速支持 2. **渲染管线选择**: - URP(Universal Render Pipeline):移动设备首选 - 禁用HDR和MSAA:`QualitySettings.antiAliasing = 0` 3. **动态检测脚本**: ```csharp void OnPreRender() { if (!SystemInfo.graphicsMultiThreaded) { Debug.LogWarning("多线程渲染未启用!"); } } ``` > **重要提示**:硬件加速Android 3.0+(API 11)以上默认启用,但显式声明可避免设备特定问题[^1]。测试时需覆盖Adreno、Mali和PowerVR等主流GPU
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾阳Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值