首页 > 其他分享 >Flutter调试debug或者打包release帧率只有60的原因

Flutter调试debug或者打包release帧率只有60的原因

时间:2024-08-25 13:05:22浏览次数:6  
标签:return String await 60 debug Future FileUtils release async

问题描述

最近发现Flutter中引入像素较大的静态图片或者字体导致调试或者打包之后在高刷手机上帧率只有60的问题。

  • 测试设备为小米13,可在开发者选项中直接打开帧率显示,

  • 也可使用statsfl插件显示帧率

    StatsFl(
        maxFps: 120, // Support custom FPS target (default is 60)
        align: Alignment.bottomCenter, //Alignment of statsbox
        child: MyApp(),
    ),
    

解决方案

大图片问题

可以适当缩小图片分辨率以及压缩图片。

1、PS中先将图片转换为智能对象,然后调整图像大小(按像素),之后保存图片。这样做可以最大限度保留清晰度。

2、图片压缩网站推荐

字体问题

不能通过静态字体方式,可以将网络字体下载到本地,然后动态加载。

1、字体初始化工具类

import 'dart:io';
import 'package:flutter/services.dart';
import 'package:muen_edu_app/network/dio/dio_instance.dart';
import 'package:muen_edu_app/utils/file_utils.dart';

class FontUtils {
  static FontUtils? _instan;
  final Map<String, String> fontFamilies = {
    "JiangCheng": "https://xxx.ttf",
    "SegoeUI": "https://xxx.ttf",
  };
  final String fontFloder = "fonts";

  FontUtils._();

  static FontUtils get instan => _instan ??= FontUtils._();

  Future initiaFont() async {
    String jiangCheng =
        await FileUtils.ins.getLocalDocumentFile(fontFloder, "JiangCheng.ttf");
    String segoeUI =
        await FileUtils.ins.getLocalDocumentFile(fontFloder, "SegoeUI.ttf");
    await loadFont(File(jiangCheng), "JiangCheng");
    await loadFont(File(segoeUI), "SegoeUI");
  }

  /// 加载字体
  Future loadFont(File fontFile, String fontFamily) async {
    if (!fontFile.existsSync()) {
      // 没有字体,去下载
      await downloadFont(fontFamilies[fontFamily]!, fontFamily);
    }
    Future<ByteData> readFont() async {
      ByteData byteData = (await fontFile.readAsBytes()).buffer.asByteData();
      return byteData;
    }

    FontLoader loader = FontLoader(fontFamily);
    loader.addFont(readFont());
    await loader.load();
  }

  Future<String> downloadFont(String url, String fontFamily) async {
    String savePath =
        await FileUtils.ins.getLocalDocumentFile(fontFloder, '$fontFamily.ttf');
    await DioInstance.instan.download(url, savePath);
    return savePath;
  }
}

2、文件工具类

import 'dart:io';
import 'package:muen_edu_app/network/dio/dio_instance.dart';
import 'package:path_provider/path_provider.dart';

class FileUtils {
  static FileUtils? _ins;

  FileUtils._();
  static FileUtils get ins {
    return _ins ??= FileUtils._();
  }

  /// 获取文档目录文件
  Future<String> getLocalDocumentFile(String folder, String filename) async {
    final dir = await getApplicationDocumentsDirectory();
    return '${dir.path}/$folder/$filename';
  }

  /// 获取临时目录文件
  Future<String> getLocalTemporaryFile(String folder, String filename) async {
    final dir = await getTemporaryDirectory();
    return '${dir.path}/$folder/$filename';
  }

  /// 获取应用程序目录文件
  Future<String> getLocalSupportFile(String folder, String filename) async {
    final dir = await getApplicationSupportDirectory();
    return '${dir.path}/$folder/$filename';
  }
}

3、dio下载

Future<Response> download(
  String url,
  String savePath, {
  CancelToken? cancelToken,
  Options? options,
  void Function(int, int)? onReceiveProgress,
}) async {
  return await _dio.download(
    url,
    savePath,
    onReceiveProgress: onReceiveProgress,
    options: options ??
        Options(
          method: HttpMethods.get,
          responseType: ResponseType.bytes,
          receiveTimeout: _defaultTime,
          sendTimeout: _defaultTime,
        ),
  );
}

4、调用初始化方法

FontUtils.instan.initiaFont();

5、设置全局默认字体

ThemeData(fontFamily: 'JiangCheng');

标签:return,String,await,60,debug,Future,FileUtils,release,async
From: https://www.cnblogs.com/sw-code/p/18378844

相关文章

  • ZBlog强制开启 Debug 调试模式
    常规开启调试模式是在后台设置中进行,在后台设置的全局设置里打开“调试模式”并保存即可。如果网站程序出错,不能进入后台进行设置,那么在1.7.3及更高版本可以在这样设置:使用空间面板的文件管理或者FTP修改文件:path/zb_users/c_option.php;'ZC_DEBUG_MODE'=>true,//开启Deb......
  • Citrix ADC Release 14.1 Build 29.63 (nCore, VPX, SDX, CPX, BLX) - 混合多云应用交
    CitrixADCRelease14.1Build29.63(nCore,VPX,SDX,CPX,BLX)-混合多云应用交付控制器CitrixADC-混合多云应用交付控制器请访问原文链接:https://sysin.org/blog/citrix-adc-14/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org大规模应用程序交付可能很复......
  • Spring Boot集成Spring Cloud Release进行版本发布管理
    SpringBoot集成SpringCloudRelease进行版本发布管理大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!版本发布管理的重要性在软件开发过程中,版本发布管理是一个关键环节。它不仅涉及到代码的编译、打包、测试和部署,还包括版本控制、自动化部署和回......
  • QT-release打包程序
    QT-release打包程序哦知识阿赐予我力量活着就好​关注 QT-release打包程序主要介绍qt编写好程序后运行release生成的exe文件,之后用qt的编译程序生成qt可执行环境,之后就可以压缩打包发给用户使用!1.构建运行qt的程序​用我现在测试的demo程序为例​点击......
  • MURF860AC-ASEMI智能AI专用MURF860AC
    编辑:llMURF860AC-ASEMI智能AI专用MURF860AC型号:MURF860AC品牌:ASEMI封装:TO-220AC批号:最新恢复时间:35ns最大平均正向电流(IF):8A最大循环峰值反向电压(VRRM):600V最大正向电压(VF):0.95V~1.90V工作温度:-65°C~175°C芯片个数:2芯片尺寸:mil正向浪涌电流(IFMS):125AMURF860AC特性:低......
  • 通过队列通信实现红外遥控、旋转编码器和MPU6050数据处理的打砖块游戏开发
     声明:项目源码参考韦东山老师百问网嵌入式专家-韦东山嵌入式专注于嵌入式课程及硬件研发(100ask.net)        在本项目中,打砖块游戏的核心逻辑在一个单独的任务中实现,同时系统还需要处理来自红外遥控、旋转编码器和MPU6050传感器的数据输入。为此,使用FreeRTOS的队列......
  • 洛谷P1605 迷宫
    原题题目描述给定一个方格的迷宫,迷宫里有处障碍,障碍处不可通过。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。输入格式第一行为三个正整数,分......
  • AP5160 电压2.5-100V 电流12A PWM 调光 大功率LED驱动 手电筒与摩托车照明方案
    产品描述AP5160是一款效率高,稳定可靠的LED灯恒流驱动控制芯片,内置高精度比较器,固定关断时间控制电路,恒流驱动电路等,特别适合大功率LED恒流驱动。AP5160采用SOT23-6封装,通过调节外置电流检测的电阻值来设置流过LED灯的电流,从而设置LED灯的亮度,外驱MOS管最大输出电流可达......
  • 【2024最新】Android Debug Bridge【下载安装】零基础到大神【附下载链接】_android d
    一、ADB简介1、什么是adbADB全称为AndroidDebugBridge,起到调试桥的作用,是一个客户端-服务器端程序。其中客户端是用来操作的电脑,服务端是Android设备。ADB也是AndroidSDK中的一个工具,可以直接操作管理Android模拟器或者真实的Android设备。2、为什么要用......
  • 敦煌智旅:Serverless 初探,运维提效 60%
    作者:百潼行业新趋势在后疫情时代,文旅行业开始复苏,在行业的发展趋势中,我们看到了一个充满机遇和挑战的未来。通过不断创新和适应市场需求,文旅行业继续不断发展壮大,为消费者提供更加丰富多样的旅游体验。与此同时,文旅行业也朝着科技融合,创新颠覆的趋势发展。科技带动产业向“新消......