当前位置:   article > 正文

限制Unity帧率的方式_unity 限定帧率

unity 限定帧率

1)限制Unity帧率的方式
2)只在编辑器内,纹理不开启Read&Write情况下,如何获取纹理所有颜色值
3)如何在FBX剔除Lit.shader依
4)如何在iPhone 12mini设备上禁止竖屏


这是第373篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。

Platform

Q:目前我们想把游戏设置为30帧,是通过Application.targetFrameRate实现的;但是会有一些兼容性问题,比如一些设备会动态调整设备刷新率导致游戏帧率过低(比如设备从120HZ动态降为60HZ时,游戏就从30帧掉为15帧了),我们也尝试过跟进设备的刷新率变化动态调整Application.targetFrameRate,但是一些设备还是出问题,主要是一些支持高刷新的设备,如120HZ、180HZ,设备在标准模式下本身会动态调整刷新率的,节约能耗。

不知道大家有没有相关的经验或者更好的解决方案?

A:可以尝试挂一个Update脚本,估计可以跟上高刷新的设备120HZ、180HZ的动态调整刷新率。

感谢NG週@UWA问答社区提供了回答


Editor

Q:只想在编辑器内优化一些纹理图片,纹理不开启Read&Write。

目前方案如下,但是会有几个问题:
1. LoadImage只支持PNG、JPG格式,像TGA、PSD格式则返回为空。
2. 对于那些几十MB的PNG纹理,也是返回空。

请问有无其他方式?

代码如下:

  1. var texture = AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath);
  2. var bytes = File.ReadAllBytes(assetPath);
  3. var new_texture = new Texture2D(texture.width, texture.height);
  4. var res = new_texture.LoadImage(bytes);
  5. if (res == false)
  6. {
  7. Debug.LogError($"错误提示:{assetPath}纹理资源LoadImage失败", texture);
  8. return null;
  9. }
  10. var colors = new_texture.GetPixels32(); // 获取到所需颜色数组

A1:可以试试以下方法:

  1. Texture2D texture = AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath); // 你的纹理
  2. byte[] rawTextureData = texture.GetRawTextureData();
  3. Texture2D finalTex = new Texture2D(texture.width, texture.height, texture.format, false);
  4. finalTex.LoadRawTextureData(rawTextureData);
  5. finalTex.Apply();
  6. var colors = finalTex.GetPixels32(); // 获取到所需颜色数组

请注意,所有这些方法都是在绕过Read/Write Enable的限制时的替代品,而不是直接的解决方案。如果可能,最好还是在导入纹理时启用Read/Write Enable以获得更好的性能和更简单的纹理操作。

另外一个方法:可以设置一个Camera的TargetTexture为一个RenderTexture,接着使用Graphics.Blit将目标纹理渲染到这个RenderTexture上。然后,你可以通过ReadPixels函数将RenderTexture读取为Texture2D。这种方法不依赖于Read/Write Enable。

扩展阅读:《高效访问纹理数据,持续优化整体性能》

感谢NG週@UWA问答社区提供了回答

A2:我之前用过@NG週说的办法,是可行的,不过我当时只处理PNG图片。

另外离线处理纹理,可以考虑使用Job来并行化处理,效果很高。

感谢junbin.liu@UWA问答社区提供了回答


Asset

Q:测试发现只能通过后处理才能去掉Lit.shader依赖,尝试使用AssetDatabase.LoadAssetAtPath(fbxPath)然后执行下面代码,并不能去掉依赖。请问还有什么其他办法吗?

  1. protected void OnPostprocessModel(GameObject model)
  2. {
  3. var renderers = model.GetComponentsInChildren<Renderer>();
  4. foreach (var renderer in renderers)
  5. {
  6. // 默认fbx会引用Lit.mat,会引起ab包冗余,导入时去掉
  7. foreach (var material in renderer.sharedMaterials)
  8. {
  9. if (material != null && material.name == "Lit")
  10. {
  11. renderer.sharedMaterials = new Material[0];
  12. }
  13. }
  14. }
  15. // 去掉fbx默认自带的材质球
  16. ModelImporter importer = (ModelImporter)base.assetImporter;
  17. if (importer != null)
  18. {
  19. if (importer.materialImportMode != ModelImporterMaterialImportMode.None)
  20. {
  21. importer.materialImportMode = ModelImporterMaterialImportMode.None;
  22. importer.SaveAndReimport();
  23. }
  24. }
  25. }

A:可以试试在打包阶段,打AssetBundle之前,去掉Lit.mat对lit.Shader的依赖。

Cube.prefab,就是Unity默认的Cube做成的Prefab。

  1. var prefabGO = AssetDatabase.LoadAssetAtPath<GameObject>(“Assets/Editor/Cube.prefab”);
  2. var renderer = prefabGO.GetComponent<Renderer>();
  3. renderer.sharedMaterial.shader = null;

感谢范世青@UWA问答社区提供了回答


iOS

Q:使用的Unity引擎是2020.347f1,已经在打包时候设置了横屏,然后又使用了以下代码设置,其它机型没问题但对面的机器还是能竖屏。

  1. Screen.orientation = ScreenOrientation.AutoRotation;
  2. Screen.autorotateToLandscapeLeft = true;
  3. Screen.autorotateToLandscapeRight = true;
  4. Screen.autorotateToPortrait = false;
  5. Screen.autorotateToPortraitUpsideDown = false;

想要禁止竖屏,设置横屏在安卓和大部分苹果上没问题,但在iPhone 12mini上却可以竖屏,请问还有其它方法吗?

A1:先确定iPhone 12mini的出包工程跟其他苹果设备的是否是同一个,接着排除有没有不小心在Xcode工程里面设置了竖屏模式,还有就是给iPhone 12mini装一个同类型的游戏,看看能不能横屏,排除是不是手机装了强制竖屏插件问题。

感谢NG週@UWA问答社区提供了回答

A2:遇到过一次,是手机系统的Bug,打开任何游戏都能切换横竖屏,重启下手机然后好了。

感谢jj@UWA问答社区提供了回答

封面图来源于网络


今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。

UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/98328
推荐阅读
相关标签
  

闽ICP备14008679号