diff --git a/src/extensions/renderer/canvas/index.js b/src/extensions/renderer/canvas/index.js
index <HASH>..<HASH> 100644
--- a/src/extensions/renderer/canvas/index.js
+++ b/src/extensions/renderer/canvas/index.js
@@ -94,6 +94,25 @@ function CanvasRenderer( options ){
         // then keep cached ele texture
       } else {
         r.data.eleTxrCache.invalidateElement( ele );
+
+        // NB this block of code should not be ported to 3.3 (unstable branch).
+        // - This check is unneccesary in 3.3 as caches will be stored without respect to opacity.
+        // - This fix may result in lowered performance for compound graphs.
+        // - Ref : Opacity of child node is not updated for certain zoom levels after parent opacity is overriden #2078
+        if( ele.isParent() && de['style'] ){
+          var op1 = rs.prevParentOpacity;
+          var op2 = ele.pstyle('opacity').pfValue;
+
+          rs.prevParentOpacity = op2;
+
+          if( op1 !== op2 ){
+            var descs = ele.descendants();
+
+            for( var j = 0; j < descs.length; j++ ){
+              r.data.eleTxrCache.invalidateElement( descs[j] );
+            }
+          }
+        }
       }
     }
For each 'style' dirty event, w.r.t. the element texture cache, manually diff the parent opacity.  Invalidate the descendants when the diff is non-empty.

Ref : Opacity of child node is not updated for certain zoom levels after parent opacity is overriden #<I>