问题描述

最近发现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');

Flutter调试debug或者打包release帧率只有60的原因的更多相关文章

  1. Flutter 发布APK时,release版本和debug版本的默认权限不同

    Flutter 发布APK时,release版本和debug版本的默认权限不同 @author ixenos 在调试模式下,默认情况下启用服务扩展和多个权限(在flutter中) 当您处于发布模式时, ...

  2. Debug目录、Release目录,bin目录、obj目录,vshost.exe.config文件、.exe.config文件分析【C#】

    原文地址:http://blog.csdn.net/itwit/article/details/6803338 今天写程序的时候,需要更改.exe.config文件中的引用的webservice地址, ...

  3. 如何在 .NET 库的代码中判断当前程序运行在 Debug 下还是 Release 下

    我们经常会使用条件编译符 #if DEBUG 在 Debug 下执行某些特殊代码.但是一旦我们把代码打包成 dll,然后发布给其他小伙伴使用的时候,这样的判断就失效了,因为发布的库是 Release ...

  4. MFC下debug改成release版本出现问题及解决办法

    自己在debug下成功运行了自己写的测试自己写第三方库的程序,这里有用到opencv库,所以同时用到了自己的库和opencv的库,需求因为要进行速度的测试,是想要把debug改成release版本,这 ...

  5. .Net中的Debug模式和Release模式

    1.Debug模式和Release模式 在vs中,运行程序有两种模式:Debug和Release 在bin目录下也会生成对应的文件夹,用于存放生成的dll等文件,这两种模式的区别如下: Debug:用 ...

  6. .NET中Debug模式与Release模式

    Visual Studio 项目对程序的发布和调试版本分别有单独的配置.顾名思义,生成调试版本的目的是用于调试,而生成发布版本的目的是用于版本的最终分发. 如果在 Visual Studio 中创建程 ...

  7. debug版本和release版本的区别?

    好久没有做web项目了,这项目完成了要发布网站,不好忘了 以前操作过的? 还好脑子还是有点印象 现还是 写个文档吧记录吧 免得 以后作别的了又忘了 那可不妙啊 网站发布步骤:1.先将

  8. debug运行可以,release运行报错的原因及修改方法

    通常我们开发的程序有2种模式:Debug模式和Release模式在Debug模式下,编译器会记录很多调试信息,也可以加入很多测试代码,方便我们程序员测试,以及出现bug时的分析解决Release模式下 ...

  9. 项目Debug版本与Release版本的区别

    Debug版本:通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序. Release版本:称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很 ...

  10. VS中Debug模式和Release模式的区别

    一.Debug 和 Release 编译方式的本质区别 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程 ...

随机推荐

  1. bash shell基础命令

    bash shell基础命令 很多Linux发行版的默认shell是GNU bash shell. 1. 启动shell GNU bash shell是一个程序,提供了对Linux系统的交互式访问.它 ...

  2. 攻防世界——CRYPTO新手练习区解题总结<1>(1-4题)

    第一题base64: 下载附件,得到一个txt文件,打开 得到一串乱码,由题目可知,是base64,解码得到flag 第二题Caesar: 下载附件得到乱码 oknqdbqmoq{kag_tmhq_x ...

  3. 实测分享,瑞芯微RK3588八核国产处理器性能测评!确实“遥遥领先”!

    RK3588处理器优势 RK3588是瑞芯微最新一代旗舰工业处理器,它具有如下卓越优势: 超强运算能力:四核ARM Cortex-A76@2.4GHz + 四核ARM Cortex-A55@1.8GH ...

  4. mapreduce压缩

    这是mr的一种优化策略,通过压缩编码对mapper或者reducer的输出进行压缩,以减少磁盘io,提高mr运行速度(但也相应增加了cpu运算负担) 特性: 1.mr支持将map输出的结果或者redu ...

  5. Sqlalchemy 连接SQL Server 登录失败

    实验系统环境 Windows平台 Sqlalchemy 2.0.23 Python 3.10 SQL Server 2012 aioodbc 0.5.0 问题详情 sqlalchemy.exc.Int ...

  6. 推荐一款Python接口自动化测试数据提取分析神器!

    1.引言 在处理JSON数据时,我们常常需要提取.筛选或者变换数据.手动编写这些操作的代码不仅繁琐,而且容易出错.Python作为一个功能强大的编程语言,拥有丰富的库和工具来处理这些数据.今天,将介绍 ...

  7. 测试人必会 K8S 操作之 Dashboard

    在云计算和微服务架构的时代,Kubernetes (K8S) 已成为管理容器化应用的标准.然而,对于许多新手来说,K8S 的操作和管理常常显得复杂而神秘.特别是,当你第一次接触 K8S Dashboa ...

  8. 题解:AT_abc359_c [ABC359C] Tile Distance 2

    背景 去中考了,比赛没打,来补一下题. 分析 这道题让我想起了这道题(连题目名称都是连着的),不过显然要简单一些. 这道题显然要推一些式子.我们发现,和上面提到的那道题目一样,沿着对角线走台阶,纵坐标 ...

  9. linux常用命令(每日积累)

    linux查看应用程序的进程号和端口号 lsof -i :port,查看指定端口运行的程序,同时还有当前连接. netstat -nupl  (UDP类型的端口)netstat -ntpl  (TCP ...

  10. layui下拉框的数据如何直接从数据库提取(动态赋值)

    代码说明部分 第一步:先把layui官方给的模板粘到自己的前端注:下面的代码是我直接从layui官网粘过来的 <div class="layui-form-item"> ...