@jjlmoya/utils-games-development 1.47.0 → 1.50.0
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.
- package/package.json +1 -1
- package/src/category/index.ts +2 -1
- package/src/entries.ts +4 -1
- package/src/tests/locale_completeness.test.ts +1 -20
- package/src/tests/tool_validation.test.ts +2 -3
- package/src/tool/itchioGameTester/client.ts +12 -23
- package/src/tool/itchioGameTester/component.astro +0 -7
- package/src/tool/itchioGameTester/i18n/de.ts +0 -2
- package/src/tool/itchioGameTester/i18n/en.ts +0 -2
- package/src/tool/itchioGameTester/i18n/es.ts +0 -2
- package/src/tool/itchioGameTester/i18n/fr.ts +0 -2
- package/src/tool/itchioGameTester/i18n/id.ts +0 -2
- package/src/tool/itchioGameTester/i18n/it.ts +0 -2
- package/src/tool/itchioGameTester/i18n/ja.ts +0 -2
- package/src/tool/itchioGameTester/i18n/ko.ts +0 -2
- package/src/tool/itchioGameTester/i18n/nl.ts +0 -2
- package/src/tool/itchioGameTester/i18n/pl.ts +0 -2
- package/src/tool/itchioGameTester/i18n/pt.ts +0 -2
- package/src/tool/itchioGameTester/i18n/ru.ts +0 -2
- package/src/tool/itchioGameTester/i18n/sv.ts +0 -2
- package/src/tool/itchioGameTester/i18n/tr.ts +0 -2
- package/src/tool/itchioGameTester/i18n/zh.ts +0 -2
- package/src/tool/itchioGameTester/ui.ts +0 -2
- package/src/tool/spriteSheetPacker/app-client.ts +248 -0
- package/src/tool/spriteSheetPacker/bibliography.astro +6 -0
- package/src/tool/spriteSheetPacker/bibliography.ts +12 -0
- package/src/tool/spriteSheetPacker/component.astro +229 -0
- package/src/tool/spriteSheetPacker/dropzone-client.ts +55 -0
- package/src/tool/spriteSheetPacker/entry.ts +28 -0
- package/src/tool/spriteSheetPacker/exporter.ts +116 -0
- package/src/tool/spriteSheetPacker/extractor-client.ts +127 -0
- package/src/tool/spriteSheetPacker/flipbook-client.ts +60 -0
- package/src/tool/spriteSheetPacker/i18n/de.ts +270 -0
- package/src/tool/spriteSheetPacker/i18n/en.ts +275 -0
- package/src/tool/spriteSheetPacker/i18n/es.ts +275 -0
- package/src/tool/spriteSheetPacker/i18n/fr.ts +270 -0
- package/src/tool/spriteSheetPacker/i18n/id.ts +270 -0
- package/src/tool/spriteSheetPacker/i18n/it.ts +270 -0
- package/src/tool/spriteSheetPacker/i18n/ja.ts +270 -0
- package/src/tool/spriteSheetPacker/i18n/ko.ts +270 -0
- package/src/tool/spriteSheetPacker/i18n/nl.ts +270 -0
- package/src/tool/spriteSheetPacker/i18n/pl.ts +270 -0
- package/src/tool/spriteSheetPacker/i18n/pt.ts +270 -0
- package/src/tool/spriteSheetPacker/i18n/ru.ts +266 -0
- package/src/tool/spriteSheetPacker/i18n/sv.ts +270 -0
- package/src/tool/spriteSheetPacker/i18n/tr.ts +270 -0
- package/src/tool/spriteSheetPacker/i18n/zh.ts +270 -0
- package/src/tool/spriteSheetPacker/index.ts +11 -0
- package/src/tool/spriteSheetPacker/logic.test.ts +155 -0
- package/src/tool/spriteSheetPacker/logic.ts +32 -0
- package/src/tool/spriteSheetPacker/packer-core.ts +121 -0
- package/src/tool/spriteSheetPacker/packer-ui.ts +86 -0
- package/src/tool/spriteSheetPacker/seo.astro +15 -0
- package/src/tool/spriteSheetPacker/sprite-sheet-packer.css +578 -0
- package/src/tool/spriteSheetPacker/types.ts +89 -0
- package/src/tool/spriteSheetPacker/ui.ts +42 -0
- package/src/tools.ts +2 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { SpriteSheetPackerUI } from '../ui';
|
|
3
|
+
|
|
4
|
+
export const content: ToolLocaleContent<SpriteSheetPackerUI> = {
|
|
5
|
+
slug: 'sprite-sheet-packer',
|
|
6
|
+
title: 'スプライトシートパッカー & エクストラクター',
|
|
7
|
+
description:
|
|
8
|
+
'個別のアニメーションフレームをテクスチャアトラスにパッキング、または既存のスプライトシートから画像を抽出して2Dゲームの描画負荷を最適化します。',
|
|
9
|
+
ui: {
|
|
10
|
+
packerTab: 'パッカースタジオ',
|
|
11
|
+
extractorTab: 'スプライト抽出器',
|
|
12
|
+
dropZoneTitle: 'フレーム画像をドラッグ&ドロップ',
|
|
13
|
+
dropZoneSubtitle: 'PNGまたはWebP画像をアップロードして最適なテクスチャアトラスを生成',
|
|
14
|
+
selectFilesButton: '画像ファイルを選択',
|
|
15
|
+
clearAllButton: 'ワークスペースをクリア',
|
|
16
|
+
downloadZipButton: 'パッケージをダウンロード (ZIP)',
|
|
17
|
+
copyJsonButton: 'アトラスJSONをコピー',
|
|
18
|
+
downloadSheetPngButton: 'テクスチャPNGをダウンロード',
|
|
19
|
+
paddingLabel: 'フレーム間隔 (px)',
|
|
20
|
+
borderExtrusionLabel: '境界パディング (px)',
|
|
21
|
+
maxTextureSizeLabel: '最大テクスチャサイズ',
|
|
22
|
+
powerOfTwoLabel: '2の累乗サイズを強制 (POT)',
|
|
23
|
+
trimTransparencyLabel: '透明領域をトリミング',
|
|
24
|
+
exportFormatLabel: '出力エンジンフォーマット',
|
|
25
|
+
presetPixelArt: 'ドット絵 16x16 プリセット',
|
|
26
|
+
presetHdUi: 'HD UI アトラス 1024 プリセット',
|
|
27
|
+
presetMobile: 'モバイル WebGL 2048 プリセット',
|
|
28
|
+
formatGenericHash: '汎用 JSON (Hash)',
|
|
29
|
+
formatGenericArray: '汎用 JSON (Array)',
|
|
30
|
+
formatUnity: 'Unity 2D エンジン',
|
|
31
|
+
formatGodot: 'Godot 2D エンジン',
|
|
32
|
+
formatPhaser: 'Phaser / PixiJS エンジン',
|
|
33
|
+
formatCss: 'Web フロントエンド CSS',
|
|
34
|
+
previewTitle: 'テクスチャアトラス プレビュー',
|
|
35
|
+
efficiencyBadge: 'テクスチャ充填率',
|
|
36
|
+
drawCallsBadge: 'ドローコール削減数',
|
|
37
|
+
totalFramesBadge: 'パッキング済フレーム数',
|
|
38
|
+
textureSizeBadge: 'アトラス解像度',
|
|
39
|
+
flipbookTitle: 'アニメーションパラパラマンガ',
|
|
40
|
+
flipbookFpsLabel: '再生速度 (FPS)',
|
|
41
|
+
playAnimation: '再生開始',
|
|
42
|
+
pauseAnimation: '一時停止',
|
|
43
|
+
extractorModeGrid: '固定グリッド分割',
|
|
44
|
+
extractorModeAlpha: '自動アルファチャンネル分割',
|
|
45
|
+
frameWidthLabel: 'フレーム幅 (px)',
|
|
46
|
+
frameHeightLabel: 'フレーム高さ (px)',
|
|
47
|
+
marginLabel: 'マージンオフセット (px)',
|
|
48
|
+
spacingLabel: 'グリッド間隔 (px)',
|
|
49
|
+
extractFramesButton: '画像を抽出',
|
|
50
|
+
extractedCountLabel: '抽出されたスプライト数',
|
|
51
|
+
codeSnippetTitle: 'エンジン組み込みコード',
|
|
52
|
+
copySnippetButton: 'コードをコピー',
|
|
53
|
+
copiedToast: 'クリップボードにコピーしました',
|
|
54
|
+
},
|
|
55
|
+
seo: [
|
|
56
|
+
{
|
|
57
|
+
type: 'title',
|
|
58
|
+
level: 2,
|
|
59
|
+
text: '2Dゲームエンジンにおけるドローコール最適化とGPUバッチ処理',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
type: 'paragraph',
|
|
63
|
+
html: '現代の2Dグラフィックス描画処理では、個別の画像ファイルを1枚のテクスチャアトラスにパッキングすることで、CPUからGPUへ送られる描画命令(ドローコール)を大幅に削減できます。',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
type: 'stats',
|
|
67
|
+
columns: 4,
|
|
68
|
+
items: [
|
|
69
|
+
{ value: '95%', label: 'ドローコール削減率' },
|
|
70
|
+
{ value: '4x', label: 'GPUバッチ処理の高速化' },
|
|
71
|
+
{ value: '60 FPS', label: 'モバイル環境での目標値' },
|
|
72
|
+
{ value: '100%', label: 'ブラウザ内ローカル処理' },
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
type: 'title',
|
|
77
|
+
level: 2,
|
|
78
|
+
text: '個別画像ファイルと結合済みテクスチャアトラスの比較',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
type: 'comparative',
|
|
82
|
+
columns: 2,
|
|
83
|
+
items: [
|
|
84
|
+
{
|
|
85
|
+
title: 'バラバラの画像ファイル',
|
|
86
|
+
description: '個別に保存されたPNGおよびWebPファイル',
|
|
87
|
+
points: [
|
|
88
|
+
'画面上の各フレームごとに個別の描画命令が発生する',
|
|
89
|
+
'グラフィックカードのコンテキストスイッチが頻繁に起こる',
|
|
90
|
+
'Webゲームにおいて通信リクエスト数が増加する',
|
|
91
|
+
'モバイル端末でのフレームレートが低下しやすい',
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
title: '結合済みテクスチャアトラス',
|
|
96
|
+
description: 'メタデータJSONが付属する単一のテクスチャ画像',
|
|
97
|
+
points: [
|
|
98
|
+
'数百個のスプライトを単一のドローコールでまとめて描写できる',
|
|
99
|
+
'GPUのメモリ帯域幅とレンダリング速度を最大限に活用できる',
|
|
100
|
+
'画像とメタデータをまとめることでファイル取得処理を高速化する',
|
|
101
|
+
'あらゆるゲームエンジンで滑らかな動作を実現する',
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
type: 'title',
|
|
108
|
+
level: 2,
|
|
109
|
+
text: 'サブピクセルカメラ移動と境界拡張パディング',
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
type: 'paragraph',
|
|
113
|
+
html: 'カメラ移動時の境界滲みを防ぐため、境界ピクセルを外側に1〜2ピクセル拡張複製する処理(Border Extrusion)が極めて有効です。',
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
type: 'tip',
|
|
117
|
+
title: '境界拡張パディングの最適化戦略',
|
|
118
|
+
html: 'カメラ移動やズーム時の視覚的ノイズを完全に防止するため、パッキング時に1〜2ピクセルの境界拡張を設定してください。',
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
type: 'title',
|
|
122
|
+
level: 2,
|
|
123
|
+
text: 'モバイルおよびPC向けテクスチャ解像度ガイドライン',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'table',
|
|
127
|
+
headers: ['対象プラットフォーム', '推奨最大サイズ', '2の累乗要件', 'メモリプロファイル'],
|
|
128
|
+
rows: [
|
|
129
|
+
['モバイルブラウザ', '2048 x 2048 px', 'WebGL 1.0で必須', '低メモリ帯域'],
|
|
130
|
+
['デスクトップPC / コンソール', '4096 x 4096 px', '推奨', '高GPU容量'],
|
|
131
|
+
['レトロ小型ゲーム機', '1024 x 1024 px', '必須', '厳格なVRAM制限'],
|
|
132
|
+
],
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
type: 'proscons',
|
|
136
|
+
items: [
|
|
137
|
+
{
|
|
138
|
+
pro: '旧世代のグラフィックドライバやWebGL 1.0との完全な互換性を保証する',
|
|
139
|
+
con: '画像枚数が少ない場合に余白が残る可能性がある',
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
pro: 'ハードウェアによる自動ミップマップ生成をサポートする',
|
|
143
|
+
con: '複雑な形状の画像では余白設定に微調整が必要',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
pro: 'GPUのVRAM割り当てを効率化できる',
|
|
147
|
+
con: '初期テクスチャ領域がわずかに増加する',
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'title',
|
|
153
|
+
level: 2,
|
|
154
|
+
text: 'スプライトパッキングの主要用語解説',
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
type: 'glossary',
|
|
158
|
+
items: [
|
|
159
|
+
{
|
|
160
|
+
term: 'ドローコール (Draw Call)',
|
|
161
|
+
definition: 'CPUがGPUに対して画像やポリゴンを描画するよう送る指示のこと。',
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
term: 'ビンパッキング (Bin Packing)',
|
|
165
|
+
definition: '様々なサイズの長方形を最小限の領域に詰める計算手法のこと。',
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
term: '境界パディング (Border Extrusion)',
|
|
169
|
+
definition: 'テクスチャの端のピクセルを外側に伸ばし境界ノイズを防ぐ処理。',
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
term: 'パラパラマンガ (Flipbook Animation)',
|
|
173
|
+
definition: '静止画を高速で切り替えて滑らかな動きを表現するアニメーション手法。',
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
type: 'title',
|
|
179
|
+
level: 2,
|
|
180
|
+
text: 'パフォーマンス点検リスト',
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
type: 'diagnostic',
|
|
184
|
+
variant: 'info',
|
|
185
|
+
title: '開発運用ルール',
|
|
186
|
+
html: 'アニメーションは共通アトラスにまとめ、WebGL出力時は2の累乗サイズを選択してください。',
|
|
187
|
+
},
|
|
188
|
+
],
|
|
189
|
+
faq: [
|
|
190
|
+
{
|
|
191
|
+
question: 'スプライトシートとは何ですか?なぜ2Dゲームに必要なのですか?',
|
|
192
|
+
answer:
|
|
193
|
+
'スプライトシートは複数のアニメーション画像を1枚にまとめたテクスチャファイルです。まとめにすることでGPUへの描画命令数を削減し、ゲームを高速化できます。',
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
question: 'このツールの処理はどのように行われますか?',
|
|
197
|
+
answer:
|
|
198
|
+
'すべての画像処理はお使いのブラウザ内部のHTML5 Canvas機能で行われます。外部サーバーに画像データが送信されることは一切ありません。',
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
question: '既存のスプライトシートから画像を分割できますか?',
|
|
202
|
+
answer:
|
|
203
|
+
'はい。抽出モードに切り替えて画像をアップロードし、分割サイズを指定することで個別画像を一括抽出できます。',
|
|
204
|
+
},
|
|
205
|
+
],
|
|
206
|
+
howTo: [
|
|
207
|
+
{
|
|
208
|
+
name: '画像をアップロード',
|
|
209
|
+
text: 'ドロップエリアにアニメーションフレーム画像を追加します。',
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
name: '設定を調整',
|
|
213
|
+
text: 'パディングや最大サイズ、出力先のゲームエンジンを選択します。',
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
name: 'プレビューして保存',
|
|
217
|
+
text: 'パラパラマンガで動きを確認した後、ZIPファイルで保存します。',
|
|
218
|
+
},
|
|
219
|
+
],
|
|
220
|
+
schemas: [
|
|
221
|
+
{
|
|
222
|
+
'@context': 'https://schema.org',
|
|
223
|
+
'@type': 'SoftwareApplication',
|
|
224
|
+
name: 'スプライトシートパッカー & エクストラクター',
|
|
225
|
+
applicationCategory: 'DeveloperApplication',
|
|
226
|
+
operatingSystem: 'Any',
|
|
227
|
+
offers: {
|
|
228
|
+
'@type': 'Offer',
|
|
229
|
+
price: '0',
|
|
230
|
+
priceCurrency: 'USD',
|
|
231
|
+
},
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
'@context': 'https://schema.org',
|
|
235
|
+
'@type': 'FAQPage',
|
|
236
|
+
mainEntity: [
|
|
237
|
+
{
|
|
238
|
+
'@type': 'Question',
|
|
239
|
+
name: 'スプライトシートとは何ですか?',
|
|
240
|
+
acceptedAnswer: {
|
|
241
|
+
'@type': 'Answer',
|
|
242
|
+
text: 'スプライトシートは複数のアニメーション画像を1枚にまとめたテクスチャファイルです。',
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
],
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
'@context': 'https://schema.org',
|
|
249
|
+
'@type': 'HowTo',
|
|
250
|
+
name: 'スプライトシートの作成と分割方法',
|
|
251
|
+
step: [
|
|
252
|
+
{
|
|
253
|
+
'@type': 'HowToStep',
|
|
254
|
+
name: '画像をアップロード',
|
|
255
|
+
text: 'ドロップエリアにアニメーションフレーム画像を追加します。',
|
|
256
|
+
},
|
|
257
|
+
],
|
|
258
|
+
},
|
|
259
|
+
],
|
|
260
|
+
bibliography: [
|
|
261
|
+
{
|
|
262
|
+
name: 'Godot Engine 2D Sprite Sheets Documentation',
|
|
263
|
+
url: 'https://docs.godotengine.org/en/stable/tutorials/2d/2d_sprite_animation.html',
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
name: 'Unity Sprite Atlas Manual',
|
|
267
|
+
url: 'https://docs.unity3d.com/Manual/class-SpriteAtlas.html',
|
|
268
|
+
},
|
|
269
|
+
],
|
|
270
|
+
};
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { SpriteSheetPackerUI } from '../ui';
|
|
3
|
+
|
|
4
|
+
export const content: ToolLocaleContent<SpriteSheetPackerUI> = {
|
|
5
|
+
slug: 'sprite-sheet-packer',
|
|
6
|
+
title: '스프라이트 시트 패커 및 추출기',
|
|
7
|
+
description:
|
|
8
|
+
'낱개 개별 애니메이션 프레임을 텍스처 아틀라스로 패킹하거나 기존 스프라이트 시트에서 이미지를 추출하여 2D 게임 드로우 콜을 최적화하세요.',
|
|
9
|
+
ui: {
|
|
10
|
+
packerTab: '패커 스튜디오',
|
|
11
|
+
extractorTab: '스프라이트 추출기',
|
|
12
|
+
dropZoneTitle: '프레임 이미지 드래그 앤 드롭',
|
|
13
|
+
dropZoneSubtitle: 'PNG 또는 WebP 이미지를 업로드하여 최적화된 텍스처 아틀라스 생성',
|
|
14
|
+
selectFilesButton: '이미지 파일 선택',
|
|
15
|
+
clearAllButton: '작업 영역 비우기',
|
|
16
|
+
downloadZipButton: '패키지 다운로드 (ZIP)',
|
|
17
|
+
copyJsonButton: '아틀라스 JSON 복사',
|
|
18
|
+
downloadSheetPngButton: '텍스처 PNG 다운로드',
|
|
19
|
+
paddingLabel: '프레임 간격 (px)',
|
|
20
|
+
borderExtrusionLabel: '테두리 확장 (px)',
|
|
21
|
+
maxTextureSizeLabel: '최대 텍스처 해상도',
|
|
22
|
+
powerOfTwoLabel: '2의 거듭제곱 규격 강제 (POT)',
|
|
23
|
+
trimTransparencyLabel: '투명 영역 잘라내기',
|
|
24
|
+
exportFormatLabel: '타깃 엔진 포맷',
|
|
25
|
+
presetPixelArt: '픽셀 아트 16x16 프리셋',
|
|
26
|
+
presetHdUi: 'HD UI 아틀라스 1024 프리셋',
|
|
27
|
+
presetMobile: '모바일 WebGL 2048 프리셋',
|
|
28
|
+
formatGenericHash: '일반 JSON (Hash)',
|
|
29
|
+
formatGenericArray: '일반 JSON (Array)',
|
|
30
|
+
formatUnity: 'Unity 2D 엔진',
|
|
31
|
+
formatGodot: 'Godot 2D 엔진',
|
|
32
|
+
formatPhaser: 'Phaser / PixiJS 엔진',
|
|
33
|
+
formatCss: '웹 프론트엔드 CSS',
|
|
34
|
+
previewTitle: '텍스처 아틀라스 미리보기',
|
|
35
|
+
efficiencyBadge: '텍스처 공간 효율',
|
|
36
|
+
drawCallsBadge: '절감된 드로우 콜',
|
|
37
|
+
totalFramesBadge: '패킹된 프레임 수',
|
|
38
|
+
textureSizeBadge: '아틀라스 해상도',
|
|
39
|
+
flipbookTitle: '애니메이션 플립북 플레이어',
|
|
40
|
+
flipbookFpsLabel: '애니메이션 속도 (FPS)',
|
|
41
|
+
playAnimation: '시퀀스 재생',
|
|
42
|
+
pauseAnimation: '일시 정지',
|
|
43
|
+
extractorModeGrid: '고정 격자 분할',
|
|
44
|
+
extractorModeAlpha: '자동 알파 채널 분할',
|
|
45
|
+
frameWidthLabel: '프레임 가로 (px)',
|
|
46
|
+
frameHeightLabel: '프레임 세로 (px)',
|
|
47
|
+
marginLabel: '여백 오프셋 (px)',
|
|
48
|
+
spacingLabel: '격자 간격 (px)',
|
|
49
|
+
extractFramesButton: '이미지 추출하기',
|
|
50
|
+
extractedCountLabel: '추출된 스프라이트 수',
|
|
51
|
+
codeSnippetTitle: '엔진 연동 코드',
|
|
52
|
+
copySnippetButton: '코드 복사',
|
|
53
|
+
copiedToast: '클립보드에 복사되었습니다',
|
|
54
|
+
},
|
|
55
|
+
seo: [
|
|
56
|
+
{
|
|
57
|
+
type: 'title',
|
|
58
|
+
level: 2,
|
|
59
|
+
text: '2D 게임 엔진의 드로우 콜 최적화 및 GPU 렌더링',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
type: 'paragraph',
|
|
63
|
+
html: '개별 낱개 프레임 이미지를 단 하나의 텍스처 아틀라스로 패킹하면 CPU에서 GPU로 전송되는 렌더링 드로우 콜 횟수가 획기적으로 줄어듭니다.',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
type: 'stats',
|
|
67
|
+
columns: 4,
|
|
68
|
+
items: [
|
|
69
|
+
{ value: '95%', label: '드로우 콜 절감률' },
|
|
70
|
+
{ value: '4x', label: 'GPU 일괄 처리 속도 향상' },
|
|
71
|
+
{ value: '60 FPS', label: '모바일 목표 성능' },
|
|
72
|
+
{ value: '100%', label: '브라우저 로컬 처리' },
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
type: 'title',
|
|
77
|
+
level: 2,
|
|
78
|
+
text: '개별 프레임 파일 vs 패킹된 텍스처 아틀라스 비교',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
type: 'comparative',
|
|
82
|
+
columns: 2,
|
|
83
|
+
items: [
|
|
84
|
+
{
|
|
85
|
+
title: '개별 프레임 파일',
|
|
86
|
+
description: '독립적으로 저장된 PNG 파일',
|
|
87
|
+
points: [
|
|
88
|
+
'화면상의 개별 프레임마다 독립적인 드로우 콜 명령 호출',
|
|
89
|
+
'그래픽 카드 GPU 렌더링 컨텍스트 스위칭 빈번히 발생',
|
|
90
|
+
'웹 게임 환경에서 HTTP 요청 수 대폭 증가',
|
|
91
|
+
'모바일 기기에서 프레임 레이트 저하 유발',
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
title: '패킹된 텍스처 아틀라스',
|
|
96
|
+
description: '단일 PNG 이미지와 JSON 좌표 데이터 결합',
|
|
97
|
+
points: [
|
|
98
|
+
'수백 개의 스프라이트를 단 하나의 GPU 드로우 콜로 묶어서 처리',
|
|
99
|
+
'그래픽 메모리 대역폭 및 렌더링 처리량 극대화',
|
|
100
|
+
'이미지와 메타데이터를 묶어 네트워크 요청 단순화',
|
|
101
|
+
'모든 플랫폼에서 부드러운 렌더링 성능 보장',
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
type: 'title',
|
|
108
|
+
level: 2,
|
|
109
|
+
text: '서브픽셀 카메라 이동 및 테두리 확장 기술',
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
type: 'paragraph',
|
|
113
|
+
html: '외곽 테두리 피셀을 1~2픽셀 외곽으로 확장 복사하는 Border Extrusion을 적용하면 카메라 이동 시 발생하는 픽셀 번짐 현상을 방지할 수 있습니다.',
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
type: 'tip',
|
|
117
|
+
title: '테두리 확장 최적화 전략',
|
|
118
|
+
html: '카메라 이동 시 발생하는 시각적 경계 간섭을 방지하기 위해 1~2픽셀의 테두리 확장을 설정하세요.',
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
type: 'title',
|
|
122
|
+
level: 2,
|
|
123
|
+
text: '모바일 및 PC 엔진용 권장 텍스처 규격',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'table',
|
|
127
|
+
headers: ['타깃 플랫폼', '권장 최대 크기', '2의 거듭제곱 필수 여부', '메모리 프로필'],
|
|
128
|
+
rows: [
|
|
129
|
+
['모바일 웹 브라우저', '2048 x 2048 px', 'WebGL 1.0 필수', '낮은 대역폭'],
|
|
130
|
+
['데스크톱 PC / 콘솔', '4096 x 4096 px', '권장', '높은 GPU 용량'],
|
|
131
|
+
['레트로 휴대용 기기', '1024 x 1024 px', '필수', '엄격한 VRAM 제한'],
|
|
132
|
+
],
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
type: 'proscons',
|
|
136
|
+
items: [
|
|
137
|
+
{
|
|
138
|
+
pro: '구형 그래픽 드라이버 및 WebGL 1.0 환경과의 완벽한 호환성 제공',
|
|
139
|
+
con: '스프라이트 개수가 적을 때 여백 공간이 남을 수 있음',
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
pro: '하드웨어 밉맵 자동 생성 지원',
|
|
143
|
+
con: '불규칙한 프레임인 경우 정교한 여백 조절 필요',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
pro: 'GPU 메모리 VRAM 할당 최적화',
|
|
147
|
+
con: '초기 텍스처 할당 영역이 약간 증가함',
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'title',
|
|
153
|
+
level: 2,
|
|
154
|
+
text: '스프라이트 패킹 핵심 용어',
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
type: 'glossary',
|
|
158
|
+
items: [
|
|
159
|
+
{
|
|
160
|
+
term: '드로우 콜 (Draw Call)',
|
|
161
|
+
definition: 'CPU가 그래픽 카드 GPU에 그래픽 렌더링을 명령하는 지시 횟수.',
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
term: '빈 패킹 (Bin Packing)',
|
|
165
|
+
definition: '다양한 크기의 사각형들을 가장 작은 영역 안에 효율적으로 배치하는 알고리즘.',
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
term: '외곽 확장 (Border Extrusion)',
|
|
169
|
+
definition: '이미지 테두리 피셀을 외곽으로 확장하여 그래픽 경계선 경계 간섭을 막는 기술.',
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
term: '플립북 애니메이션 (Flipbook Animation)',
|
|
173
|
+
definition: '연속된 프레임 이미지를 빠르게 재생하여 움직임을 표현하는 방식.',
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
type: 'title',
|
|
179
|
+
level: 2,
|
|
180
|
+
text: '개발 점검 리스트',
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
type: 'diagnostic',
|
|
184
|
+
variant: 'info',
|
|
185
|
+
title: '생산성 규칙',
|
|
186
|
+
html: '캐릭터 애니메이션은 하나로 패킹하고 WebGL 빌드 시 2의 거듭제곱 해상도를 유지하세요.',
|
|
187
|
+
},
|
|
188
|
+
],
|
|
189
|
+
faq: [
|
|
190
|
+
{
|
|
191
|
+
question: '스프라이트 시트가 무엇이며 왜 2D 게임 개발에 필요한가요?',
|
|
192
|
+
answer:
|
|
193
|
+
'스프라이트 시트는 여러 프레임 이미지를 하나로 합친 텍스처 파일입니다. 이를 통해 렌더링 드로우 콜을 줄여 게임 속도를 향상시킵니다.',
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
question: '클라이언트 측 처리란 무슨 뜻인가요?',
|
|
197
|
+
answer:
|
|
198
|
+
'모든 작업이 사용자의 웹 브라우저 HTML5 Canvas API에서 직접 처리되며 서버로 이미지가 전송되지 않습니다.',
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
question: '기존 스프라이트 시트에서 프레임을 잘라낼 수 있나요?',
|
|
202
|
+
answer:
|
|
203
|
+
'네. 추출기 탭으로 이동하여 이미지를 올린 뒤 격자 크기를 지정하면 낱개 파일로 자동 분할됩니다.',
|
|
204
|
+
},
|
|
205
|
+
],
|
|
206
|
+
howTo: [
|
|
207
|
+
{
|
|
208
|
+
name: '프레임 업로드',
|
|
209
|
+
text: '드롭존에 PNG 또는 WebP 프레임 파일을 올려놓습니다.',
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
name: '설정 구성',
|
|
213
|
+
text: '여백, 테두리 확장 및 사용할 게임 엔진 포맷을 선택합니다.',
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
name: '미리보기 및 다운로드',
|
|
217
|
+
text: '플립북 플레이어로 애니메이션을 확인하고 ZIP 파일로 다운로드합니다.',
|
|
218
|
+
},
|
|
219
|
+
],
|
|
220
|
+
schemas: [
|
|
221
|
+
{
|
|
222
|
+
'@context': 'https://schema.org',
|
|
223
|
+
'@type': 'SoftwareApplication',
|
|
224
|
+
name: '스프라이트 시트 패커 및 추출기',
|
|
225
|
+
applicationCategory: 'DeveloperApplication',
|
|
226
|
+
operatingSystem: 'Any',
|
|
227
|
+
offers: {
|
|
228
|
+
'@type': 'Offer',
|
|
229
|
+
price: '0',
|
|
230
|
+
priceCurrency: 'USD',
|
|
231
|
+
},
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
'@context': 'https://schema.org',
|
|
235
|
+
'@type': 'FAQPage',
|
|
236
|
+
mainEntity: [
|
|
237
|
+
{
|
|
238
|
+
'@type': 'Question',
|
|
239
|
+
name: '스프라이트 시트가 무엇인가요?',
|
|
240
|
+
acceptedAnswer: {
|
|
241
|
+
'@type': 'Answer',
|
|
242
|
+
text: '스프라이트 시트는 여러 프레임 이미지를 하나로 합친 텍스처 파일입니다.',
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
],
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
'@context': 'https://schema.org',
|
|
249
|
+
'@type': 'HowTo',
|
|
250
|
+
name: '스프라이트 시트 패킹 및 추출 방법',
|
|
251
|
+
step: [
|
|
252
|
+
{
|
|
253
|
+
'@type': 'HowToStep',
|
|
254
|
+
name: '프레임 업로드',
|
|
255
|
+
text: '드롭존에 PNG 또는 WebP 프레임 파일을 올려놓습니다.',
|
|
256
|
+
},
|
|
257
|
+
],
|
|
258
|
+
},
|
|
259
|
+
],
|
|
260
|
+
bibliography: [
|
|
261
|
+
{
|
|
262
|
+
name: 'Godot Engine 2D Sprite Sheets Documentation',
|
|
263
|
+
url: 'https://docs.godotengine.org/en/stable/tutorials/2d/2d_sprite_animation.html',
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
name: 'Unity Sprite Atlas Manual',
|
|
267
|
+
url: 'https://docs.unity3d.com/Manual/class-SpriteAtlas.html',
|
|
268
|
+
},
|
|
269
|
+
],
|
|
270
|
+
};
|