@Override
 public void invalidateDanmaku(BaseDanmaku item, boolean remeasure) {
   if (mCacheManager == null) {
     super.invalidateDanmaku(item, remeasure);
     return;
   }
   mCacheManager.invalidateDanmaku(item, remeasure);
 }
 @Override
 public void quit() {
   super.quit();
   reset();
   mRenderer.setCacheManager(null);
   if (mCacheManager != null) {
     mCacheManager.end();
     mCacheManager = null;
   }
   NativeBitmapFactory.releaseLibs();
 }
 @Override
 protected void onDanmakuRemoved(BaseDanmaku danmaku) {
   super.onDanmakuRemoved(danmaku);
   if (danmaku.hasDrawingCache()) {
     if (danmaku.cache.hasReferences()) {
       danmaku.cache.decreaseReference();
     } else {
       danmaku.cache.destroy();
     }
     danmaku.cache = null;
   }
 }
 @Override
 public void start() {
   super.start();
   NativeBitmapFactory.loadLibs();
   if (mCacheManager == null) {
     mCacheManager = new CacheManager(mMaxCacheSize, MAX_CACHE_SCREEN_SIZE);
     mCacheManager.begin();
     mRenderer.setCacheManager(mCacheManager);
   } else {
     mCacheManager.resume();
   }
 }
 @Override
 public void addDanmaku(BaseDanmaku danmaku) {
   super.addDanmaku(danmaku);
   if (mCacheManager == null) return;
   mCacheManager.addDanmaku(danmaku);
 }
 @Override
 public void seek(long mills) {
   super.seek(mills);
   mCacheManager.seek(mills);
 }