lock approach is slower on ios

This commit is contained in:
mertalev
2026-01-17 01:05:12 -05:00
parent 06467f2c0d
commit d83e74dc88
5 changed files with 43 additions and 69 deletions
@@ -1,5 +1,6 @@
import 'dart:async';
import 'dart:ffi';
import 'dart:io';
import 'dart:ui' as ui;
import 'package:flutter/material.dart';
@@ -34,7 +35,7 @@ abstract class ImageRequest {
void _onCancelled();
Future<ui.FrameInfo?> _fromPlatformImage(Map<String, int> info, ui.PixelFormat pixelFormat, bool shouldFree) async {
Future<ui.FrameInfo?> _fromPlatformImage(Map<String, int> info, bool shouldFree) async {
final address = info['pointer'];
if (address == null) {
return null;
@@ -75,7 +76,7 @@ abstract class ImageRequest {
width: actualWidth,
height: actualHeight,
rowBytes: rowBytes,
pixelFormat: pixelFormat,
pixelFormat: ui.PixelFormat.rgba8888,
);
final codec = await descriptor.instantiateCodec();
if (_isCancelled) {
@@ -24,7 +24,7 @@ class LocalImageRequest extends ImageRequest {
isVideo: assetType == AssetType.video,
);
final frame = await _fromPlatformImage(info, ui.PixelFormat.rgba8888, true);
final frame = await _fromPlatformImage(info, true);
return frame == null ? null : ImageInfo(image: frame.image, scale: scale);
}
@@ -15,10 +15,12 @@ class RemoteImageRequest extends ImageRequest {
final Map<String, int> info = await remoteImageApi.requestImage(uri, headers: headers, requestId: requestId);
try {
final frame = await _fromPlatformImage(info, ui.PixelFormat.bgra8888, false);
final frame = await _fromPlatformImage(info, Platform.isIOS);
return frame == null ? null : ImageInfo(image: frame.image, scale: scale);
} finally {
unawaited(remoteImageApi.releaseImage(requestId));
if (Platform.isAndroid) {
unawaited(remoteImageApi.releaseImage(requestId));
}
}
}
@@ -12,7 +12,7 @@ class ThumbhashImageRequest extends ImageRequest {
}
final Map<String, int> info = await localImageApi.getThumbhash(thumbhash);
final frame = await _fromPlatformImage(info, ui.PixelFormat.rgba8888, true);
final frame = await _fromPlatformImage(info, true);
return frame == null ? null : ImageInfo(image: frame.image, scale: scale);
}