canvaskit 的一次 drawPicture 繪製棧 skimage 其實緩存了

 
canvaskit.wasm:1 Uncaught RuntimeError: table index is out of bounds at (anonymous namespace)::HashTraits::GetKey(SkResourceCache::Rec const*) (canvaskit.wasm) at SkTHashTable<SkResourceCache::Rec*, SkResourceCache::Key, (anonymous namespace)::HashTraits>::find(SkResourceCache::Key const&) const (canvaskit.wasm) at SkResourceCache::find(SkResourceCache::Key const&, bool (*)(SkResourceCache::Rec const&, void*), void*) (canvaskit.wasm) at SkResourceCache::Find(SkResourceCache::Key const&, bool (*)(SkResourceCache::Rec const&, void*), void*) (canvaskit.wasm) at SkBitmapCache::Find(SkBitmapCacheDesc const&, SkBitmap*) (canvaskit.wasm) at SkImage_Lazy::getROPixels(GrDirectContext*, SkBitmap*, SkImage::CachingHint) const (canvaskit.wasm) at SkImage_Lazy::lockTextureProxyView(GrRecordingContext*, GrImageTexGenPolicy, GrMipmapped) const (canvaskit.wasm) at SkImage_Lazy::onAsView(GrRecordingContext*, GrMipmapped, GrImageTexGenPolicy) const (canvaskit.wasm) at SkImage_Base::asView(GrRecordingContext*, GrMipmapped, GrImageTexGenPolicy) const (canvaskit.wasm) at (anonymous namespace)::draw_image(GrRecordingContext*, skgpu::v1::SurfaceDrawContext*, GrClip const*, SkMatrixProvider const&, SkPaint const&, SkImage_Base const&, SkRect const&, SkRect const&, SkPoint const*, SkMatrix const&, GrQuadAAFlags, SkCanvas::SrcRectConstraint, SkSamplingOptions, SkTileMode) (canvaskit.wasm)
  $(anonymous namespace)::HashTraits::GetKey(SkResourceCache::Rec const*) @ canvaskit.wasm:1
  $SkTHashTable<SkResourceCache::Rec*, SkResourceCache::Key, (anonymous namespace)::HashTraits>::find(SkResourceCache::Key const&) const @ canvaskit.wasm:1
  $SkResourceCache::find(SkResourceCache::Key const&, bool (*)(SkResourceCache::Rec const&, void*), void*) @ canvaskit.wasm:1
  $SkResourceCache::Find(SkResourceCache::Key const&, bool (*)(SkResourceCache::Rec const&, void*), void*) @ canvaskit.wasm:1
  $SkBitmapCache::Find(SkBitmapCacheDesc const&, SkBitmap*) @ canvaskit.wasm:1
  $SkImage_Lazy::getROPixels(GrDirectContext*, SkBitmap*, SkImage::CachingHint) const @ canvaskit.wasm:1
  $SkImage_Lazy::lockTextureProxyView(GrRecordingContext*, GrImageTexGenPolicy, GrMipmapped) const @ canvaskit.wasm:1
  $SkImage_Lazy::onAsView(GrRecordingContext*, GrMipmapped, GrImageTexGenPolicy) const @ canvaskit.wasm:1
  $SkImage_Base::asView(GrRecordingContext*, GrMipmapped, GrImageTexGenPolicy) const @ canvaskit.wasm:1
  $(anonymous namespace)::draw_image(GrRecordingContext*, skgpu::v1::SurfaceDrawContext*, GrClip const*, SkMatrixProvider const&, SkPaint const&, SkImage_Base const&, SkRect const&, SkRect const&, SkPoint const*, SkMatrix const&, GrQuadAAFlags, SkCanvas::SrcRectConstraint, SkSamplingOptions, SkTileMode) @ canvaskit.wasm:1
  $skgpu::v1::Device::drawImageQuad(SkImage const*, SkRect const*, SkRect const*, SkPoint const*, GrQuadAAFlags, SkMatrix const*, SkSamplingOptions const&, SkPaint const&, SkCanvas::SrcRectConstraint) @ canvaskit.wasm:1
  $skgpu::v1::Device::drawImageRect(SkImage const*, SkRect const*, SkRect const&, SkSamplingOptions const&, SkPaint const&, SkCanvas::SrcRectConstraint) @ canvaskit.wasm:1
  $SkCanvas::onDrawImage2(SkImage const*, float, float, SkSamplingOptions const&, SkPaint const*) @ canvaskit.wasm:1
  $SkCanvas::drawImage(SkImage const*, float, float, SkSamplingOptions const&, SkPaint const*) @ canvaskit.wasm:1
  $void SkRecords::Draw::draw<SkRecords::DrawImage>(SkRecords::DrawImage const&) @ canvaskit.wasm:1
  $void SkRecords::Draw::operator()<SkRecords::DrawImage>(SkRecords::DrawImage const&) @ canvaskit.wasm:1
  $decltype(fp((SkRecords::NoOp)())) SkRecord::Record::visit<SkRecords::Draw&>(SkRecords::Draw&) const @ canvaskit.wasm:1
  $decltype(fp0((SkRecords::NoOp)())) SkRecord::visit<SkRecords::Draw&>(int, SkRecords::Draw&) const @ canvaskit.wasm:1
  $SkRecordDraw(SkRecord const&, SkCanvas*, SkPicture const* const*, SkDrawable* const*, int, SkBBoxHierarchy const*, SkPicture::AbortCallback*) @ canvaskit.wasm:1
  $SkBigPicture::playback(SkCanvas*, SkPicture::AbortCallback*) const @ canvaskit.wasm:1
  $SkCanvas::onDrawPicture(SkPicture const*, SkMatrix const*, SkPaint const*) @ canvaskit.wasm:1
  $SkCanvas::drawPicture(SkPicture const*, SkMatrix const*, SkPaint const*) @ canvaskit.wasm:1
  $SkCanvas::drawPicture(SkPicture const*) @ canvaskit.wasm:1
  $SkCanvas::drawPicture(sk_sp<SkPicture> const&) @ canvaskit.wasm:1
  $EmBindInit_Skia::EmBindInit_Skia()::$_36::operator()(SkCanvas&, sk_sp<SkPicture> const&) const @ canvaskit.wasm:1
  $EmBindInit_Skia::EmBindInit_Skia()::$_36::__invoke(SkCanvas&, sk_sp<SkPicture> const&) @ canvaskit.wasm:1
  $emscripten::internal::FunctionInvoker<void (*)(SkCanvas&, sk_sp<SkPicture> const&), void, SkCanvas&, sk_sp<SkPicture> const&>::invoke(void (**)(SkCanvas&, sk_sp<SkPicture> const&), SkCanvas*, sk_sp<SkPicture>*) @ canvaskit.wasm:1
  (anonymous) @ canvaskit.js:7118
  CanvasKit.Canvas.drawPicture @ canvaskit.js:1356
  animation @ webgl.earth.html:241
  draw @ webgl.earth.html:95
  requestAnimationFrame (async)

 

 

出錯3:

atomic:952 Uncaught RuntimeError: memory access out of bounds
    at int std::__2::__cxx_atomic_load<int>(std::__2::__cxx_atomic_base_impl<int> const*, int std::__2::__cxx_atomic_load<int>(std::__2::__cxx_atomic_base_impl<int> const*, std::__2::memory_order) (atomic:952)
    at std::__2::__atomic_base<int, false>::load(std::__2::memory_order) std::__2::__atomic_base<int, false>::load(std::__2::memory_order) const (atomic:1582)
    at SkRefCntBase::getRefCnt() SkRefCntBase::getRefCnt() const (SkRefCnt.h:84)
    at SkRefCntBase::unref() SkRefCntBase::unref() const (SkRefCnt.h:72)
    at void void SkSafeUnref<SkPicture>(SkPicture*) (SkRefCnt.h:151)
    at sk_sp<SkPicture>::~sk_sp() (SkRefCnt.h:266)
    at void void emscripten::internal::raw_destructor<sk_sp<SkPicture>>(sk_sp<SkPicture>*) (bind.h:527)
    at runDestructor (canvaskit.js:8252:27)
    at releaseClassHandle (canvaskit.js:8261:9)
    at ClassHandle.ClassHandle_delete [as delete] (canvaskit.js:8495:7)
$int std::__2::__cxx_atomic_load<int>(std::__2::__cxx_atomic_base_impl<int> const*, std::__2::memory_order) @ atomic:952
$std::__2::__atomic_base<int, false>::load(std::__2::memory_order) const @ atomic:1582
$SkRefCntBase::getRefCnt() const @ SkRefCnt.h:84
$SkRefCntBase::unref() const @ SkRefCnt.h:72
$void SkSafeUnref<SkPicture>(SkPicture*) @ SkRefCnt.h:151
$sk_sp<SkPicture>::~sk_sp() @ SkRefCnt.h:266
$void emscripten::internal::raw_destructor<sk_sp<SkPicture>>(sk_sp<SkPicture>*) @ bind.h:527
runDestructor @ canvaskit.js:8252
releaseClassHandle @ canvaskit.js:8261
ClassHandle_delete @ canvaskit.js:8495
animation @ webgl.earth.html:220
draw @ webgl.earth.html:261
requestAnimationFrame (async)
draw @ webgl.earth.html:263
webgl.earth.html:248 [Violation] 'requestAnimationFrame' handler took 128ms

 

上面的遞歸棧不停調用。

出錯4

  $process_data(png_struct_def*, png_info_def*, SkStream*, void*, unsigned long, unsigned long) @ SkPngCodec.cpp:151
  invoke_iiiiiii @ canvaskit.js:12447
  $SkPngCodec::processData() @ SkPngCodec.cpp:254
  $SkPngNormalDecoder::decodeAllRows(void*, unsigned long, int*) @ SkPngCodec.cpp:550
  $SkPngCodec::onGetPixels(SkImageInfo const&, void*, unsigned long, SkCodec::Options const&, int*) @ SkPngCodec.cpp:1180
  $SkCodec::getPixels(SkImageInfo const&, void*, unsigned long, SkCodec::Options const*) @ SkCodec.cpp:468
  $SkCodec::getPixels(SkPixmap const&, SkCodec::Options const*) @ SkCodec.h:388
  $SkCodecImageGenerator::getPixels(SkImageInfo const&, void*, unsigned long, SkCodec::Options const*)::$_0::operator()(SkPixmap const&) const @ SkCodecImageGenerator.cpp:68
  $bool SkPixmapPriv::Orient<SkCodecImageGenerator::getPixels(SkImageInfo const&, void*, unsigned long, SkCodec::Options const*)::$_0&>(SkPixmap const&, SkEncodedOrigin, SkCodecImageGenerator::getPixels(SkImageInfo const&, void*, unsigned long, SkCodec::Options const*)::$_0&) @ SkPixmapPriv.h:49
  $SkCodecImageGenerator::getPixels(SkImageInfo const&, void*, unsigned long, SkCodec::Options const*) @ SkCodecImageGenerator.cpp:79
  $SkCodecImageGenerator::onGetPixels(SkImageInfo const&, void*, unsigned long, SkImageGenerator::Options const&) @ SkCodecImageGenerator.cpp:84
  $SkImageGenerator::getPixels(SkImageInfo const&, void*, unsigned long) @ SkImageGenerator.cpp:30
  $SkImageGenerator::getPixels(SkPixmap const&) @ SkImageGenerator.h:98
  $SkImage_Lazy::getROPixels(GrDirectContext*, SkBitmap*, SkImage::CachingHint) const @ SkImage_Lazy.cpp:158
  $SkImage_Lazy::lockTextureProxyView(GrRecordingContext*, GrImageTexGenPolicy, GrMipmapped) const @ SkImage_Lazy.cpp:551
  $SkImage_Lazy::onAsView(GrRecordingContext*, GrMipmapped, GrImageTexGenPolicy) const @ SkImage_Lazy.cpp:302
  $SkImage_Base::asView(GrRecordingContext*, GrMipmapped, GrImageTexGenPolicy) const @ SkImage.cpp:328
  $(anonymous namespace)::draw_image(GrRecordingContext*, skgpu::v1::SurfaceDrawContext*, GrClip const*, SkMatrixProvider const&, SkPaint const&, SkImage_Base const&, SkRect const&, SkRect const&, SkPoint const*, SkMatrix const&, GrQuadAAFlags, SkCanvas::SrcRectConstraint, SkSamplingOptions, SkTileMode) @ Device_drawTexture.cpp:435
  $skgpu::v1::Device::drawImageQuad(SkImage const*, SkRect const*, SkRect const*, SkPoint const*, GrQuadAAFlags, SkMatrix const*, SkSamplingOptions const&, SkPaint const&, SkCanvas::SrcRectConstraint) @ Device_drawTexture.cpp:826
  $skgpu::v1::Device::drawImageRect(SkImage const*, SkRect const*, SkRect const&, SkSamplingOptions const&, SkPaint const&, SkCanvas::SrcRectConstraint) @ Device.cpp:876
  $SkCanvas::onDrawImage2(SkImage const*, float, float, SkSamplingOptions const&, SkPaint const*) @ SkCanvas.cpp:2336
  $SkCanvas::drawImage(SkImage const*, float, float, SkSamplingOptions const&, SkPaint const*) @ SkCanvas.cpp:2391
  $void SkRecords::Draw::draw<SkRecords::DrawImage>(SkRecords::DrawImage const&) @ SkRecordDraw.cpp:117
  $void SkRecords::Draw::operator()<SkRecords::DrawImage>(SkRecords::DrawImage const&) @ SkRecordDraw.h:63
  $decltype(fp((SkRecords::NoOp)())) SkRecord::Record::visit<SkRecords::Draw&>(SkRecords::Draw&) const @ SkRecord.h:150
  $decltype(fp0((SkRecords::NoOp)())) SkRecord::visit<SkRecords::Draw&>(int, SkRecords::Draw&) const @ SkRecord.h:42
  $SkRecordDraw(SkRecord const&, SkCanvas*, SkPicture const* const*, SkDrawable* const*, int, SkBBoxHierarchy const*, SkPicture::AbortCallback*) @ SkRecordDraw.cpp:57
  $SkBigPicture::playback(SkCanvas*, SkPicture::AbortCallback*) const @ SkBigPicture.cpp:32
  $SkCanvas::onDrawPicture(SkPicture const*, SkMatrix const*, SkPaint const*) @ SkCanvas.cpp:2850
  $SkCanvas::drawPicture(SkPicture const*, SkMatrix const*, SkPaint const*) @ SkCanvas.cpp:2839
  $SkCanvas::drawPicture(SkPicture const*) @ SkCanvas.h:1900
  $SkCanvas::drawPicture(sk_sp<SkPicture> const&) @ SkCanvas.h:1912
  $emscripten::internal::MethodInvoker<void (SkCanvas::*)(sk_sp<SkPicture> const&), void, SkCanvas*, sk_sp<SkPicture> const&>::invoke(void (SkCanvas::* const&)(sk_sp<SkPicture> const&), SkCanvas*, sk_sp<SkPicture>*) @ bind.h:585
  (anonymous) @ canvaskit.js:8755
  CanvasKit.Canvas.drawPicture @ canvaskit.js:1877
  animation @ webgl.earth.html:214
  draw @ webgl.earth.html:256
  requestAnimationFrame (async)

 

圖片解碼的地方:/skia/src/codec/SkCodec.cpp

static std::vector<DecoderProc>* decoders() {
    static auto* decoders = new std::vector<DecoderProc> {
 
    // JPEGR Decoder should be checked before JPEG, because JPEGR is an extension of JPEG
    #ifdef SK_CODEC_DECODES_JPEGR
        { SkJpegRCodec::IsJpegR, SkJpegRCodec::MakeFromStream },
    #endif
    #ifdef SK_CODEC_DECODES_JPEG
        { SkJpegCodec::IsJpeg, SkJpegCodec::MakeFromStream },
    #endif
    #ifdef SK_CODEC_DECODES_WEBP
        { SkWebpCodec::IsWebp, SkWebpCodec::MakeFromStream },
    #endif
    #ifdef SK_HAS_WUFFS_LIBRARY
        { SkWuffsCodec_IsFormat, SkWuffsCodec_MakeFromStream },
    #endif
    #ifdef SK_CODEC_DECODES_PNG
        { SkIcoCodec::IsIco, SkIcoCodec::MakeFromStream },
    #endif
        { SkBmpCodec::IsBmp, SkBmpCodec::MakeFromStream },
        { SkWbmpCodec::IsWbmp, SkWbmpCodec::MakeFromStream },
    #ifdef SK_CODEC_DECODES_AVIF
        { SkAvifCodec::IsAvif, SkAvifCodec::MakeFromStream },
    #endif
    #ifdef SK_CODEC_DECODES_JPEGXL
        { SkJpegxlCodec::IsJpegxl, SkJpegxlCodec::MakeFromStream },
    #endif
    };
    return decoders;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章