@kurot/core 2.1.1 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +50 -2
  3. package/dist/kurot/display/DisplayObject.d.ts +2 -1
  4. package/dist/kurot/display/DisplayObject.d.ts.map +1 -1
  5. package/dist/kurot/display/DisplayObject.js.map +1 -1
  6. package/dist/kurot/player/canvas/CanvasRenderer.d.ts +2 -0
  7. package/dist/kurot/player/canvas/CanvasRenderer.d.ts.map +1 -1
  8. package/dist/kurot/player/canvas/CanvasRenderer.js +37 -1
  9. package/dist/kurot/player/canvas/CanvasRenderer.js.map +1 -1
  10. package/dist/kurot/player/pipes/BitmapTextPipe.d.ts +20 -0
  11. package/dist/kurot/player/pipes/BitmapTextPipe.d.ts.map +1 -0
  12. package/dist/kurot/player/pipes/BitmapTextPipe.js +27 -0
  13. package/dist/kurot/player/pipes/BitmapTextPipe.js.map +1 -0
  14. package/dist/kurot/player/pipes/index.d.ts +2 -0
  15. package/dist/kurot/player/pipes/index.d.ts.map +1 -1
  16. package/dist/kurot/player/pipes/index.js +1 -0
  17. package/dist/kurot/player/pipes/index.js.map +1 -1
  18. package/dist/kurot/player/webgl/WebGLRenderer.d.ts +1 -0
  19. package/dist/kurot/player/webgl/WebGLRenderer.d.ts.map +1 -1
  20. package/dist/kurot/player/webgl/WebGLRenderer.js +8 -0
  21. package/dist/kurot/player/webgl/WebGLRenderer.js.map +1 -1
  22. package/dist/kurot/resource/Resource.d.ts.map +1 -1
  23. package/dist/kurot/resource/Resource.js +4 -0
  24. package/dist/kurot/resource/Resource.js.map +1 -1
  25. package/dist/kurot/resource/ResourceItem.d.ts +1 -0
  26. package/dist/kurot/resource/ResourceItem.d.ts.map +1 -1
  27. package/dist/kurot/resource/ResourceItem.js +1 -0
  28. package/dist/kurot/resource/ResourceItem.js.map +1 -1
  29. package/dist/kurot/resource/analyzers/FontAnalyzer.d.ts +16 -0
  30. package/dist/kurot/resource/analyzers/FontAnalyzer.d.ts.map +1 -0
  31. package/dist/kurot/resource/analyzers/FontAnalyzer.js +75 -0
  32. package/dist/kurot/resource/analyzers/FontAnalyzer.js.map +1 -0
  33. package/dist/kurot/resource/analyzers/index.d.ts +1 -0
  34. package/dist/kurot/resource/analyzers/index.d.ts.map +1 -1
  35. package/dist/kurot/resource/analyzers/index.js +1 -0
  36. package/dist/kurot/resource/analyzers/index.js.map +1 -1
  37. package/dist/kurot/resource/index.d.ts +1 -0
  38. package/dist/kurot/resource/index.d.ts.map +1 -1
  39. package/dist/kurot/resource/index.js +1 -0
  40. package/dist/kurot/resource/index.js.map +1 -1
  41. package/dist/kurot/text/BitmapFont.d.ts +15 -21
  42. package/dist/kurot/text/BitmapFont.d.ts.map +1 -1
  43. package/dist/kurot/text/BitmapFont.js +59 -66
  44. package/dist/kurot/text/BitmapFont.js.map +1 -1
  45. package/dist/kurot/text/BitmapText.d.ts +29 -19
  46. package/dist/kurot/text/BitmapText.d.ts.map +1 -1
  47. package/dist/kurot/text/BitmapText.js +93 -141
  48. package/dist/kurot/text/BitmapText.js.map +1 -1
  49. package/dist/kurot/text/LineBreaks.d.ts +2 -1
  50. package/dist/kurot/text/LineBreaks.d.ts.map +1 -1
  51. package/dist/kurot/text/LineBreaks.js +13 -9
  52. package/dist/kurot/text/LineBreaks.js.map +1 -1
  53. package/dist/kurot/text/TextLineLayout.d.ts.map +1 -1
  54. package/dist/kurot/text/TextLineLayout.js +5 -12
  55. package/dist/kurot/text/TextLineLayout.js.map +1 -1
  56. package/dist/kurot/text/TextSegmentation.d.ts +7 -0
  57. package/dist/kurot/text/TextSegmentation.d.ts.map +1 -0
  58. package/dist/kurot/text/TextSegmentation.js +17 -0
  59. package/dist/kurot/text/TextSegmentation.js.map +1 -0
  60. package/dist/kurot/text/WordWrap.d.ts.map +1 -1
  61. package/dist/kurot/text/WordWrap.js +3 -11
  62. package/dist/kurot/text/WordWrap.js.map +1 -1
  63. package/dist/kurot/text/index.d.ts +1 -0
  64. package/dist/kurot/text/index.d.ts.map +1 -1
  65. package/dist/kurot/text/index.js.map +1 -1
  66. package/docs/ai-context.md +33 -9
  67. package/docs/architecture.md +332 -279
  68. package/docs/bitmap-fonts.md +85 -0
  69. package/docs/resource.md +185 -156
  70. package/docs/text-layout.md +71 -8
  71. package/package.json +4 -2
@@ -1,228 +1,260 @@
1
- # @kurot/core 架构文档
1
+ # @kurot/core architecture
2
2
 
3
- > 当前版本:2.0.1。逐条变更记录见 [CHANGELOG.md](../CHANGELOG.md)。
4
- > 面向 AI 智能体的速查文档见 [ai-context.md](./ai-context.md)(目录地图、反直觉行为清单、术语表、任务→文件速查表)。本文档面向人类读者,讲设计动机与内部机制,两份文档不重复内容,互相引用。
3
+ > Package version: 2.2.1. See [CHANGELOG.md](../CHANGELOG.md) for release notes.
4
+ > The [AI context map](./ai-context.md) covers directories, non-obvious behavior,
5
+ > terminology and task-to-file references. This document explains design choices
6
+ > and internal mechanisms for contributors; the two documents complement each other.
5
7
 
6
8
  ---
7
9
 
8
- ## 一、项目概述
9
-
10
- `@kurot/core` 是 Kurot 引擎的核心运行时,提供显示对象、渲染、事件、几何、文本、资源、网络与媒体能力。对外 API 沿用 Egret 的 `DisplayObject`/事件模型,渲染内核则重写为 Pixi.js 8 风格的扁平 "InstructionSet + RenderPipe" 管线。
11
-
12
- | 维度 | 说明 |
13
- | -------- | ----------------------------------------------- |
14
- | 模块系统 | ES Module(`@kurot/core` npm 包) |
15
- | 类型系统 | `strict: true`,全量类型安全,零 `any` |
16
- | 编译目标 | ES2022,仅支持现代浏览器 |
17
- | 渲染架构 | InstructionSet 指令驱动(借鉴 Pixi.js 8) |
18
- | 批处理 | 多纹理批处理(8 张/批) |
19
- | 包管理 | `@kurot/core` workspace 包,pnpm |
20
- | 资源管理 | Resource 完整资源生命周期 |
21
- | WebGL | WebGL 1 + WebGL 2 双后端,运行时自动选择 |
22
-
23
- 与 Egret 的差异、Breaking Changes 及迁移方式见根目录 [egret-migration.md](../../../docs/egret-migration.md)。
10
+ ## 1. Overview
11
+
12
+ `@kurot/core` provides Kurot's display objects, rendering, events, geometry, text,
13
+ resources, networking and media runtime. Public APIs follow Egret's
14
+ `DisplayObject` and event model, while rendering uses a flat
15
+ `InstructionSet + RenderPipe` pipeline inspired by Pixi.js 8.
16
+
17
+ Since 2.2.0, Core uses published `@kurot/bitmap-font ^0.1.0` as the headless font-data
18
+ and layout kernel. Core manages font resources, image-page ownership and glyph
19
+ drawing in both backends. UI components belong to the UI package.
20
+
21
+ TextField uses Unicode 17.0 line-break rules with dictionary and overflow
22
+ tailoring. Since 2.2.1, tailoring uses imported rule identities, and layout
23
+ filters optional break positions through `Intl.Segmenter` grapheme boundaries.
24
+ Word and grapheme segmenters are cached; paragraph results remain local to
25
+ each layout. See [text layout](text-layout.md).
26
+
27
+ | Aspect | Description |
28
+ | ------------------ | ---------------------------------------------------------- |
29
+ | Modules | ES modules (`@kurot/core` npm package) |
30
+ | Types | Strict TypeScript (`strict: true`) |
31
+ | Target | ES2022 and modern browsers |
32
+ | Rendering | InstructionSet pipeline inspired by Pixi.js 8 |
33
+ | Batching | Multiple textures, up to 8 per batch |
34
+ | Package management | Independent pnpm package |
35
+ | Resources | Loading, caching and lifecycle management through Resource |
36
+ | WebGL | WebGL 1 and WebGL 2, selected at runtime |
37
+
38
+ See [Egret migration](../../../docs/egret-migration.md) for differences,
39
+ breaking changes and migration guidance.
24
40
 
25
41
  ---
26
42
 
27
- ## 二、模块结构
43
+ ## 2. Module structure
28
44
 
29
45
  ```
30
46
  packages/core/src/kurot/
31
- ├── display/ # 显示对象层(场景图)
32
- │ ├── DisplayObject.ts # 基类,含 renderDirty/cacheDirty/renderMode/RenderObjectType/bounds 缓存
33
- │ ├── DisplayObjectContainer.ts # 容器,含 isRenderGroup/sortableChildren/zIndex 排序
34
- │ ├── Bitmap.ts # 位图显示(含 scale9Grid 九宫格)
35
- │ ├── Sprite.ts # 精灵(容器 + Graphics)
36
- │ ├── Shape.ts # 矢量图形
37
- │ ├── Mesh.ts # 网格(vertices/indices/uvs)
38
- │ ├── Stage.ts # 舞台根节点
39
- │ ├── Graphics.ts # 矢量绘图命令
40
- │ ├── GraphicsPath.ts # 命令类型定义(PathCommandType, GraphicsCommand)
41
- │ ├── enums/ # BlendMode, BitmapFillMode, CapsStyle, GradientType, JointStyle, OrientationMode, StageScaleMode
42
- │ └── texture/ # BitmapData, Texture, SpriteSheet, RenderTexture
43
- ├── player/ # 渲染管线 + 游戏循环
44
- │ ├── Player.ts # 播放器(Stage + Renderer 绑定,含 perf 性能指标)
45
- │ ├── SystemTicker.ts # 帧循环(RAF + ENTER_FRAME,含 callLater 延迟调用队列)
46
- │ ├── RenderPipe.ts # RenderPipe 接口定义
47
- │ ├── TouchHandler.ts # 触摸/鼠标输入
48
- │ ├── ScreenAdapter.ts # 屏幕适配(7种缩放模式)
49
- │ ├── createPlayer.ts # 统一创建入口(含 Capabilities 初始化、RenderTexture 渲染器注入)
50
- │ ├── KurotOptions.ts # 配置接口
51
- │ ├── canvas/ # Canvas 2D 渲染后端(降级方案)
52
- │ │ ├── CanvasRenderer.ts # 直接遍历渲染器(支持全部 DisplayObject 类型 + 滤镜降级)
53
- │ │ ├── DisplayList.ts # cacheAsBitmap 离屏缓存
54
- │ │ └── CanvasBuffer.ts # Canvas 2D 缓冲区(含 hitTestBuffer 像素级命中测试)
55
- │ └── webgl/ # WebGL 渲染后端(主渲染器)
56
- │ ├── WebGLRenderer.ts # 两阶段渲染器(build + execute,含 RenderGroup/DisplayListCache 支持)
57
- │ ├── WebGLRenderContext.ts # WebGL 状态管理 + draw 调度(WebGL1/2 自动选择,配合 WebGLFilterSystem 管理效果)
58
- │ ├── WebGLRenderBuffer.ts # WebGL 缓冲区(含对象池,支持 offscreen/stencil/scissor)
59
- │ ├── WebGLRenderTarget.ts # FBO 管理
60
- │ ├── WebGLVertexArrayObject.ts # VAO 顶点管理(单纹理 20B + 多纹理 24B 双布局)
61
- │ ├── WebGLDrawCmdManager.ts # 绘制命令队列(12 种命令类型,含 MULTI_TEXTURE)
62
- │ ├── WebGLProgram.ts # 着色器程序缓存
63
- │ ├── WebGLUtils.ts # WebGL 工具(compileShader, createProgram, premultiplyTint, deleteWebGLTexture)
64
- │ ├── InstructionSet.ts # 指令集(renderableIndex O(1) 查找,dirtyRenderables 增量更新)
65
- │ ├── MultiTextureBatcher.ts # 多纹理批处理(8张/批,slotMap 纹理槽位分配)
66
- │ ├── pipes/ # RenderPipe 实现
67
- │ │ ├── BitmapPipe.ts # 位图渲染指令
68
- │ │ ├── GraphicsPipe.ts # 矢量图形指令(Canvas光栅化 → 纹理上传)
69
- │ │ ├── MeshPipe.ts # 网格渲染指令
70
- │ │ ├── FilterPipe.ts # 滤镜 push/pop 指令(含对象池)
71
- │ │ ├── MaskPipe.ts # 遮罩 push/pop 指令(含对象池)
72
- │ │ ├── TextPipe.ts # 文本 WebGL 渲染(offscreen canvas → 纹理上传)
73
- │ │ └── ParticlePipe.ts # 粒子系统渲染
74
- │ └── shaders/ # GLSL 着色器
75
- │ ├── ShaderLib.ts # GLSL ES 1.00 着色器库(WebGL1)
76
- │ └── ShaderLib2.ts # GLSL ES 3.00 着色器库(WebGL2)
77
- ├── events/ # 事件系统(11 个事件类 + EventPhase + IEventDispatcher 接口)
78
- ├── geom/ # 几何工具(Matrix, Point, Rectangle)
79
- ├── filters/ # 滤镜(Blur, Glow, DropShadow, ColorMatrix, CustomFilter, MultiPassFilter, BloomFilter)
80
- ├── text/ # 文本渲染
81
- │ ├── TextField.ts # 核心文本字段(含 textFlow 富文本、输入模式、密码模式)
82
- │ ├── BitmapText.ts # 位图文本
83
- │ ├── BitmapFont.ts # 位图字体
84
- │ ├── StageText.ts # INPUT 模式 DOM 输入框
85
- │ ├── HtmlTextParser.ts # HTML 文本解析
86
- │ ├── InputController.ts # 输入控制器(选择、光标、键盘处理)
87
- │ ├── TextMeasurer.ts # 文本测量(measureText, getFontString)
88
- │ ├── LineBreaks.ts # Unicode 17.0 UAX #14 断行边界与字典分词
89
- │ ├── TextLineLayout.ts # 整段富文本断行、宽度拟合与 UTF-16 源偏移
90
- │ ├── WordWrap.ts # 独立分词与字素工具(tokenize, splitGraphemes)
91
- │ ├── enums/ # HorizontalAlign, VerticalAlign, TextFieldType, TextFieldInputType
92
- │ └── types/ # ITextElement, IWTextElement, ILineElement, IHitTextElement 等类型定义
93
- ├── resource/ # 资源管理
94
- │ ├── Resource.ts # 资源核心(单例模式,async/await API,加载/缓存/生命周期)
95
- │ ├── ResourceConfig.ts # 资源配置
96
- │ ├── ResourceEvent.ts # 资源事件
97
- │ ├── ResourceItem.ts # 资源项
98
- │ ├── ResourceLoader.ts # 资源加载器
99
- │ └── analyzers/ # 资源分析器(AnalyzerBase, ImageAnalyzer, JsonAnalyzer, SheetAnalyzer, SoundAnalyzer, TextAnalyzer)
100
- ├── system/ # 系统能力
101
- │ └── Capabilities.ts # 运行时 WebGL 扩展/平台能力检测(UA + Client Hints)
102
- ├── net/ # 网络加载(HttpRequest, ImageLoader, HttpMethod, HttpResponseType)
103
- ├── media/ # 媒体(Sound, SoundChannel, Video)
104
- ├── utils/ # 工具类(ByteArray, Timer, Logger, FontManager, DebugLog, Base64Util, NumberUtils, toColorString)
105
- │ # 注:不提供 HashObject,对象身份比较用 === 或 WeakMap 键控查找
106
- ├── localStorage/ # 本地存储
107
- └── external/ # 外部接口(ExternalInterface)
47
+ ├── display/ # scene graph
48
+ │ ├── DisplayObject.ts # base class, dirty flags, render mode/type and cached bounds
49
+ │ ├── DisplayObjectContainer.ts # containers, render groups and zIndex sorting
50
+ │ ├── Bitmap.ts # bitmap display with scale9Grid
51
+ │ ├── Sprite.ts # container with Graphics
52
+ │ ├── Shape.ts # vector shapes
53
+ │ ├── Mesh.ts # vertices, indices and UVs
54
+ │ ├── Stage.ts # scene root
55
+ │ ├── Graphics.ts # vector drawing commands
56
+ │ ├── GraphicsPath.ts # PathCommandType and GraphicsCommand
57
+ │ ├── enums/ # BlendMode, BitmapFillMode, CapsStyle, GradientType, JointStyle, OrientationMode, StageScaleMode
58
+ │ └── texture/ # BitmapData, Texture, SpriteSheet, RenderTexture
59
+ ├── player/ # rendering pipeline and game loop
60
+ │ ├── Player.ts # Stage/renderer integration and performance metrics
61
+ │ ├── SystemTicker.ts # RAF loop, ENTER_FRAME and callLater queue
62
+ │ ├── RenderPipe.ts # RenderPipe interface
63
+ │ ├── InstructionSet.ts # instruction list, renderableIndex and incremental dirty updates
64
+ │ ├── TouchHandler.ts # touch and mouse input
65
+ │ ├── ScreenAdapter.ts # screen adaptation with 7 scale modes
66
+ │ ├── createPlayer.ts # initialization and RenderTexture renderer setup
67
+ │ ├── KurotOptions.ts # player options
68
+ │ ├── pipes/ # RenderPipe implementations
69
+ │ │ ├── BitmapPipe.ts # bitmap instructions
70
+ │ │ ├── BitmapTextPipe.ts # native bitmap-font glyph instructions
71
+ │ │ ├── GraphicsPipe.ts # Canvas rasterization and texture upload
72
+ │ │ ├── MeshPipe.ts # mesh instructions
73
+ │ │ ├── FilterPipe.ts # pooled filter push/pop instructions
74
+ │ │ ├── MaskPipe.ts # pooled mask push/pop instructions
75
+ │ │ ├── TextPipe.ts # offscreen text rasterization and texture upload
76
+ │ │ └── ParticlePipe.ts # particle rendering
77
+ │ ├── canvas/ # Canvas 2D backend and offscreen capture
78
+ │ │ ├── CanvasRenderer.ts # direct traversal with built-in filter approximations
79
+ │ │ ├── DisplayList.ts # offscreen cache for cacheAsBitmap
80
+ │ │ └── CanvasBuffer.ts # Canvas buffers and pixel hit testing
81
+ │ └── webgl/ # primary WebGL backend
82
+ │ ├── WebGLRenderer.ts # build/execute phases and render groups
83
+ │ ├── WebGLRenderContext.ts # WebGL state, draw scheduling and filter execution
84
+ │ ├── WebGLRenderBuffer.ts # pooled offscreen, stencil and scissor buffers
85
+ │ ├── WebGLRenderTarget.ts # framebuffer management
86
+ │ ├── WebGLVertexArrayObject.ts # single-texture 20B and multi-texture 24B vertex layouts
87
+ │ ├── WebGLDrawCmdManager.ts # 12 draw command types, including MULTI_TEXTURE
88
+ │ ├── WebGLProgram.ts # shader program cache
89
+ │ ├── WebGLUtils.ts # shader compilation, program creation, tint and texture helpers
90
+ │ ├── MultiTextureBatcher.ts # 8-texture batches and slotMap assignments
91
+ │ └── shaders/ # GLSL sources
92
+ │ ├── ShaderLib.ts # GLSL ES 1.00 for WebGL 1
93
+ │ └── ShaderLib2.ts # GLSL ES 3.00 for WebGL 2
94
+ ├── events/ # event classes, EventPhase and IEventDispatcher
95
+ ├── geom/ # Matrix, Point, Rectangle
96
+ ├── filters/ # Blur, Glow, DropShadow, ColorMatrix, CustomFilter, MultiPassFilter, BloomFilter
97
+ ├── text/ # text data and layout
98
+ │ ├── TextField.ts # rich text, input mode and password display
99
+ │ ├── BitmapText.ts # bitmap text
100
+ │ ├── BitmapFont.ts # bitmap font and texture ownership
101
+ │ ├── StageText.ts # DOM input for INPUT mode
102
+ │ ├── HtmlTextParser.ts # HTML text parsing
103
+ │ ├── InputController.ts # selection, caret and keyboard input
104
+ │ ├── TextMeasurer.ts # measureText and getFontString
105
+ │ ├── TextSegmentation.ts # shared cached word/grapheme segmenters and UTF-16 boundaries
106
+ │ ├── LineBreaks.ts # Unicode 17.0 UAX #14 boundaries and dictionary segmentation
107
+ │ ├── TextLineLayout.ts # rich-text wrapping, width fitting and UTF-16 source offsets
108
+ │ ├── WordWrap.ts # independent token and grapheme utilities
109
+ │ ├── enums/ # HorizontalAlign, VerticalAlign, TextFieldType, TextFieldInputType
110
+ │ └── types/ # ITextElement, IWTextElement, ILineElement, IHitTextElement
111
+ ├── resource/ # resource management
112
+ │ ├── Resource.ts # resource manager, shared instance and async/await API
113
+ │ ├── ResourceConfig.ts # resource configuration
114
+ │ ├── ResourceEvent.ts # resource events
115
+ │ ├── ResourceItem.ts # resource items
116
+ │ ├── ResourceLoader.ts # resource loading queue
117
+ │ └── analyzers/ # AnalyzerBase, Image, Json, Sheet, Sound, Text and Font analyzers
118
+ ├── system/ # environment capabilities
119
+ │ └── Capabilities.ts # runtime capabilities using UA and Client Hints
120
+ ├── net/ # HttpRequest, ImageLoader, HttpMethod, HttpResponseType
121
+ ├── media/ # Sound, SoundChannel, Video
122
+ ├── utils/ # ByteArray, Timer, Logger, FontManager, DebugLog, Base64Util, NumberUtils, toColorString
123
+ │ # object identity uses === or WeakMap; no HashObject
124
+ ├── localStorage/ # local storage functions
125
+ └── external/ # ExternalInterface
108
126
  ```
109
127
 
110
128
  ---
111
129
 
112
- ## 三、渲染管线架构
130
+ ## 3. Rendering pipeline
113
131
 
114
- ### 3.1 两阶段渲染(借鉴 Pixi.js 8)
132
+ ### 3.1 Build and execute phases
115
133
 
116
134
  ```
117
- Phase A — Build(仅 structureDirty 时):
118
- 遍历 DisplayObject 树 → 生成 Instruction(含 transform 快照)→ InstructionSet
135
+ Phase A — Build (structureDirty):
136
+ Traverse the display tree → create Instructions with transform snapshots → InstructionSet
119
137
 
120
- Phase A' — Update(仅 renderDirty 时):
121
- 遍历 dirtyRenderables → 刷新 transform 快照(O(1) lookup via renderableIndex Map)
138
+ Phase A' — Update (renderDirty):
139
+ Visit dirtyRenderables → refresh transform snapshots using renderableIndex lookups
122
140
 
123
- Phase B — Execute(每帧):
124
- 按指令顺序分发到 Pipe → 无场景图遍历
141
+ Phase B — Execute (every frame):
142
+ Dispatch instructions to pipes without traversing the scene graph
125
143
  ```
126
144
 
127
- ### 3.2 RenderPipe 体系
145
+ ### 3.2 RenderPipe
128
146
 
129
147
  ```
130
148
  RenderPipe<T extends DisplayObject>
131
- ├── addToInstructionSet(renderable, set) — 结构变化时调用
132
- ├── updateRenderable(renderable) — 数据变化时调用
133
- └── destroyRenderable(renderable) — 对象销毁时调用(可选,见下方 GPU 纹理回收说明)
134
-
135
- 实现:
136
- ├── BitmapPipe → BitmapInstruction → drawImage()(含 scale9Grid 九宫格)
137
- ├── GraphicsPipe → GraphicsInstruction → Canvas光栅化 → 纹理上传 → drawTexture()
138
- ├── MeshPipe → MeshInstruction → drawMesh()
139
- ├── TextPipe → TextInstruction → offscreen canvas → 纹理上传 → drawImage()
140
- ├── ParticlePipe → ParticleInstruction → 粒子批处理渲染
141
- ├── FilterPipe → FilterPush/Pop → 离屏FBO → 着色器滤镜
142
- └── MaskPipe → MaskPush/Pop → stencil/scissor/离屏合成
149
+ ├── addToInstructionSet(renderable, set) — build instructions after structure changes
150
+ ├── updateRenderable(renderable) — update visual data
151
+ └── destroyRenderable(renderable) — optional immediate cleanup; see texture GC below
152
+
153
+ Implementations:
154
+ ├── BitmapPipe → BitmapInstruction → drawImage(), including scale9Grid
155
+ ├── BitmapTextPipe → BitmapTextInstruction → shared layout → batched glyph drawImage()
156
+ ├── GraphicsPipe → GraphicsInstruction → Canvas rasterization → texture upload → drawTexture()
157
+ ├── MeshPipe → MeshInstruction → drawMesh()
158
+ ├── TextPipe → TextInstruction → offscreen Canvas → texture upload → drawImage()
159
+ ├── ParticlePipe → ParticleInstruction → particle batches
160
+ ├── FilterPipe → FilterPush/Pop → offscreen FBO → shader effects
161
+ └── MaskPipe → MaskPush/Pop → stencil, scissor or offscreen compositing
143
162
  ```
144
163
 
145
- **GPU 纹理回收**:`destroyRenderable()` 目前不会被 `WebGLRenderer` 自动调用(`DisplayObject` 没有"永久销毁"信号——`$onRemoveFromStage` 会在临时移出舞台又重新加入时反复触发,接上调用链会让虚拟列表等场景反复重新栅格化/上传纹理)。因此 `GraphicsPipe`、`TextPipe` 各自缓存纹理的清理不依赖调用方显式调用,而是用 `FinalizationRegistry` 在对应的 `Graphics` / `TextField` 被 JS 引擎 GC 时自动 `gl.deleteTexture()`。`destroyRenderable()` 仍保留为可选的立即释放路径(调用时会 `unregister` 对应的 GC 回调,避免重复删除),供未来需要显式销毁时机的场景使用。`BitmapPipe` / `MeshPipe` 的 `destroyRenderable` 是 no-op,因为它们绘制用的纹理归属于 `BitmapData` 的生命周期,不由 Pipe 自身管理。
164
+ **GPU texture cleanup.** `WebGLRenderer` does not automatically call
165
+ `destroyRenderable()`. Display objects have no permanent-destruction signal:
166
+ `$onRemoveFromStage` also fires when an object is temporarily removed and later
167
+ reused. Releasing textures at that point would force repeated rasterization and
168
+ uploads, for example when virtual lists reuse renderers.
146
169
 
147
- ### 3.3 RenderGroup 分层
170
+ GraphicsPipe and TextPipe use `FinalizationRegistry` to call `gl.deleteTexture()`
171
+ when their Graphics/TextField owners are garbage-collected. Explicit
172
+ `destroyRenderable()` remains an optional immediate-release path; it unregisters
173
+ the GC callback to avoid duplicate deletion. BitmapPipe and MeshPipe have no
174
+ pipe-owned texture cleanup because their textures belong to BitmapData.
175
+
176
+ ### 3.3 Render groups
148
177
 
149
178
  ```typescript
150
179
  backgroundLayer.isRenderGroup = true;
151
180
  ```
152
181
 
153
- - 每个 RenderGroup 拥有独立的 InstructionSet
154
- - 父 set 只包含一条 `renderGroup` 指令,指向子树 set
155
- - 子树结构变化只触发自身 set 重建,不影响父 set
156
- - 静态子树的 JS 遍历开销降为零
157
- - 实现通过 `WeakMap<DisplayObjectContainer, InstructionSet>` 管理 group sets
158
- - 使用 `WeakRef` 跟踪 group 生命周期,便于 GC
182
+ - Each render group owns an InstructionSet.
183
+ - Its parent set contains one `renderGroup` instruction referencing that subtree.
184
+ - Structure changes inside the group rebuild its own set, not its parent's set.
185
+ - Static subtrees do not need to be traversed on every WebGL frame.
186
+ - A `WeakMap<DisplayObjectContainer, InstructionSet>` stores group sets.
187
+ - WeakRef tracks group lifetimes without preventing garbage collection.
159
188
 
160
- ### 3.4 多纹理批处理
189
+ ### 3.4 Multi-texture batching
161
190
 
162
- - `MultiTextureBatcher` 管理最多 8 个纹理槽位(WebGL1 最小保证纹理单元数)
163
- - 顶点格式扩展:增加 `aTextureId` float 属性(stride 从 20B 增至 24B)
164
- - Fragment shader 使用 if/else 链采样(WebGL1 兼容)
165
- - mesh、filter、blend 变化自动 flush 回退到单纹理路径
166
- - `WebGLVertexArrayObject` 维护双缓冲区(单纹理 + 多纹理),按需切换 GPU buffer 大小
191
+ - MultiTextureBatcher manages up to 8 texture slots, the WebGL 1 minimum guarantee.
192
+ - The multi-texture vertex layout adds `aTextureId`, increasing the stride from
193
+ 20 to 24 bytes.
194
+ - The fragment shader selects textures with an if/else chain for WebGL 1 support.
195
+ - Mesh, filter and blend changes flush the current batch when needed.
196
+ - WebGLVertexArrayObject maintains single-texture and multi-texture buffers and
197
+ grows GPU buffers as needed.
167
198
 
168
- ### 3.5 脏标记系统
199
+ ### 3.5 Dirty flags
169
200
 
170
201
  ```
171
- DisplayObject 脏标记:
172
- ├── cacheDirty — cacheAsBitmap 缓存失效,向上传播
173
- ├── renderDirty — 视觉数据变化(位置/纹理/alpha/tint),向上传播
174
- └── renderMode — 渲染模式(NONE/FILTER/CLIP/SCROLLRECT)
175
-
176
- 通知机制(单 Player 静态钩子,由 Player 构造函数赋值):
177
- ├── $onStructureChange?: () => void — 结构变化回调
178
- ├── $onRenderableDirty?: (obj: DisplayObject) => void — 渲染脏回调
179
- ├── DisplayObjectContainer.$onContainerStructureChange?: (owner) => void — 容器结构变化回调
202
+ DisplayObject flags:
203
+ ├── cacheDirty — invalidates cacheAsBitmap and propagates upward
204
+ ├── renderDirty — visual changes (position, texture, alpha, tint), propagated upward
205
+ └── renderMode — NONE, FILTER, CLIP or SCROLLRECT
206
+
207
+ Notifications (single-Player static hooks installed by Player):
208
+ ├── $onStructureChange?: () => void — structure changes
209
+ ├── $onRenderableDirty?: (obj: DisplayObject) => void — visual changes
210
+ ├── DisplayObjectContainer.$onContainerStructureChange?: (owner) => void
180
211
  ├── $markDirty()
181
- │ ├── 更新 worldAlpha / worldTint 缓存(O(1) 读取)
182
- │ ├── 调用 $onRenderableDirty?.(this) → WebGLRenderer.markRenderableDirty()
183
- │ └── 向上传播 cacheDirty + renderDirty
212
+ │ ├── refresh worldAlpha/worldTint caches for constant-time reads
213
+ │ ├── $onRenderableDirty?.(this) → WebGLRenderer.markRenderableDirty()
214
+ │ └── propagate cacheDirty and renderDirty upward
184
215
  ├── $updateRenderMode()
185
- │ └── 调用 $onStructureChange?.() → WebGLRenderer.markStructureDirty()
216
+ │ └── $onStructureChange?.() → WebGLRenderer.markStructureDirty()
186
217
  └── DisplayObjectContainer.markDirtyInternal()
187
- └── 调用 $onContainerStructureChange?.(this) → markStructureDirty(owner)
218
+ └── $onContainerStructureChange?.(this) → markStructureDirty(owner)
188
219
  ```
189
220
 
190
- 引擎设计上始终是单 Player:`Player` 的构造函数直接把上述三个静态字段赋值
191
- 为具体的闭包函数(见 `player/Player.ts`),并在 `destroy()` 里清空它们。
221
+ The engine supports one Player per page. Its constructor assigns these static
222
+ hooks to instance closures, and `destroy()` clears them. See `player/Player.ts`.
192
223
 
193
- ### 3.6 RenderObjectType 快速路由
224
+ ### 3.6 RenderObjectType dispatch
194
225
 
195
- 为避免热路径中的 `instanceof` 检查,DisplayObject 使用 `renderObjectType` 枚举:
226
+ DisplayObject uses the `renderObjectType` enum to avoid `instanceof` checks on
227
+ hot rendering paths:
196
228
 
197
- | 枚举值 | 值 | 对应类型 | 路由 Pipe |
198
- | ---------- | --- | --------- | ------------ |
199
- | `NONE` | 0 | 无渲染 | — |
200
- | `BITMAP` | 1 | Bitmap | BitmapPipe |
201
- | `MESH` | 2 | Mesh | MeshPipe |
202
- | `SHAPE` | 3 | Shape | GraphicsPipe |
203
- | `SPRITE` | 4 | Sprite | GraphicsPipe |
204
- | `TEXT` | 5 | TextField | TextPipe |
205
- | `PARTICLE` | 6 | Particle | ParticlePipe |
229
+ | Enum | Value | Display type | Pipe |
230
+ | ------------- | ----- | ------------ | -------------- |
231
+ | `NONE` | 0 | No rendering | — |
232
+ | `BITMAP` | 1 | Bitmap | BitmapPipe |
233
+ | `MESH` | 2 | Mesh | MeshPipe |
234
+ | `SHAPE` | 3 | Shape | GraphicsPipe |
235
+ | `SPRITE` | 4 | Sprite | GraphicsPipe |
236
+ | `TEXT` | 5 | TextField | TextPipe |
237
+ | `PARTICLE` | 6 | Particle | ParticlePipe |
238
+ | `BITMAP_TEXT` | 7 | BitmapText | BitmapTextPipe |
206
239
 
207
240
  ---
208
241
 
209
- ## 四、WebGL 渲染后端
242
+ ## 4. WebGL backend
210
243
 
211
- ### 4.1 WebGL 版本选择
244
+ ### 4.1 WebGL selection
212
245
 
213
- `WebGLRenderContext` 在初始化时自动检测并选择最佳后端:
246
+ WebGLRenderContext selects a backend during initialization:
214
247
 
215
- - **WebGL 2 优先**:使用 `canvas.getContext('webgl2')`,加载 `ShaderLib2`(GLSL ES 3.00)
216
- - **WebGL 1 降级**:回退到 `canvas.getContext('webgl')`,加载 `ShaderLib`(GLSL ES 1.00)。
217
- 不使用 `experimental-webgl` 前缀——该别名只有 IE11/早期 Safari/旧版
218
- Android Chrome 才需要,现代浏览器的标准 `'webgl'` 已经足够。
219
- - **无独立探测 canvas**:`Player` 直接在应用方传入的 canvas 上依次尝试
220
- `webgl2` → `webgl`,两者都失败才降级到 Canvas 2D,不额外创建临时 canvas
221
- 探测能力。`checkWebGLSupport()` 函数仍导出,供需要独立探测的调用方使用,
222
- 但 `Player` 自身不调用它。
223
- - 着色器库通过实例属性动态绑定:`ctx.shaders`、`ctx.blurTierFn`、`ctx.makeBlurH`、`ctx.makeBlurV`
248
+ - **WebGL 2 first:** `canvas.getContext('webgl2')` uses ShaderLib2 (GLSL ES 3.00).
249
+ - **WebGL 1 fallback:** `canvas.getContext('webgl')` uses ShaderLib (GLSL ES 1.00).
250
+ No `experimental-webgl` alias is used; the target browsers support `webgl`.
251
+ - **No separate probe canvas:** Player tries WebGL 2 and WebGL 1 directly on the
252
+ application's canvas, then falls back to Canvas 2D if both fail.
253
+ `checkWebGLSupport()` remains available to callers but is not used by Player.
254
+ - Shader helpers are selected through context properties: `ctx.shaders`,
255
+ `ctx.blurTierFn`, `ctx.makeBlurH` and `ctx.makeBlurV`.
224
256
 
225
- ### 4.2 渲染流程
257
+ ### 4.2 Rendering flow
226
258
 
227
259
  ```
228
260
  Player.render()
@@ -231,77 +263,97 @@ Player.render()
231
263
  → Phase B: _executeInstructions()
232
264
  → Pipe.execute() → WebGLRenderContext.drawImage/drawMesh/drawTexture()
233
265
  → WebGLRenderContext.flush() → _flush()
234
- → 上传顶点(bufferSubData)→ 遍历 DrawCmdManager → 分发 draw batch
266
+ → upload vertices with bufferSubData → visit DrawCmdManager → dispatch draw batches
235
267
  ```
236
268
 
237
- ### 4.3 着色器体系
238
-
239
- | 着色器 | 用途 | 来源 |
240
- | ---------------------------------------- | ---------------------------------- | --------- |
241
- | default_vert + texture_frag | 标准纹理绘制 | ShaderLib |
242
- | multi_vert + multi_frag | 多纹理批处理(8单元) | ShaderLib |
243
- | default_vert + colorTransform_frag | ColorMatrixFilter | ShaderLib |
244
- | default_vert + glow_frag | Glow/DropShadow | ShaderLib |
245
- | fullscreen_vert + makeBlurH/ VFrag | 水平/垂直模糊(ping-pong 双 pass) | ShaderLib |
246
- | default_vert + primitive_frag | 纯色矩形(stencil mask) | ShaderLib |
247
- | fullscreen_vert | 全屏 quad blit(滤镜 pass) | ShaderLib |
248
-
249
- WebGL2(ShaderLib2)提供等价的 GLSL ES 3.00 版本着色器,使用 `in`/`out` 语法替代 `attribute`/`varying`,
250
- `texture()` 替代 `texture2D()`,blur 着色器按 4/8/16/32 档生成固定上限循环,仍使用三角权重核。
251
-
252
- ### 4.4 滤镜渲染
253
-
254
- 滤镜通过 FilterPipe 的 push/pop 指令对实现:
255
-
256
- - **push 阶段**:分配离屏 FBO(含 filter padding 扩展),将后续 draw 重定向到离屏 buffer
257
- - **pop 阶段**:调用 `compositeFilterResult()` 将离屏结果合成回父 buffer
258
-
259
- 合成流程(`compositeFilterResult`):
260
-
261
- 1. `flush()` 确保离屏输入完整。
262
- 2. `WebGLFilterSystem` 按数组顺序执行;中间 pass 关闭 blend/stencil/scissor,使用独立输出。
263
- 3. 显式恢复父 FBO、viewport 与裁剪状态。
264
- 4. 使用 `drawFramebufferTexture()` 合成最终结果,不重复应用已经写入子树的 alpha/tint。
265
- 5. 立即 flush 后归还中间纹理;失败时清理 pass 资源与待执行命令,下一帧可以恢复。
266
-
267
- - **ColorMatrixFilter**:无 mask 的叶子、单滤镜、继承分辨率时保留 inline 快速路径;组与组合走离屏。
268
- - **BlurFilter**:横纵分离,quality 控制 pass 对数;大半径先降采样,使 shader 半径不超过 32 物理像素。
269
- - **Glow / DropShadow**:保留原有 `glow_frag`;knockout 绑定与“是否保留原图”的 shader 语义对应。
270
- - **CustomFilter**:显式 GLSL 100/300 源码、按链接类型校验 numeric uniforms、独立采样的辅助 BitmapData 上传。
271
- - **MultiPassFilter / BloomFilter**:有序无环 pass 图,可读取原图或较早输出,支持各 pass 缩放。
272
-
273
- `WebGLFilterTargetPool` 缓存中间 GPU 目标,空闲上限 16 个 / 64 MiB;子树捕获缓冲与辅助图片不计入这个限制。
274
- `WebGLFilterTextures` 管理辅助图像上传和恢复。着色器编译缓存按 GL context 与实际源码隔离。
275
-
276
- Filter padding 按链累加,并包含子级效果的渲染范围,不修改布局 bounds。
277
- 离屏 pass 统一使用 framebuffer UV(左下为 0,0),每一步保持图像方向。
278
- DropShadow 传入正常角度弧度;辅助 DOM 图片的自动 UV 矩阵负责纵向转换。
279
-
280
- 具体 API、示例、Canvas 与缓存限制见 [GPU filters](filters.md)。
281
-
282
- ### 4.5 遮罩渲染
283
-
284
- - scrollRect/maskRect 无旋转且没有外层 scissor:scissor 裁剪(GPU 硬件加速)
285
- - scrollRect/maskRect 有旋转或嵌套在外层 scissor 内:stencil 裁剪;WebGL 主画布与能力探测共用 2D 上下文配置(不申请 depth,申请 stencil)
286
- - DisplayObject mask:离屏 buffer + destination-in 合成
269
+ ### 4.3 Shaders
270
+
271
+ | Shader | Purpose | Source |
272
+ | ---------------------------------- | --------------------------------------- | --------- |
273
+ | default_vert + texture_frag | Standard texture drawing | ShaderLib |
274
+ | multi_vert + multi_frag | Multi-texture batches, up to 8 textures | ShaderLib |
275
+ | default_vert + colorTransform_frag | ColorMatrixFilter | ShaderLib |
276
+ | default_vert + glow_frag | Glow/DropShadow | ShaderLib |
277
+ | fullscreen_vert + makeBlurH/VFrag | Horizontal/vertical blur in two passes | ShaderLib |
278
+ | default_vert + primitive_frag | Solid rectangles for stencil masks | ShaderLib |
279
+ | fullscreen_vert | Fullscreen quad blits for filter passes | ShaderLib |
280
+
281
+ ShaderLib2 supplies equivalent GLSL ES 3.00 shaders for WebGL 2, using `in`/`out`
282
+ instead of `attribute`/`varying`, and `texture()` instead of `texture2D()`.
283
+ Blur shaders use fixed loop limits of 4, 8, 16 or 32 samples with triangular weights.
284
+
285
+ ### 4.4 Filters
286
+
287
+ FilterPipe emits paired push/pop instructions:
288
+
289
+ - **Push:** allocate an offscreen FBO with filter padding and redirect drawing.
290
+ - **Pop:** call `compositeFilterResult()` to composite the result into the parent.
291
+
292
+ The compositing sequence is:
293
+
294
+ 1. Flush pending drawing to complete the captured input.
295
+ 2. WebGLFilterSystem executes filters in array order. Intermediate passes disable
296
+ blending, stencil and scissor and write to separate targets.
297
+ 3. Restore the parent FBO, viewport and clip state explicitly.
298
+ 4. Composite with `drawFramebufferTexture()` without applying inherited alpha/tint
299
+ a second time.
300
+ 5. Flush and return intermediate textures to the pool. Failures release resources
301
+ and queued commands so a later frame can recover.
302
+
303
+ - **ColorMatrixFilter:** an unmasked leaf with one filter and inherited resolution
304
+ can use the inline path; groups and combinations use offscreen targets.
305
+ - **BlurFilter:** horizontal/vertical separation, with quality controlling pass
306
+ pairs. Large radii downsample to stay within the 32-physical-pixel shader tier.
307
+ - **Glow/DropShadow:** retain glow_frag; knockout controls whether the source image
308
+ remains in the output.
309
+ - **CustomFilter:** explicit GLSL 100/300 sources, reflected numeric uniforms and
310
+ auxiliary BitmapData uploads with independent sampling.
311
+ - **MultiPassFilter/BloomFilter:** ordered acyclic pass graphs, with original or
312
+ earlier inputs and per-pass scaling.
313
+
314
+ WebGLFilterTargetPool caches up to 16 idle targets or 64 MiB. Subtree captures and
315
+ auxiliary images are outside this limit. WebGLFilterTextures manages auxiliary
316
+ image uploads and restoration. Shader programs are cached by GL context and source.
317
+
318
+ Filter-chain padding accumulates and includes child effects without changing
319
+ layout bounds. Offscreen passes use framebuffer UVs, with (0,0) at the lower left,
320
+ and preserve orientation. DropShadow angles reach shaders in radians. Auxiliary
321
+ DOM image bindings use UV transforms to account for vertical orientation.
322
+
323
+ See [GPU filters](filters.md) for APIs, examples, Canvas support and cache limits.
324
+
325
+ ### 4.5 Masks
326
+
327
+ - Axis-aligned scrollRect/maskRect without an outer scissor uses scissor clipping.
328
+ - Rotated rectangles or rectangles inside an outer scissor use stencil clipping.
329
+ Both the WebGL canvas and capability checks request stencil without depth.
330
+ - DisplayObject masks use offscreen compositing with destination-in.
287
331
 
288
332
  ---
289
333
 
290
- ## 五、Canvas 2D 渲染后端
334
+ ## 5. Canvas 2D backend
335
+
336
+ CanvasRenderer traverses the scene graph directly and supplies the fallback when
337
+ WebGL is unavailable. It also rasterizes offscreen caches and RenderTexture captures.
291
338
 
292
- Canvas 2D 渲染器保持直接遍历模式,作为 WebGL 不可用时的降级方案。
339
+ - Offscreen Graphics caching through `canvasCacheDirty`.
340
+ - CSS blur/drop-shadow approximations for Blur, DropShadow and Glow.
341
+ - CPU pixel processing for ColorMatrixFilter.
342
+ - DisplayList support for cacheAsBitmap.
343
+ - Pixel hit testing through a 3×3 offscreen buffer.
344
+ - Bitmap, Shape, Sprite, Mesh, TextField and BitmapText rendering.
345
+ - BitmapText draws atlas regions from shared layout, including trim offsets, tint
346
+ and ordinary clipping. See [bitmap fonts](bitmap-fonts.md) for ownership.
347
+ - TextField measurement, line layout and fillText/strokeText drawing. See
348
+ [text layout](./text-layout.md) for wrapping and source-offset contracts.
293
349
 
294
- - Graphics 离屏 Canvas 缓存(`canvasCacheDirty` 脏标记)
295
- - CSS filter 快速路径(Blur → `blur()`,DropShadow → `drop-shadow()`)
296
- - ColorMatrixFilter CPU 像素操作降级
297
- - cacheAsBitmap 支持(通过 DisplayList)
298
- - 像素级命中测试(3x3 离屏 buffer,hitTestBuffer 函数)
299
- - 支持所有 DisplayObject 类型:Bitmap, Shape, Sprite, Mesh, TextField(含样式、对齐、自动换行)
300
- - TextField 渲染:测量 → 分行 → Canvas 2D fillText/strokeText 绘制;断行规则与输入偏移契约见 [text-layout.md](./text-layout.md)
350
+ CustomFilter, MultiPassFilter and BloomFilter are GPU effects and are skipped.
351
+ Built-in Canvas approximations are not pixel-equivalent to WebGL. The same
352
+ boundary applies to cacheAsTexture and RenderTexture capture.
301
353
 
302
354
  ---
303
355
 
304
- ## 六、快速启动 API
356
+ ## 6. Application startup
305
357
 
306
358
  ### `createPlayer(options)`
307
359
 
@@ -319,55 +371,56 @@ const app = createPlayer({
319
371
  app.start(root);
320
372
  ```
321
373
 
322
- `createPlayer` 自动完成:
374
+ `createPlayer` initializes:
323
375
 
324
- 1. 调用 `Capabilities._init()` 检测运行环境(OS、isMobile、language)
325
- 2. 首次调用时注入 `RenderTexture.renderer`(Canvas 2D 离屏渲染器)
326
- 3. 创建 Stage、Player(WebGL 优先,Canvas 2D 降级)、TouchHandler、ScreenAdapter
327
- 4. 调用 `setupLifecycle(stage)` 绑定 ENTER_FRAME / RENDER 广播
376
+ 1. Capabilities._init() for OS, isMobile and language detection.
377
+ 2. RenderTexture.renderer on first use, providing offscreen Canvas 2D rendering.
378
+ 3. Stage, Player, TouchHandler and ScreenAdapter, preferring WebGL with Canvas fallback.
379
+ 4. setupLifecycle(stage) for ENTER_FRAME and RENDER broadcasts.
328
380
 
329
381
  ### KurotOptions
330
382
 
331
- | 属性 | 类型 | 默认值 | 说明 |
332
- | --------------- | ------------------- | --------------- | ------------ |
333
- | `canvas` | `HTMLCanvasElement` | (必填) | 渲染画布 |
334
- | `frameRate` | `number` | `60` | 目标帧率 |
335
- | `scaleMode` | `StageScaleMode` | `'showAll'` | 屏幕适配模式 |
336
- | `contentWidth` | `number` | `canvas.width` | 逻辑内容宽度 |
337
- | `contentHeight` | `number` | `canvas.height` | 逻辑内容高度 |
338
- | `resolution` | `number` | `min(DPR, 2)` | 后备缓冲像素密度 |
339
- | `orientation` | `OrientationMode` | `'auto'` | 屏幕方向 |
340
- | `maxTouches` | `number` | `99` | 最大触点数 |
341
- | `background` | `string` | — | CSS 背景色 |
342
-
343
- ### KurotApp 返回值
344
-
345
- | 属性 | 类型 | 说明 |
346
- | --------------- | --------------- | ------------- |
347
- | `player` | `Player` | 渲染播放器 |
348
- | `stage` | `Stage` | 舞台根节点 |
349
- | `touchHandler` | `TouchHandler` | 触摸/鼠标处理 |
350
- | `screenAdapter` | `ScreenAdapter` | 屏幕适配器 |
351
- | `start(root?)` | `() => void` | 启动游戏循环 |
352
- | `stop()` | `() => void` | 停止游戏循环 |
383
+ | Property | Type | Default | Description |
384
+ | --------------- | ------------------- | ------------------------- | --------------------------- |
385
+ | `canvas` | `HTMLCanvasElement` | Required | Rendering canvas |
386
+ | `frameRate` | `number` | `60` | Target frame rate |
387
+ | `scaleMode` | `StageScaleMode` | `'showAll'` | Screen scale mode |
388
+ | `contentWidth` | `number` | `canvas.width` or `640` | Logical content width |
389
+ | `contentHeight` | `number` | `canvas.height` or `1136` | Logical content height |
390
+ | `resolution` | `number` | `min(DPR, 2)` | Backing-store pixel density |
391
+ | `orientation` | `OrientationMode` | `'auto'` | Screen orientation |
392
+ | `maxTouches` | `number` | `99` | Maximum touch points |
393
+ | `background` | `string` | — | CSS background color |
394
+
395
+ ### KurotApp
396
+
397
+ | Property | Type | Description |
398
+ | --------------- | -------------------------------- | ------------------------------------------------------ |
399
+ | `player` | `Player` | Renderer and game loop |
400
+ | `stage` | `Stage` | Scene root |
401
+ | `touchHandler` | `TouchHandler` | Touch and mouse input |
402
+ | `screenAdapter` | `ScreenAdapter` | Screen adaptation |
403
+ | `start(root?)` | `(root?: DisplayObject) => void` | Start or resume the game loop |
404
+ | `stop()` | `() => void` | Stop the loop; it can be resumed |
405
+ | `destroy()` | `() => void` | Release the player, input, adapter and lifecycle hooks |
353
406
 
354
407
  ---
355
408
 
356
- ## 七、测试覆盖
357
-
358
- `test/` 下按模块组织测试文件,运行 `pnpm --dir packages/core test` 查看当前
359
- 文件数与用例数。
360
-
361
- | 模块 | 主要覆盖内容 |
362
- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
363
- | events/ | Event, EventDispatcher, EventPropagation, EventMap, TouchEvent, HTTPStatusEvent, ProgressEvent |
364
- | geom/ | Matrix, Point, Rectangle |
365
- | utils/ | ByteArray, Base64Util, Logger, DebugLog, NumberUtils, toColorString |
366
- | display/ | DisplayObject, DisplayObjectContainer, DisplayObjectIntegration, Bitmap, BitmapData, Sprite, Shape, Mesh, Stage, StageText, Graphics, Texture, SpriteSheet, BlendMode, DisplayList |
367
- | filters/ | Filter (全部滤镜), CustomFilter, filters(滤镜集成), EffectTransform(离屏效果变换正确性) |
368
- | media/ | Sound, SoundChannel, Video |
369
- | player/ | InstructionSet, InstructionPool, RenderGroup, TextPipe, MaskPipe, WebGLRendererDirty, WebGLRendererLeaf, WebGLVertexArrayObject, WebGLRenderBuffer, WebGLBlurFramebufferPool, CreatePlayer, TouchHandler |
370
- | net/ | HttpRequest, ImageLoader |
371
- | resource/ | Resource(并发 loadGroup 队列化), ResourceLoader(并发/重试/无 analyzer 场景) |
372
- | examples/benchmark/tests/ | 性能基准运行时与跨引擎对比测试 |
373
- | text/ | 通过 display 集成测试覆盖 |
409
+ ## 7. Test coverage
410
+
411
+ Tests are organized by module in `test/`. Run `pnpm --dir packages/core test` for
412
+ current file and test counts.
413
+
414
+ | Module | Main coverage |
415
+ | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
416
+ | events/ | Event, EventDispatcher, EventPropagation, EventMap, TouchEvent, HTTPStatusEvent, ProgressEvent |
417
+ | geom/ | Matrix, Point, Rectangle |
418
+ | utils/ | ByteArray, Base64Util, Logger, DebugLog, NumberUtils, toColorString |
419
+ | display/ | DisplayObject, DisplayObjectContainer, DisplayObjectIntegration, Bitmap, BitmapData, Sprite, Shape, Mesh, Stage, StageText, Graphics, Texture, SpriteSheet, BlendMode, DisplayList |
420
+ | filters/ | Filter classes, CustomFilter, filter integration and offscreen effect transforms |
421
+ | media/ | Sound, SoundChannel, Video |
422
+ | player/ | InstructionSet, InstructionPool, RenderGroup, TextPipe, MaskPipe, WebGLRendererDirty, WebGLRendererLeaf, WebGLVertexArrayObject, WebGLRenderBuffer, WebGLBlurFramebufferPool, CreatePlayer, TouchHandler |
423
+ | net/ | HttpRequest, ImageLoader |
424
+ | resource/ | Resource group serialization; ResourceLoader concurrency, retries and missing analyzers; FontAnalyzer loading and ownership |
425
+ | examples/benchmark/tests/ | Benchmark runtime and cross-engine comparisons |
426
+ | text/ | Display integration, BitmapText layout and native glyph geometry |