Files
AndroidStudioSettings/ChatGPTConversations_170.xml
T

6 lines
389 KiB
XML
Raw Normal View History

<application>
<component name="ee.carlrobert.codegpt.state.conversations.ConversationsState">
<option name="currentConversation" value="{&quot;id&quot;:&quot;e38e28c6-adce-4243-8252-c6168da891d8&quot;,&quot;title&quot;:null,&quot;messages&quot;:[{&quot;prompt&quot;:&quot;这个组件目前是先解码出所有的frames,然后才播放,这在性能低的设备上表现太差了。给我改成加载出第一帧就播放的,并且不影响现有的逻辑&quot;,&quot;id&quot;:&quot;4f0cc401-5fde-4681-bc21-bac8def97e75&quot;,&quot;response&quot;:&quot;已确认。下面给出改造方案和完整文件代码,目标是让 [ControlledAnimatedImage](file:///home/debuggerx/StudioProjects/aim_master_workspace/apps/aim_master_face_a3/lib/widgets/controlled_animated_image.dart) 在拿到第一帧后立即开始播放,同时尽量保持现有的 `loop`、`onCompleted`、资源释放与热更新逻辑不变。\n\n实施计划:\n1. 调整加载流程:在 [_loadAnimatedImage](file:///home/debuggerx/StudioProjects/aim_master_workspace/apps/aim_master_face_a3/lib/widgets/controlled_animated_image.dart#_loadAnimatedImage) 中先创建 [ui.Codec](https://api.flutter.dev/flutter/dart-ui/Codec-class.html),解出第一帧后立刻更新状态并启动播放。\n2. 改变播放驱动方式:不再依赖“先拿到所有帧总时长后用一个 [AnimationController](https://api.flutter.dev/flutter/animation/AnimationController-class.html) + `IntTween` 播放”,改为按每帧自己的 `duration` 调度下一帧,这样拿到第一帧即可播,且更符合 GIF/WebP 动图逐帧时序。\n3. 保持现有行为:保留 [loop](file:///home/debuggerx/StudioProjects/aim_master_workspace/apps/aim_master_face_a3/lib/widgets/controlled_animated_image.dart#loop) 和 [onCompleted](file:///home/debuggerx/StudioProjects/aim_master_workspace/apps/aim_master_face_a3/lib/widgets/controlled_animated_image.dart#onCompleted) 的语义;当资源切换时继续使用版本号避免旧异步结果污染当前实例。\n4. 完善资源管理:继续在切换资源或销毁时释放旧帧的 [image](https://api.flutter.dev/flutter/dart-ui/Image-class.html) 与旧 [Codec](https://api.flutter.dev/flutter/dart-ui/Codec-class.html),避免内存泄漏。\n\n下面是完整修改后的文件。核心变化对应计划第 1、2 步:第一帧解码完成后立即 `setState` 并通过定时调度继续解码/切换后续帧;计划第 3、4 步体现在循环、完成回调、版本控制和 dispose 清理逻辑中。\n\n```dart:/home/debuggerx/StudioProjects/aim_master_workspace/apps/aim_master_face_a3/lib/widgets/controlled_animated_image.dart\nimport 'dart:async';\nimport 'dart:typed_data';\nimport 'dart:ui' as ui;\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\nclass ControlledAnimatedImage extends StatefulWidget {\n final String assetPath;\n final VoidCallback? onCompleted;\n final bool loop;\n\n const ControlledAnimatedImage({\n super.key,\n required this.assetPath,\n this.onCompleted,\n this.loop = false,\n });\n\n @override\n ControlledAnimatedImageState createState() =&gt; ControlledAnimatedImageState();\n}\n\nclass ControlledAnimatedImageState extends State&lt;ControlledAnimatedImage&gt; {\n ui.Codec? _codec;\n final List&lt;ui.FrameInfo&gt; _frames = [];\n\n int _loadVersion = 0;\n bool _hasCompletedCallbackFired = false;\n\n int _currentFrameIndex = 0;\n int _decodedFrameCount = 0;\n bool _isPlaying = false;\n bool _isDecoding = false;\n Timer? _frameTimer;\n\n @override\n void initState() {\n super.initState();\n _loadAnimatedImage();\n }\n\n @override\n void didUpdateWidget(covariant ControlledAnimatedImage oldWidget) {\n super.didUpdateWidget(oldWidget);\n\n if (oldWidget.assetPath != widget.assetPath) {\n _loadAnimatedImage();\n return;\n }\n\n if (oldWidget.loop != widget.loop) {\n if (_frames.isEmpty) {\n return;\n }\n\n if (widget.loop) {\n _hasCompletedCallbackFired = false;\n if (!_isPlaying) {\n _isPlaying = true;\n _scheduleNextFrame();\n }\n } else
<option name="conversations" value="[{&quot;id&quot;:&quot;2ea372bf-f79d-4805-a228-8cd51bf07dc9&quot;,&quot;title&quot;:null,&quot;messages&quot;:[{&quot;prompt&quot;:&quot;我在适用ProxyAI这个Intellij插件,想要实现代码自动补全,gemini系列的哪个模型最适合?为什么?另外配置里有个“FIM”模板选项,我应该选什么?&quot;,&quot;id&quot;:&quot;ab4b92a6-8055-4844-85d6-57ffd6339399&quot;,&quot;response&quot;:&quot;对于在 IntelliJ IDEA 使 ProxyAI **Inline Code Completion** Gemini FIM \n\n### Gemini 1.5 Flash Gemini 2.0 Flash\n\n**使 `gemini-1.5-flash` `gemini-2.0-flash`** API \n\n** Pro **\n1. **Latency** 300-500 `gemini-1.5-pro` Flash \n2. ****Flash 1M 2M ProxyAI \n3. ****Flash API Pro \n\n* `gemini-1.5-pro`****Flash *\n\n---\n\n### FIM \n\n**FIM (Fill-In-the-Middle)** PrefixSuffixMiddle\n\n**Gemini **\n DeepSeek CoderQwen Coder CodeLlama 使 FIM Token `&lt;|fim_prefix|&gt;``&lt;|fim_suffix|&gt;` **Gemini FIM ** ProxyAI Gemini `DeepSeek` `Qwen` FIM Gemini \n\n****\n\n1. ** Prompt / Instruction **\n ProxyAI FIM `Prompt``Instruction` `Gemini/OpenAI` \n\n2. **CustomFIM **\n FIM 使 XML Gemini XML \n ```text\n You are an expert programmer. Please complete the missing code between &lt;prefix&gt; and &lt;suffix&gt;. \n Output ONLY the missing code, without any markdown formatting, explanations, or repeating the prefix/suffix.\n \n &lt;prefix&gt;\n {prefix}\n &lt;/prefix&gt;\n &lt;suffix&gt;\n {suffix}\n &lt;/suffix&gt;\n ```\n *( `{prefix}` `{suffix}` ProxyAI )*\n\n3. ** FIM**\n FIM Gemini ProxyAI ** FIM ** None/Default退 Gemini &quot;,&quot;referencedFilePaths&quot;:null,&quot;conversationsHistoryIds&quot;:null,&quot;imageFilePath&quot;:null,&quot;
</component>
</application>