Эх сурвалжийг харах

加入成功 GC 的例子

gavin.chen 2 жил өмнө
parent
commit
384dbd74f4

+ 7 - 2
lib/pages/canvas_player/widgets/canvas_player.dart

@@ -4,6 +4,7 @@ import 'package:fis_measure/view/player/controller.dart';
 import 'package:fis_measure/view/player/enums.dart';
 import 'package:fis_measure/view/player/events.dart';
 import 'package:flutter/material.dart';
+import 'package:vid_player_demo/utils/image_holder.dart';
 import 'package:vid_player_demo/utils/utils.dart';
 import 'dart:ui' as ui;
 import 'vid_painter.dart';
@@ -29,6 +30,7 @@ class VidCanvasPlayer extends StatefulWidget {
 class _VidCanvasPlayerState extends State<VidCanvasPlayer> {
   Uint8List? frameBytes;
   ui.Image? image;
+  MyImageHolder? holder;
   DateTime lastFrameTime = DateTime.now();
   ListQueue<int> frames = ListQueue<int>()..addFirst(30); //预留一位防止分母为0
   int maxFramesNum = 10;
@@ -75,7 +77,10 @@ class _VidCanvasPlayerState extends State<VidCanvasPlayer> {
     // print("${DateTime.now()} Load frame \n ${debugList.toString()}");
     // image?.dispose();
     image = await decodeImageFromList(bytes);
-    setState(() {});
+    print("${DateTime.now()} Load frame ${image?.width} x ${image?.height}");
+    // holder = MyImageHolder(image!.clone());
+    image?.dispose();
+    // setState(() {});
     countCurFPS();
   }
 
@@ -136,7 +141,7 @@ class _VidCanvasPlayerState extends State<VidCanvasPlayer> {
     if (image != null) {
       final size = MediaQuery.of(context).size;
       return CustomPaint(
-        painter: VidPainter(image: image!, contextSize: size),
+        painter: VidPainter(holder: holder!),
         isComplex: false, //是否为复杂图像(true会缓存)
         size: size,
       );

+ 6 - 27
lib/pages/canvas_player/widgets/vid_painter.dart

@@ -1,36 +1,15 @@
 import 'package:flutter/material.dart';
-import 'dart:ui' as ui;
+
+import 'package:vid_player_demo/utils/image_holder.dart';
 
 class VidPainter extends CustomPainter {
-  VidPainter({required this.image, required this.contextSize});
-  ui.Image image;
-  Size contextSize;
+  VidPainter({required this.holder});
+  MyImageHolder holder;
 
   @override
   void paint(Canvas canvas, Size size) async {
-    final double scale = size.width / image.width;
-    final double offsetY = (size.height - image.height * scale) / 2;
-
-    // print("${DateTime.now()}容器大小 ContextSize = $contextSize");
-    // print("${DateTime.now()}图片大小 ImageSize = ${image.width}x${image.height}");
-    // print("${DateTime.now()}画布大小 CanvasSize = $size");
-    // print("${DateTime.now()}缩放比例 Scale = $scale");
-    // print(
-    //     "${DateTime.now()}缩放后宽高 ScaledImageSize = ${image.width * scale}x${image.height * scale}");
-    // print("${DateTime.now()}偏移量 Offset = $offsetY");
-
-    Paint paint = Paint();
-    canvas.save();
-    // canvas.scale(scale);
-    // canvas.drawImage(image, Offset(0, offsetY), paint);
-    canvas.drawImageRect(
-        image,
-        Rect.fromLTWH(0, 0, image.width.toDouble(), image.height.toDouble()),
-        Rect.fromLTWH(0, offsetY, size.width, image.height * scale),
-        paint);
-
-    canvas.restore();
-    image.dispose();
+    holder.draw(canvas, size);
+    holder.dispose();
   }
 
   @override

+ 8 - 6
lib/pages/image_test/view.dart

@@ -31,15 +31,16 @@ class _ImageTestViewState extends State<ImageTestView> {
   void clickPlay() async {
     print("${DateTime.now()} Click play");
     for (int i = 0; i < widget.imageNum; i++) {
-      final image = await _loadImage(600, 800);
+      image = await _loadImage(
+          776, 518, Color.fromARGB(i * 255 ~/ widget.imageNum, 0, 0, 0));
       // final cloneImage = image.clone();
       print(
-          "${DateTime.now()} Clone image $i ${image.width} x ${image.height}");
+          "${DateTime.now()} load image $i ${image?.width} x ${image?.height}");
       setState(() {
-        loadedImageCount++;
+        loadedImageCount = i + 1;
       });
       // cloneImage.dispose();
-      image.dispose();
+      image?.dispose();
     }
   }
 
@@ -52,10 +53,11 @@ class _ImageTestViewState extends State<ImageTestView> {
     clickPlay();
   }
 
-  Future<Image> _loadImage(int width, int height) {
+  Future<Image> _loadImage(int width, int height, Color color) async {
     final Completer<Image> completer = Completer<Image>();
     decodeImageFromPixels(
-      Uint8List.fromList(List<int>.filled(width * height * 4, 0xFF0000FF)),
+      Uint8List.fromList(List<int>.filled(
+          width * height * 4, int.parse(color.value.toString()))),
       width,
       height,
       PixelFormat.rgba8888,

+ 19 - 0
lib/utils/image_holder.dart

@@ -0,0 +1,19 @@
+import 'dart:ui';
+
+class MyImageHolder {
+  MyImageHolder(this.image);
+
+  final Image image;
+
+  void draw(Canvas canvas, Size size) {
+    final double scale = size.width / image.width;
+    final double offsetY = (size.height - image.height * scale) / 2;
+    canvas.drawImageRect(
+        image,
+        Rect.fromLTWH(0, 0, image.width.toDouble(), image.height.toDouble()),
+        Rect.fromLTWH(0, offsetY, size.width, image.height * scale),
+        Paint());
+  }
+
+  void dispose() => image.dispose();
+}