fix(player): 收紧图片与快速切集资源占用

This commit is contained in:
Zhou Weidong committed 2026-10-26 15:10:02 +08:00
1 parent 2fef7470e0
commit 80c962a95c
10 files changed
+281 -30

No files matched your search

+31 -10
View File
@@ -75,7 +75,9 @@ void main() {
expect(axis.cues, isEmpty);
});
testWidgets('should_keep_only_two_decoded_sprites_in_lru', (tester) async {
testWidgets('should_keep_one_sprite_and_reload_after_eviction', (
tester,
) async {
final loader = _FakeSpriteLoader(vtt: _spriteVtt);
final service = SpriteThumbnailAxisService(
loader: loader,
@@ -84,20 +86,37 @@ void main() {
addTearDown(service.dispose);
await service.prepareAt('https://cdn.test/thumbnails.vtt', Duration.zero);
expect(service.spriteCacheSize, 2);
expect(
service.spriteCacheKeys,
containsAll(['sprite_001.jpg', 'sprite_002.jpg']),
);
await service.prepareAt(
'https://cdn.test/thumbnails.vtt',
const Duration(milliseconds: 2500),
);
await service.prepareAt(
'https://cdn.test/thumbnails.vtt',
const Duration(milliseconds: 3500),
);
expect(service.spriteCacheSize, 2);
expect(service.spriteCacheKeys, contains('sprite_002.jpg'));
expect(service.spriteCacheKeys, isNot(contains('sprite_001.jpg')));
expect(service.spriteCacheSize, 1);
expect(service.spriteCacheKeys, ['sprite_003.jpg']);
expect(loader.images[0].debugDisposed, isTrue);
expect(loader.images[1].debugDisposed, isTrue);
expect(loader.images[2].debugDisposed, isFalse);
expect(
service.cachedFrameAt(
'https://cdn.test/thumbnails.vtt',
const Duration(milliseconds: 3500),
),
isNotNull,
);
await service.prepareAt('https://cdn.test/thumbnails.vtt', Duration.zero);
expect(service.spriteCacheSize, 1);
expect(service.spriteCacheKeys, ['sprite_001.jpg']);
expect(loader.images[2].debugDisposed, isTrue);
expect(loader.images[3].debugDisposed, isFalse);
expect(
service.cachedFrameAt('https://cdn.test/thumbnails.vtt', Duration.zero),
isNotNull,
);
});
testWidgets('should_cache_vtt_and_retry_once_after_403', (tester) async {
@@ -229,6 +248,7 @@ class _FakeSpriteLoader implements SpriteThumbnailAssetLoader {
final List<Object>? vttResponses;
int vttCalls = 0;
final List<String> spriteCalls = [];
final List<ui.Image> images = [];
@override
Future<String?> loadVtt(Uri uri) async {
@@ -244,6 +264,7 @@ class _FakeSpriteLoader implements SpriteThumbnailAssetLoader {
Future<SpriteThumbnailDecodedImage?> loadSprite(Uri uri) async {
spriteCalls.add(uri.pathSegments.last);
final image = await _createImage(320, 180);
images.add(image);
return SpriteThumbnailDecodedImage(
image: image,
originalWidth: 320,