首页
/ Flutter Unity Widget 在 Android 上的 BufferQueue 问题分析与解决方案

Flutter Unity Widget 在 Android 上的 BufferQueue 问题分析与解决方案

2025-07-03 06:18:44作者:幸俭卉

问题背景

在使用 Flutter Unity Widget 插件进行 Flutter 与 Unity 集成开发时,Android 平台上可能会出现一个常见的错误:"BufferQueue has been abandoned"。这个错误会导致 Unity 视图无法正常显示,同时控制台会不断重复输出错误信息。

错误表现

开发者在使用 Flutter Unity Widget 时,可能会遇到以下典型症状:

  1. 应用界面只显示背景色(如示例中的黄色),Unity 内容无法显示
  2. Android 日志中不断重复输出错误信息:"E/BufferQueueProducer: [ImageReader] dequeueBuffer: BufferQueue has been abandoned"
  3. 应用不会崩溃,但 Unity 内容完全不可见

根本原因

这个问题主要与 Flutter 引擎版本有关,具体来说是 Flutter 3.19.x 版本中存在的一个已知 bug。该 bug 影响了 Flutter 与原生视图的交互方式,特别是在处理 Surface 和 BufferQueue 时出现了问题。

解决方案

根据不同的 Flutter 版本,有以下几种解决方案:

方案一:升级 Flutter 版本

  1. 升级到 Flutter 3.22 或更高版本,该版本已经修复了这个 bug
  2. 如果升级到 Flutter 3.24,还需要应用额外的补丁(具体修改可参考相关 commit)

方案二:使用 workaround 参数(适用于必须使用 Flutter 3.19 的情况)

在 UnityWidget 组件中添加以下参数:

UnityWidget(
  onUnityCreated: onUnityCreated,
  useAndroidViewSurface: true,  // 关键参数
)

这个参数会改变 Flutter 的嵌入模式,使用不受此 bug 影响的替代方案。

其他建议配置

  1. Unity 版本选择:建议使用 Unity 2022.3.x 版本,这是经过验证的稳定版本
  2. 图形 API 设置:在 Unity 中,将 Graphics API 设置为 OpenGLES3,这可以避免一些 Android 上的冻结和崩溃问题
  3. Android 配置:确保 Android 项目的 minSdkVersion 至少为 24,targetSdkVersion 设置为 33

实现示例

以下是经过验证可用的基本实现代码:

import 'package:flutter/material.dart';
import 'package:flutter_unity_widget/flutter_unity_widget.dart';

class UnityDemoScreen extends StatefulWidget {
  const UnityDemoScreen({super.key});

  @override
  State<UnityDemoScreen> createState() => _UnityDemoScreenState();
}

class _UnityDemoScreenState extends State<UnityDemoScreen> {
  UnityWidgetController? _unityWidgetController;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: UnityWidget(
          onUnityCreated: onUnityCreated,
          useAndroidViewSurface: true, // 关键解决方案
        ),
      ),
    );
  }

  void onUnityCreated(controller) {
    _unityWidgetController = controller;
  }
}

总结

Flutter Unity Widget 在 Android 平台上的 BufferQueue 问题主要是由 Flutter 引擎版本引起。开发者可以通过升级 Flutter 版本或使用 useAndroidViewSurface 参数来解决这个问题。同时,选择合适的 Unity 版本和正确的图形 API 设置也是确保集成成功的关键因素。

登录后查看全文
热门项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
22
6
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
161
2.05 K
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
8
0
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
146
191
leetcodeleetcode
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
60
16
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
198
279
apintoapinto
基于golang开发的网关。具有各种插件,可以自行扩展,即插即用。此外,它可以快速帮助企业管理API服务,提高API服务的稳定性和安全性。
Go
22
0
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
949
556
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
96
15
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
346
1.33 K