Communitygithub.com

melonisjs/melonjs-performance

Optimisez les performances de votre jeu melonJS : gestion du pool d'objets, du batching, des atlas, du baking CanvasRenderTarget, de l'instancing, du culling et du plugin de débogage.

Qu'est-ce que melonjs-performance ?

Cette compétence est conçue pour les développeurs de jeux vidéo utilisant le moteur melonJS, confrontés à des baisses de framerate, une allocation mémoire excessive ou le besoin de faire évoluer leur jeu avec un grand nombre d'objets. Elle fournit des directives précises pour optimiser les performances en utilisant des techniques avancées comme le « object pooling » (via `pool.register` et `pool.pull`), le batching des appels de rendu (draw calls), l'utilisation d'atlas de textures, le « baking » avec `CanvasRenderTarget`, l'instancing, le culling et la gestion de `alwaysUpdate` et `inViewport`. La compétence explique également comment utiliser le plugin de débogage intégré pour profiler le jeu et identifier les goulets d'étranglement. Elle est principalement destinée à être utilisée avec Claude Code, mais les concepts sont applicables à tout environnement de développement melonJS. Les déclencheurs clés incluent les termes liés à la performance (fps, lag, mémoire, etc.), ce qui permet à l'agent de proposer automatiquement cette compétence lorsque le développeur mentionne un problème de performance.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/melonjs/melonJS/tree/master/packages/melonjs/skills/melonjs-performance

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait melonjs-performance ?

Utilisez cette compétence lorsqu'un jeu melonJS chute en images par seconde, alloue de manière excessive, ou doit passer à l'échelle avec de nombreux objets. Elle couvre le pool d'objets, le batching des appels de rendu, les atlas, le baking avec CanvasRenderTarget, l'instancing, le culling et alwaysUpdate, le plugin de débogage, et l'identification des coûts réels. Déclencheurs : performance, lent, frame rate, fps, lag, pool, pool.register, pool.pull, batching, appels de rendu, InstancedMesh, culling, alwaysUpdate, inViewport, CanvasRenderTarget, optimiser, profilage, plugin de débogage, mémoire.

Pool d'objets

Utilisez pool.register pour enregistrer une classe d'objet, puis pool.pull pour récupérer une instance réutilisée au lieu d'utiliser new. N'oubliez pas d'appeler pool.push(sprite) lorsque l'objet n'est plus nécessaire pour le remettre dans le pool. Cela réduit considérablement les allocations de mémoire et le travail du garbage collector.

Batching des appels de rendu

Regroupez les sprites partageant la même texture et les mêmes paramètres de rendu pour minimiser le nombre d'appels de rendu (draw calls). Utilisez des atlas de textures pour combiner plusieurs sprites en une seule image, ce qui améliore le batching. Le batching est effectué automatiquement par melonJS pour les objets compatibles, mais vous pouvez favoriser ce comportement en organisant vos sprites par texture.

Baking avec CanvasRenderTarget

Pour les éléments statiques (décors, fonds), pré-calculez le rendu sur un CanvasRenderTarget pour éviter de les redessiner à chaque frame. Cela est particulièrement utile pour les grandes cartes de tuiles ou les arrière-plans complexes.

Instancing avec InstancedMesh

Pour les objets répétés en grand nombre (particules, projectiles, ennemis), utilisez InstancedMesh pour dessiner plusieurs instances d'un même maillage avec un seul appel de rendu. Cela réduit considérablement la charge sur le processeur graphique.

Culling et alwaysUpdate

  • Culling : Vérifiez inViewport pour savoir si un objet est dans la zone visible de la caméra. Si ce n'est pas le cas, vous pouvez désactiver sa mise à jour ou son rendu pour économiser des ressources.
  • alwaysUpdate : Par défaut, melonJS met à jour tous les objets même s'ils sont hors de la vue. Définissez alwaysUpdate = false sur les objets qui n'ont pas besoin d'être mis à jour en dehors de la zone visible. Attention : cela peut affecter le comportement des objets qui doivent se déplacer même hors écran (ex. : vagues d'ennemis).

Plugin de débogage

Activez le plugin de débogage (par exemple, me.debug.Plugin) pour profiler votre jeu. Il affiche des informations en temps réel : nombre d'objets, appels de rendu, mémoire, temps de trame. Utilisez-le pour identifier les goulets d'étranglement (ex. : trop d'objets actifs, trop d'appels de rendu).

Identification des coûts réels

  • CPU : Mesurez le temps passé dans la boucle de mise à jour (update) et la boucle de rendu (draw). Si update est lent, vérifiez les algorithmes et le pool d'objets. Si draw est lent, vérifiez le batching, le culling et l'instancing.
  • Mémoire : Surveillez le nombre d'allocations et la fréquence du garbage collector. Un pool d'objets bien configuré réduit la pression mémoire.
  • GPU : Utilisez InstancedMesh et les atlas de textures pour réduire le nombre d'appels de rendu et la bande passante mémoire.

Exemple pratique

// Enregistrement d'une classe de sprite
me.pool.register("ennemi", EnnemiSprite);

// Création d'une instance depuis le pool
let ennemi = me.pool.pull("ennemi", x, y);
me.game.world.addChild(ennemi);

// Lorsque l'ennemi est détruit
me.game.world.removeChild(ennemi);
me.pool.push(ennemi);

Pour le batching, assurez-vous que tous les sprites d'une même texture sont regroupés :

// Exemple de chargement d'un atlas de textures
me.loader.preload([{
  name: "monAtlas",
  type: "image",
  src: "data/img/atlas.png"
}]);

Liens utiles

Individual skills in this repo

This repo contains 10 individual skills — each has its own dedicated page.

melonjs/melonjs-3d

Use this skill for anything 3D or 2.5D in melonJS — Camera3d, Mesh, InstancedMesh, Sprite3d billboards, Light3d, ground shadows, glTF/GLB scenes, and depth sorting. Covers the Y-down/+Z-forward convention that is the inverse of OpenGL, the cameraClass opt-in, clip planes, and what does not work on the Canvas fallback. Triggers on: Camera3d, Mesh, InstancedMesh, Sprite3d, Light3d, billboard, glTF, glb, 3D, 2.5D, depth, cameraClass, fov, setClipPlanes, setFog, fog, distance fog, height fog, heightFalloff, transparent, transparency, alpha, blendMode, fade, castGroundShadow, lit.

melonjs/melonjs-3d-assets

Use this skill when loading 3D models into melonJS — glTF and GLB scenes, OBJ/MTL models, materials, imported lights, node animation, ground shadows and GPU instancing. Covers level.load options including the async flag, the rightHanded conversion, and exactly what the loader does and does not support. Triggers on: glTF, gltf, glb, OBJ, MTL, 3D model, getGLTF, getOBJ, getMTL, GLTFModel, GLTFScene, level.load glb, rightHanded, lightIntensityScale, castGroundShadow, shadowGroundY, EXT_mesh_gpu_instancing, KHR_lights_punctual, skinning, Blender export, 3D asset.

melonjs/melonjs-camera-and-drawing

Use this skill for camera control and immediate-mode drawing in melonJS — following a target, viewport bounds, shake and fade, secondary cameras, and drawing shapes, lines and gradients inside a custom draw(). Covers world versus screen coordinate conversion, clipping and masking, and baking with CanvasRenderTarget. Triggers on: Camera2d, viewport, follow, setBounds, shake, fadeIn, fadeOut, worldToLocal, localToWorld, colorMatrix, renderer.fill, renderer.stroke, Rect, Ellipse, Polygon, Line, Gradient, clipRect, mask, CanvasRenderTarget, NoiseTexture2d.

melonjs/melonjs-effects-and-shaders

Use this skill for post-processing effects, custom shaders, blend modes and colour grading in melonJS. Covers the built-in ShaderEffect presets, addPostEffect on renderables and cameras, writing a custom dual-language GLSL/WGSL effect, the screen_texture builtins, and why effects silently do nothing on the Canvas fallback. Triggers on: ShaderEffect, addPostEffect, removePostEffect, getPostEffect, VignetteEffect, GlowEffect, BlurEffect, PixelateEffect, ScanlineEffect, shader, GLSL, WGSL, uniform, setUniform, setTexture, setTime, blendMode, colorMatrix, screen_texture, toFrameTexture, post effect, filter.

melonjs/melonjs-loading-assets

Use this skill for loading and managing game assets in melonJS — the resource descriptor format, the full asset type list, preload versus load, retrieving loaded assets, base URLs and cross-origin settings, and the loading screen. Triggers on: loader, loader.preload, loader.load, resources, getImage, getJSON, getTMX, getGLTF, getVideo, getFont, setBaseURL, setOptions, crossOrigin, withCredentials, credentials, cookies, authenticated assets, CORS, asset, preload, LOADER_COMPLETE, loading screen, unload.

melonjs/melonjs-physics

Use this skill for collision, physics bodies, movement, and spatial queries in melonJS — the built-in SAT world and the planck/matter adapters. Covers bodyDef vs Body, collision types and masks, the collision callback family and their firing rules, raycast/queryAABB/querySphere, and the behaviour differences between adapters. Triggers on: Body, bodyDef, collision, collisionType, collisionMask, onCollision, onCollisionStart, onCollisionActive, raycast, queryAABB, querySphere, PlanckAdapter, MatterAdapter, gravity, velocity, applyForce, isGrounded, SAT.

melonjs/melonjs-renderables

Use this skill when subclassing Renderable, writing a custom draw() method, handling pointer or click events on game objects, applying post effects and shaders, or controlling draw order. Covers the pos-relative draw contract, isKinematic and input, addPostEffect vs the deprecated shader property, and z-ordering. Triggers on: Renderable, extends Renderable, draw(, update(, isKinematic, pointerEvent, registerPointerEvent, onClick, addPostEffect, removePostEffect, ShaderEffect, addChild, z-order, anchorPoint, floating.

melonjs/melonjs-renderer-backends

Use this skill when a feature works on one machine and not another, when choosing or pinning a renderer, or when writing code that must degrade gracefully. Covers the WebGPU to WebGL 2 to Canvas fallback ladder, what each backend supports, capability detection, and the subsystems that warn once and then stop working on Canvas. Triggers on: video.AUTO, video.WEBGPU, video.WEBGL, video.CANVAS, renderer.type, supportsDepthBuffer, shaderLanguage, WebGPU, WebGL2, Canvas fallback, context loss, backen

melonjs/melonjs-scenes-and-state

Use this skill for scene structure and game flow in melonJS — Stage subclasses, the state manager, transitions, pausing, the update loop, timers and tweens. Covers onResetEvent versus the constructor, state.set before state.change, the camera and world lifecycle per stage, and pause-aware timing. Triggers on: Stage, state, state.set, state.change, state.transition, state.pause, onResetEvent, onDestroyEvent, onActivateEvent, onDeactivateEvent, PLAY, MENU, LOADING, update loop, GAME_UPDATE, timer, setTimeout, setInterval, Tween, freeze.

melonjs/melonjs-ui-and-text

Use this skill for HUDs, buttons, menus, dialogue panels and on-screen text in melonJS. Covers UIBaseElement/UISpriteElement/UITextButton, Draggable and DropTarget, the floating screen-space container pattern, Text and BitmapText, web font loading, and NineSliceSprite panels. Triggers on: UI, HUD, button, UIBaseElement, UISpriteElement, UITextButton, Draggable, DropTarget, menu, dialogue, Text, BitmapText, font, fontface, wordWrapWidth, NineSliceSprite, score display, floating.

Skills associés