diff --git a/danmaku/src/main/java/master/flame/danmaku/controller/CacheManagingDrawTask.java b/danmaku/src/main/java/master/flame/danmaku/controller/CacheManagingDrawTask.java index af83a9bc9..83828d3a1 100644 --- a/danmaku/src/main/java/master/flame/danmaku/controller/CacheManagingDrawTask.java +++ b/danmaku/src/main/java/master/flame/danmaku/controller/CacheManagingDrawTask.java @@ -251,6 +251,17 @@ public class CacheManagingDrawTask extends DrawTask { } } + @Override + public void buildDanmakuCache(BaseDanmaku danmaku) { + if (danmaku == null) { + return; + } + CacheHandler handler = mHandler; + if (handler != null) { + handler.addDanmakuAndBuildCache(danmaku); + } + } + public void invalidateDanmaku(BaseDanmaku danmaku) { if (mHandler != null) { mHandler.requestCancelCaching(); @@ -375,7 +386,7 @@ public class CacheManagingDrawTask extends DrawTask { private boolean push(BaseDanmaku item, int itemSize, boolean forcePush) { if (itemSize > 0) clearTimeOutAndFilteredCaches(itemSize, forcePush); - this.mCaches.addItem(item); + mCaches.addItem(item); mRealSize += itemSize; return true; } @@ -391,16 +402,6 @@ public class CacheManagingDrawTask extends DrawTask { return ACTION_CONTINUE; } } - if (!mEndFlag) { - synchronized (mDrawingNotify) { - try { - mDrawingNotify.wait(30); - } catch (InterruptedException e) { - e.printStackTrace(); - return ACTION_BREAK; - } - } - } entryRemoved(val); return ACTION_REMOVE; } else { @@ -839,7 +840,11 @@ public class CacheManagingDrawTask extends DrawTask { } } - buildCache(item, false); + cache = item.getDrawingCache(); + if (cache == null || cache.get() == null) { + buildCache(item, false); + } + if (!repositioned) { long consumingTime = SystemClock.uptimeMillis() - startTime; if (consumingTime >= DanmakuFactory.COMMON_DANMAKU_DURATION * mScreenSize) { @@ -921,7 +926,10 @@ public class CacheManagingDrawTask extends DrawTask { } IDrawingCache cache = danmaku.getDrawingCache(); if (cache == null || cache.get() == null) { - buildCache(danmaku, true); + cache = danmaku.getDrawingCache(); + if (cache == null || cache.get() == null) { + buildCache(danmaku, true); + } } } diff --git a/danmaku/src/main/java/master/flame/danmaku/danmaku/model/ICacheManager.java b/danmaku/src/main/java/master/flame/danmaku/danmaku/model/ICacheManager.java index f8f21ae4a..e4e033b64 100644 --- a/danmaku/src/main/java/master/flame/danmaku/danmaku/model/ICacheManager.java +++ b/danmaku/src/main/java/master/flame/danmaku/danmaku/model/ICacheManager.java @@ -22,4 +22,6 @@ package master.flame.danmaku.danmaku.model; public interface ICacheManager { void addDanmaku(BaseDanmaku danmaku); + + void buildDanmakuCache(BaseDanmaku danmaku); } diff --git a/danmaku/src/main/java/master/flame/danmaku/danmaku/model/android/DrawingCacheHolder.java b/danmaku/src/main/java/master/flame/danmaku/danmaku/model/android/DrawingCacheHolder.java index 72796b021..c17e943db 100644 --- a/danmaku/src/main/java/master/flame/danmaku/danmaku/model/android/DrawingCacheHolder.java +++ b/danmaku/src/main/java/master/flame/danmaku/danmaku/model/android/DrawingCacheHolder.java @@ -56,6 +56,7 @@ public class DrawingCacheHolder { } public synchronized void recycle() { + canvas = null; Bitmap bitmapReserve = bitmap; bitmap = null; width = height = 0; diff --git a/danmaku/src/main/java/master/flame/danmaku/danmaku/renderer/android/DanmakuRenderer.java b/danmaku/src/main/java/master/flame/danmaku/danmaku/renderer/android/DanmakuRenderer.java index 56a6502b5..eb949872f 100644 --- a/danmaku/src/main/java/master/flame/danmaku/danmaku/renderer/android/DanmakuRenderer.java +++ b/danmaku/src/main/java/master/flame/danmaku/danmaku/renderer/android/DanmakuRenderer.java @@ -161,6 +161,11 @@ public class DanmakuRenderer extends Renderer { if (drawItem.lines == null && drawItem.getBottom() > disp.getHeight()) { return ACTION_CONTINUE; } + if (drawItem.getDrawingCache() == null || drawItem.getDrawingCache().get() == null) { + if (mCacheManager != null) { + mCacheManager.buildDanmakuCache(drawItem); + } + } int renderingType = drawItem.draw(disp); if (renderingType == IRenderer.CACHE_RENDERING) { renderingState.cacheHitCount++; diff --git a/danmaku/src/main/java/master/flame/danmaku/danmaku/util/DanmakuUtils.java b/danmaku/src/main/java/master/flame/danmaku/danmaku/util/DanmakuUtils.java index aa6130f1f..05cdfe3ed 100644 --- a/danmaku/src/main/java/master/flame/danmaku/danmaku/util/DanmakuUtils.java +++ b/danmaku/src/main/java/master/flame/danmaku/danmaku/util/DanmakuUtils.java @@ -84,7 +84,7 @@ public class DanmakuUtils { else if (val < 0) return -1; int r = obj1.index - obj2.index; if (r != 0) return r < 0 ? -1 : 1; - r = obj1.hashCode() - obj1.hashCode(); + r = obj1.hashCode() - obj2.hashCode(); return r; }