Vuforia开发问题记录(六)------- iPhone X摄像机画面卡顿

现象是 : 手机移动一段时间后摄像机画面才同步过来

一.解决方案

1.xcode属性设置

在Unity减少安装包的大小总结中在xcode进行了不少设置,因此我重新发布了一个版本,只保留 舍弃架构armv7/XCode工程中将Bitcode由yes改为no (已默认为No)两项优化,重新上传,重新测试,不那么卡顿了,不清楚是哪一项优化导致

2.提高帧率

①.修改帧数

在 Edit/Project Settings/Quality  质量设置里把帧数设定关闭,关闭之后才能在代码中修改游戏运行的帧数。

Vuforia开发问题记录(六)------- iPhone X摄像机画面卡顿_第1张图片

Vuforia开发问题记录(六)------- iPhone X摄像机画面卡顿_第2张图片

 

在Unity中创建新脚本UpdateFrame.cs

using UnityEngine;
using System.Collections;

/// 
/// 功能:修改游戏FPS
/// 
public class UpdateFrame : MonoBehaviour
{
    //游戏的FPS,可在属性窗口中修改
    public int targetFrameRate = 300;
    
    //当程序唤醒时
    void Awake ()
    {
        //修改当前的FPS
        Application.targetFrameRate = targetFrameRate;
    }
    
}

 

②.根据帧率调整渲染分辨率

unity 提供了一个方法设置渲染分辨率:

Screen.SetResolution(designWidth,designHeight,true);

#if UNITY_ANDROID

int scWidth = Screen.width;
int scHeight = Screen.height;

int designWidth=720; //这个是设计分辨率
int designHeight=1280;

if( scWidth<=designWidth || scHeight<=designHeight)
    return;

Screen.SetResolution(designWidth,designHeight,true);
#endif

判断平均FPS, 如果最近15帧的平均FPS低于25,就降低渲染分辨率。

private float f_UpdateInterval = 0.5F;
private float f_LastInterval;
private int i_Frames = 0;
private float f_Fps;

private const int fpsArrayLen=8;
private float[] fpsArray = new float[fpsArrayLen];
private int fpsIndex=0;

private const int standardFPS=26;

/* 再update 中执行,每隔0.5秒计算一次FPS*/
void FPSUpdate()    
{
    ++i_Frames;

    if (Time.realtimeSinceStartup > f_LastInterval + f_UpdateInterval) 
    {
        f_Fps = i_Frames / (Time.realtimeSinceStartup - f_LastInterval);
        i_Frames = 0;
        f_LastInterval = Time.realtimeSinceStartup;

        fpsArray[fpsIndex]=f_Fps;
        fpsIndex=(++fpsIndex)%fpsArrayLen;
    }
}

/*判断时候达到了标准的FPS*/
private bool IsStandFPS()
{
    float totalFPS=0;
    for(int i=0;i

 

二.概念整理

帧 Frame : 视频或者动画中的每一张画面,而视频和动画特效就是由无数张画面组合而成,每一张画面都是一帧。

帧数 Frames : 帧数其实就是为帧生成数量的简称,可以解释为静止画面的数量,如果一个动画的帧率恒定为 60 帧每秒(fps),那么它在一秒钟内的帧数为 60 帧,两秒钟内的帧数为 120 帧。

值得说的是对于我们大多数手机视频拍摄能力,无论是 720P 还是 1080P 基本都只有 30 帧每秒,因为这个将涉及到手机 GPU 图形处理器的能力和存储能力,这都是受手机硬件条件的影响,当然一些手机也可以拍出 4K 视频,甚至可以使用 135 帧每秒的超高速拍摄功能。

帧率 Frame rate : 帧率(Frame rate) = 帧数(Frames)/时间(Time),单位为帧每秒(f/s, frames per second, fps)

FPS( Frame per Second)每秒显示帧数 : FPS 是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数。

FPS 是测量用于保存、显示动态视频的信息数量。每秒钟帧数愈多,所显示的动作就会愈流畅。

通常,要避免动作不流畅的最低是 30 。某些计算机视频格式,每秒只能提供 15 帧。

 

unity帧数设置 :

1、关掉垂直同步。

设置帧率为100

Vuforia开发问题记录(六)------- iPhone X摄像机画面卡顿_第3张图片

然后运行后的帧率是 100.

Vuforia开发问题记录(六)------- iPhone X摄像机画面卡顿_第4张图片

2、设置垂直同步为1

Vuforia开发问题记录(六)------- iPhone X摄像机画面卡顿_第5张图片

可以看到帧率为 60 帧左右跳动,完全无视了代码中的设定。

3、设定垂直同步为 2

Vuforia开发问题记录(六)------- iPhone X摄像机画面卡顿_第6张图片

可以看到帧率在 30帧左右跳动。

 

参考资料 :

浅谈显示技术中帧、帧数、帧率、 FPS 间有何区别?

解决Unity打包IOS项目启动时间过长——最白话,手把手教你做系列。

unity启动界面慢(黑屏)处理(二)

unity打包ios过大,ios压缩技巧

联机Unity Profile技巧

Unity 游戏帧率优化,设置分辨率

Unity3d 帧率设置 及在游戏运行时显示帧率

你可能感兴趣的:(unity,iOS,AR)