Skip to content

Commit

Permalink
update memory usage demo
Browse files Browse the repository at this point in the history
  • Loading branch information
zmtzawqlp committed Mar 22, 2021
1 parent 4351a9a commit 75b5213
Show file tree
Hide file tree
Showing 7 changed files with 268 additions and 217 deletions.
10 changes: 5 additions & 5 deletions example/lib/common/utils/crop_editor_helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ void _isolateEncodeImage(SendPort port) {
});
}

Future<List<int>?> cropImageDataWithDartLibrary(
Future<Uint8List?> cropImageDataWithDartLibrary(
{required ExtendedImageEditorState state}) async {
print('dart library start cropping');

Expand Down Expand Up @@ -101,7 +101,7 @@ Future<List<int>?> cropImageDataWithDartLibrary(
}
if (src != null) {
//handle every frame.
src.frames = src.frames.map((image) {
src.frames = src.frames.map((Image image) {
final DateTime time2 = DateTime.now();
//clear orientation
image = bakeOrientation(image);
Expand Down Expand Up @@ -144,7 +144,7 @@ Future<List<int>?> cropImageDataWithDartLibrary(
print('start encode');
final DateTime time4 = DateTime.now();
if (src != null) {
bool onlyOneFrame = src.numFrames == 1;
final bool onlyOneFrame = src.numFrames == 1;
//If there's only one frame, encode it to jpg.
if (kIsWeb) {
fileData = onlyOneFrame ? encodeJpg(src.first) : encodeGifAnimation(src);
Expand All @@ -158,10 +158,10 @@ Future<List<int>?> cropImageDataWithDartLibrary(
final DateTime time5 = DateTime.now();
print('${time5.difference(time4)} : encode');
print('${time5.difference(time1)} : total time');
return fileData;
return Uint8List.fromList(fileData!);
}

Future<List<int>?> cropImageDataWithNativeLibrary(
Future<Uint8List?> cropImageDataWithNativeLibrary(
{required ExtendedImageEditorState state}) async {
print('native library start cropping');

Expand Down
27 changes: 22 additions & 5 deletions example/lib/common/utils/vm_helper.dart
Original file line number Diff line number Diff line change
@@ -1,15 +1,26 @@
import 'dart:async';
import 'dart:developer';
import 'package:collection/collection.dart' show IterableExtension;
import 'package:flutter/foundation.dart';
import 'package:vm_service/utils.dart';
import 'package:vm_service/vm_service.dart';
import 'package:vm_service/vm_service_io.dart';

class VMHelper {
class VMHelper with ChangeNotifier {
factory VMHelper() => _vMHelper;
VMHelper._();
VMHelper._() {
_startConnect().whenComplete(() {
_timer = Timer.periodic(const Duration(seconds: 2), (Timer timer) {
VMHelper()._updateMemoryUsage().whenComplete(() {
notifyListeners();
});
});
});
}
static final VMHelper _vMHelper = VMHelper._();
// Map<IsolateRef, MemoryUsage> memoryInfo = <IsolateRef, MemoryUsage>{};
late MemoryUsage mainMemoryUsage;
late Timer _timer;
List<MyMemoryUsage> mainHistoryMemoryInfo = <MyMemoryUsage>[];
// Map<IsolateRef, List<MyMemoryUsage>> historyMemoryInfo =
// <IsolateRef, List<MyMemoryUsage>>{};
Expand All @@ -20,7 +31,7 @@ class VMHelper {
late bool connected;
VmService? serviceClient;
VM? vm;
Future<void> startConnect() async {
Future<void> _startConnect() async {
final ServiceProtocolInfo info = await Service.getInfo();
if (info.serverUri == null) {
print('service protocol url is null,start vm service fail');
Expand All @@ -32,10 +43,10 @@ class VMHelper {
connected = true;

vm = await serviceClient!.getVM();
await updateMemoryUsage();
await _updateMemoryUsage();
}

Future<void> updateMemoryUsage() async {
Future<void> _updateMemoryUsage() async {
if (vm != null && connected) {
final MemoryUsage memoryUsage =
await serviceClient!.getMemoryUsage(main!.id!);
Expand All @@ -55,6 +66,12 @@ class VMHelper {
_count = 0;
mainHistoryMemoryInfo.clear();
}

@override
void dispose() {
_timer.cancel();
super.dispose();
}
}

class MyMemoryUsage {
Expand Down
174 changes: 174 additions & 0 deletions example/lib/common/widget/memory_usage_chart.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
import 'dart:math';
import 'dart:ui';

import 'package:example/common/utils/vm_helper.dart';
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';

class MemoryUsageChart extends StatefulWidget {
@override
_MemoryUsageChartState createState() => _MemoryUsageChartState();
}

class _MemoryUsageChartState extends State<MemoryUsageChart> {
@override
void initState() {
super.initState();
VMHelper().addListener(updateMemoryUsage);
}

void updateMemoryUsage() {
if (mounted) {
setState(() {});
}
}

@override
void dispose() {
VMHelper().removeListener(updateMemoryUsage);
super.dispose();
}

@override
Widget build(BuildContext context) {
if (VMHelper().serviceClient == null) {
return Container();
}
return Container(
padding: const EdgeInsets.only(left: 30, right: 30, top: 5, bottom: 5),
width: window.physicalSize.width,
height: 200,
child: LineChart(
getData(),
swapAnimationDuration: const Duration(milliseconds: 250),
),
);
}

LineChartData getData() {
final DateTime now = DateTime.now();
final List<LineChartBarData> data = getLineData(now);

return LineChartData(
lineTouchData: LineTouchData(
touchTooltipData: LineTouchTooltipData(
tooltipBgColor: Colors.blueGrey.withOpacity(0.8),
),
touchCallback: (LineTouchResponse touchResponse) {},
handleBuiltInTouches: true,
),
gridData: FlGridData(
show: false,
),
titlesData: FlTitlesData(
bottomTitles: SideTitles(
showTitles: true,
getTextStyles: (double value) => const TextStyle(
color: Color(0xff72719b),
fontWeight: FontWeight.bold,
fontSize: 16,
),
margin: 10,
getTitles: (double value) {
final int millisecondsSinceEpoch = value.toInt();
final DateTime dateTime =
DateTime.fromMillisecondsSinceEpoch(millisecondsSinceEpoch);

return DateFormat('HH:mm').format(dateTime);
},
interval: const Duration(minutes: 1).inMilliseconds.toDouble(),
),
leftTitles: SideTitles(
showTitles: true,
getTextStyles: (double value) => const TextStyle(
color: Color(0xff75729e),
fontWeight: FontWeight.bold,
fontSize: 14,
),
interval: 100,
getTitles: (double value) {
return value.toInt().toString() + 'M';
},
margin: 20,
),
),
borderData: FlBorderData(
show: true,
border: const Border(
bottom: BorderSide(
color: Color(0xff4e4965),
width: 2,
),
left: BorderSide(
color: Color(0xff4e4965),
width: 2,
),
right: BorderSide(
color: Colors.transparent,
),
top: BorderSide(
color: Colors.transparent,
),
),
),
minX: now
.subtract(const Duration(minutes: 1))
.millisecondsSinceEpoch
.toDouble(),
maxX: now.millisecondsSinceEpoch.toDouble(),
minY: 0,
maxY: max(500, maxY ?? 0),
lineBarsData: data,
);
}

double? minY;
double? maxY;
List<LineChartBarData> getLineData(DateTime now) {
final List<FlSpot> data1 = <FlSpot>[];
final List<FlSpot> data2 = <FlSpot>[];
final List<FlSpot> data3 = <FlSpot>[];
for (final MyMemoryUsage item in VMHelper().mainHistoryMemoryInfo) {
data1.add(FlSpot(item.dataTime.millisecondsSinceEpoch.toDouble(),
item.todouble(item.heapUsage)));
data2.add(FlSpot(item.dataTime.millisecondsSinceEpoch.toDouble(),
item.todouble(item.heapCapacity)));
data3.add(FlSpot(item.dataTime.millisecondsSinceEpoch.toDouble(),
item.todouble(item.externalUsage)));

final double minValue =
min(min(item.heapUsage, item.heapCapacity), item.externalUsage);

final double maxValue =
max(max(item.heapUsage, item.heapCapacity), item.externalUsage);

minY = min(maxY ?? minValue.toDouble(), minValue.toDouble());
maxY = max(maxY ?? maxValue.toDouble(), maxValue.toDouble());
}

return <LineChartBarData>[
getLineChartBarData(data1, Colors.red),
getLineChartBarData(data2, Colors.blue),
getLineChartBarData(data3, Colors.green),
];
}

LineChartBarData getLineChartBarData(List<FlSpot> spots, Color color) {
return LineChartBarData(
spots: spots,
isCurved: true,
colors: <Color>[
color,
],
barWidth: 2,
isStrokeCapRound: true,
dotData: FlDotData(
show: false,
),
belowBarData: BarAreaData(
show: false,
),
);
}
}
Loading

0 comments on commit 75b5213

Please sign in to comment.