canvasframework 0.5.1 → 0.5.2

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.
@@ -155,6 +155,15 @@ class CanvasFramework {
155
155
  constructor(canvasId, options = {}) {
156
156
  // ✅ AJOUTER: Démarrer le chronomètre
157
157
  const startTime = performance.now();
158
+
159
+ this.metrics = {
160
+ initTime: 0,
161
+ firstRenderTime: null,
162
+ firstInteractionTime: null,
163
+ totalStartupTime: null
164
+ };
165
+ this._firstRenderDone = false;
166
+ this._startupStartTime = startTime;
158
167
 
159
168
  // ✅ Créer automatiquement le canvas
160
169
  this.canvas = document.createElement('canvas');
@@ -2649,54 +2658,86 @@ class CanvasFramework {
2649
2658
  }
2650
2659
  }
2651
2660
 
2652
- startRenderLoop() {
2653
- let lastScrollOffset = this.scrollOffset;
2654
- let lastRenderMode = 'full';
2655
-
2656
- const render = () => {
2657
- if (!this._splashFinished) {
2658
- requestAnimationFrame(render);
2659
- return;
2660
- }
2661
-
2662
- // Vérifier le scroll
2663
- const scrollChanged = Math.abs(this.scrollOffset - lastScrollOffset) > 0.1;
2664
- lastScrollOffset = this.scrollOffset;
2665
-
2666
- // Décider du mode de rendu
2667
- let renderMode = 'full';
2668
-
2669
- if (this.optimizationEnabled &&
2670
- this.dirtyComponents.size > 0 &&
2671
- !this.isDragging &&
2672
- Math.abs(this.scrollVelocity) < 0.5 &&
2673
- !scrollChanged &&
2674
- this.dirtyComponents.size < 3) { // ✅ SEULEMENT si très peu de composants sales
2675
- renderMode = 'dirty';
2676
- }
2677
-
2678
- // IMPORTANT : NE PAS clear tout le canvas au début
2679
- // On ne nettoie que si on change de mode ou si c'est nécessaire
2680
-
2681
- if (renderMode === 'full' || lastRenderMode !== renderMode) {
2682
- // Rendu complet : clear tout
2683
- this.ctx.fillStyle = this.backgroundColor || '#ffffff';
2684
- this.ctx.fillRect(0, 0, this.width, this.height);
2685
- this.renderFull();
2686
- } else {
2687
- // Rendu optimisé : ne clear QUE les zones des composants sales
2688
- this._renderDirtyComponents();
2689
- }
2690
-
2691
- lastRenderMode = renderMode;
2692
-
2693
- // ... FPS et debug ...
2694
-
2695
- requestAnimationFrame(render);
2696
- };
2697
-
2698
- render();
2699
- }
2661
+ startRenderLoop() {
2662
+ let lastScrollOffset = this.scrollOffset;
2663
+ let lastRenderMode = 'full';
2664
+
2665
+ const render = () => {
2666
+ if (!this._splashFinished) {
2667
+ requestAnimationFrame(render);
2668
+ return;
2669
+ }
2670
+
2671
+ // Vérifier le scroll
2672
+ const scrollChanged = Math.abs(this.scrollOffset - lastScrollOffset) > 0.1;
2673
+ lastScrollOffset = this.scrollOffset;
2674
+
2675
+ // Décider du mode de rendu
2676
+ let renderMode = 'full';
2677
+
2678
+ if (this.optimizationEnabled &&
2679
+ this.dirtyComponents.size > 0 &&
2680
+ !this.isDragging &&
2681
+ Math.abs(this.scrollVelocity) < 0.5 &&
2682
+ !scrollChanged &&
2683
+ this.dirtyComponents.size < 3) {
2684
+ renderMode = 'dirty';
2685
+ }
2686
+
2687
+ if (renderMode === 'full' || lastRenderMode !== renderMode) {
2688
+ this.ctx.fillStyle = this.backgroundColor || '#ffffff';
2689
+ this.ctx.fillRect(0, 0, this.width, this.height);
2690
+ this.renderFull();
2691
+ } else {
2692
+ this._renderDirtyComponents();
2693
+ }
2694
+
2695
+ lastRenderMode = renderMode;
2696
+
2697
+ // ✅ AJOUTER : Calcul et affichage du FPS
2698
+ this._frames++;
2699
+ const now = performance.now();
2700
+ const elapsed = now - this._lastFpsTime;
2701
+
2702
+ if (elapsed >= 1000) {
2703
+ this.fps = Math.round((this._frames * 1000) / elapsed);
2704
+ this._frames = 0;
2705
+ this._lastFpsTime = now;
2706
+ }
2707
+
2708
+ // ✅ AJOUTER : Afficher le FPS si activé
2709
+ if (this.showFps) {
2710
+ this.ctx.save();
2711
+ this.ctx.fillStyle = 'rgba(0, 0, 0, 0.7)';
2712
+ this.ctx.fillRect(10, 10, 100, 40);
2713
+ this.ctx.fillStyle = '#00ff00';
2714
+ this.ctx.font = 'bold 20px monospace';
2715
+ this.ctx.textAlign = 'left';
2716
+ this.ctx.textBaseline = 'top';
2717
+ this.ctx.fillText(`FPS: ${this.fps}`, 20, 20);
2718
+ this.ctx.restore();
2719
+ }
2720
+
2721
+ // ✅ AJOUTER : Indicateurs de débogage si activés
2722
+ if (this.debbug) {
2723
+ this.drawOverflowIndicators();
2724
+ }
2725
+
2726
+ // ✅ AJOUTER : Marquer le premier rendu
2727
+ if (!this._firstRenderDone) {
2728
+ this._markFirstRender();
2729
+ }
2730
+
2731
+ // ✅ AJOUTER : Mettre à jour l'inertie si nécessaire
2732
+ if (Math.abs(this.scrollVelocity) > 0.1 && !this.isDragging) {
2733
+ this.scrollWorker.postMessage({ type: 'UPDATE_INERTIA' });
2734
+ }
2735
+
2736
+ requestAnimationFrame(render);
2737
+ };
2738
+
2739
+ render();
2740
+ }
2700
2741
 
2701
2742
  // 3. Ajoutez une méthode renderFull() optimisée
2702
2743
  renderFull() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "canvasframework",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
4
4
  "description": "Canvas-based cross-platform UI framework (Material & Cupertino)",
5
5
  "type": "module",
6
6
  "main": "./index.js",