【问题标题】:Unity - force Android hardware accelerationunity - 强制Android硬件加速
【发布时间】:2018-01-30 21:44:48
【问题描述】:

我制作了一个使用后处理效果的 2D 游戏。结果,游戏在我的旧平板电脑上运行良好,后处理关闭时运行,但我想探索我的可能性。

有没有办法在我的 Unity 项目中强制进行 android 硬件加速?

编辑:我把这个清单放在我项目的 android 文件夹中。

我做对了吗?性能上没有显着差异。

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.unity3d.player"
    xmlns:tools="http://schemas.android.com/tools"
    android:installLocation="preferExternal"
    android:versionCode="1"
    android:versionName="1.0">
    <supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true"
        android:anyDensity="true"/>

    <application
        android:hardwareAccelerated="true"
        android:theme="@style/UnityThemeSelector"
        android:icon="@drawable/app_icon"
        android:label="@string/app_name">
        <activity android:name="com.unity3d.player.UnityPlayerActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
    </application>
</manifest>

编辑器截图:

【问题讨论】:

    标签: android unity3d settings hardware-acceleration


    【解决方案1】:

    只需将android:hardwareAccelerated="true"&gt; 添加到&lt;application 标记内的Android Manifest。就是这样。

    步骤如下:

    1.转到&lt;UnityInstallationDirecory&gt;\Editor\Data\PlaybackEngines\AndroidPlayer\Apk,将AndroidManifest.xml文件复制到你的&lt;ProjectName&gt;Assets\Plugins\Android

    2.打开从&lt;ProjectName&gt;Assets\Plugins\Android复制的Manifest文件并添加你的manifest。

    在&lt;application 之后添加android:hardwareAccelerated="true"&gt;。保存、构建和运行。

    【讨论】:

    • 谢谢。顺便说一句,我认为这不是默认的原因是因为这个硬件加速有点错误(或者至少是)并且不是那么稳定。是否有故障安全方法可以打开或关闭此功能?甚至可能来自应用程序内部?
    • 几年前我曾经在谷歌眼镜上使用过这个。完全没有问题。也许某些设备上存在问题。请参阅this 答案以了解如何通过代码进行操作。它给出了在 Manifest 中默认禁用它的建议。
    • 不客气。我相信该答案中的 Java 代码可能也可以使用AndroidJavaClass 转换为 C#。我懒得这样做,但是如果您有兴趣并尝试一下并失败了,如果您为它创建一个新问题,我可能会在有时间的时候尝试一下。
    • 好吧好吧。总是很好测试。确保所有设备都来自不同的制造商。编码愉快!
    • 看起来不错。我怀疑 Unity 发生了变化,并且可能正在从代码中设置 WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED。我建议你走代码的方式。首先使用Java来做。如果它有效,那么您可以尝试将其制作为完全没有 Java 的 C# 代码。
    【解决方案2】:

    仅当您没有任何其他带有自己的 Android 清单的 android 插件时,程序员的回答才有效。这是万无一失的方法(Unity 2018.1+):

    1. 下载Assets/Editor/ModifyUnityAndroidAppManifestSample.cs 脚本here 并将其放在项目中的相同位置。

    2. 在AndroidManifest类中添加如下函数:

      internal void SetHardwareAccel(){
         GetActivityWithLaunchIntent().Attributes.Append(CreateAndroidAttribute("hardwareAccelerated", "true")); 
      }  
      
    3. 在OnPostGenerateGradleAndroidProject(string basePath)中致电androidManifest.SetHardwareAccel();

    编辑:如果上述链接中断或您讨厌执行多个步骤(不是我们所有人),这里是您可以粘贴到Assets/Editor/ModifyUnityAndroidAppManifestSample.cs 的类(包括上述方法和调用):

    using System.IO;
    using System.Text;
    using System.Xml;
    using UnityEditor.Android;
    
    public class ModifyUnityAndroidAppManifestSample : IPostGenerateGradleAndroidProject
    {
    
        public void OnPostGenerateGradleAndroidProject(string basePath)
        {
            // If needed, add condition checks on whether you need to run the modification routine.
            // For example, specific configuration/app options enabled
    
            var androidManifest = new AndroidManifest(GetManifestPath(basePath));
    
            androidManifest.SetHardwareAccel();
    
            // Add your XML manipulation routines
    
            androidManifest.Save();
        }
    
        public int callbackOrder { get { return 1; } }
    
        private string _manifestFilePath;
    
        private string GetManifestPath(string basePath)
        {
            if (string.IsNullOrEmpty(_manifestFilePath))
            {
                var pathBuilder = new StringBuilder(basePath);
                pathBuilder.Append(Path.DirectorySeparatorChar).Append("src");
                pathBuilder.Append(Path.DirectorySeparatorChar).Append("main");
                pathBuilder.Append(Path.DirectorySeparatorChar).Append("AndroidManifest.xml");
                _manifestFilePath = pathBuilder.ToString();
            }
            return _manifestFilePath;
        }
    }
    
    
    internal class AndroidXmlDocument : XmlDocument
    {
        private string m_Path;
        protected XmlNamespaceManager nsMgr;
        public readonly string AndroidXmlNamespace = "http://schemas.android.com/apk/res/android";
        public AndroidXmlDocument(string path)
        {
            m_Path = path;
            using (var reader = new XmlTextReader(m_Path))
            {
                reader.Read();
                Load(reader);
            }
            nsMgr = new XmlNamespaceManager(NameTable);
            nsMgr.AddNamespace("android", AndroidXmlNamespace);
        }
    
        public string Save()
        {
            return SaveAs(m_Path);
        }
    
        public string SaveAs(string path)
        {
            using (var writer = new XmlTextWriter(path, new UTF8Encoding(false)))
            {
                writer.Formatting = Formatting.Indented;
                Save(writer);
            }
            return path;
        }
    }
    
    
    internal class AndroidManifest : AndroidXmlDocument
    {
        private readonly XmlElement ApplicationElement;
    
        public AndroidManifest(string path) : base(path)
        {
            ApplicationElement = SelectSingleNode("/manifest/application") as XmlElement;
        }
    
        private XmlAttribute CreateAndroidAttribute(string key, string value)
        {
            XmlAttribute attr = CreateAttribute("android", key, AndroidXmlNamespace);
            attr.Value = value;
            return attr;
        }
    
        internal XmlNode GetActivityWithLaunchIntent()
        {
            return SelectSingleNode("/manifest/application/activity[intent-filter/action/@android:name='android.intent.action.MAIN' and " +
                    "intent-filter/category/@android:name='android.intent.category.LAUNCHER']", nsMgr);
        }
    
        internal void SetApplicationTheme(string appTheme)
        {
            ApplicationElement.Attributes.Append(CreateAndroidAttribute("theme", appTheme));
        }
    
        internal void SetStartingActivityName(string activityName)
        {
            GetActivityWithLaunchIntent().Attributes.Append(CreateAndroidAttribute("name", activityName));
        }
        internal void SetHardwareAccel(){
            GetActivityWithLaunchIntent().Attributes.Append(CreateAndroidAttribute("hardwareAccelerated", "true"));
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-28
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      相关资源
      最近更新 更多