2016-08-04 6 views
1

私は窓のgdiペインティングとskiaを比較しました。どちらも98000の無作為な線を描く。スキアはgdiよりもはるかに効率が悪い(スキアペインティングのコストは1600ms、gdiは0msです)。私のテストコードは以下の通りです。助言がありますか?窓のskiaが効率が悪い理由

bool PaintCompare() { 
    //generate ramdon points 
    std::default_random_engine e(std::chrono::high_resolution_clock::now().time_since_epoch().count()); 
    std::uniform_real_distribution<float> u(10, 500); 
    SkPoint pts[100]; 
    for (int i = 0; i<100; i++) 
     pts[i].set(u(e), u(e)); 
    SkPaint paint; 
    paint.setColor(SkColorSetRGB(255, 0, 0)); 

    //create skia canvas 
    sk_sp<SkSurface> rasterSurface(
     SkSurface::MakeRasterN32Premul(600, 600)); 
    SkCanvas* canvas = rasterSurface->getCanvas(); 

    //draw lines with skia 
    auto start = std::chrono::high_resolution_clock::now(); 
    for (int i = 0; i<1000; i++) 
    { 
     for (int j = 1; j<99; j++) 
     { 
      canvas->drawLine(pts[j].fX, pts[j].fY, pts[j + 1].fX, pts[j + 1].fY, paint); 
     } 
    } 
    auto cost = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now() - start); 
    sk_sp<SkImage> img(rasterSurface->makeImageSnapshot()); 
    if (!img) { return false; } 
    SkBitmap skBmp; 
    if (!img->asLegacyBitmap(&skBmp, SkImage::kRO_LegacyBitmapMode)) { 
     return false; 
    } 

    //show bitmap on hdc 
    BITMAPINFO bmi; 
    memset(&bmi, 0, sizeof(bmi)); 
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
    bmi.bmiHeader.biWidth = 600; 
    bmi.bmiHeader.biHeight = -600; // top-down image 
    bmi.bmiHeader.biPlanes = 1; 
    bmi.bmiHeader.biBitCount = 32; 
    bmi.bmiHeader.biCompression = BI_RGB; 
    bmi.bmiHeader.biSizeImage = 0; 

    HDC hdc = GetDC(); 
    LPVOID pBits = NULL; 
    HBITMAP hBmp = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, &pBits, 0, 0); 
    skBmp.copyPixelsTo(pBits, skBmp.getSize()); 
    CDC memdc; 
    memdc.CreateCompatibleDC(hdc); 
    memdc.SelectBitmap(hBmp); 
    BitBlt(hdc, 0, 0, 600, 600, memdc, 0, 0, SRCCOPY); 
    memdc.DeleteDC(); 


    //draw with gdi 
    CPen pen; 
    pen.CreatePen(PS_SOLID, 1, RGB(0, 255, 0)); 
    RECT rc{ 0,0,600,600 }; 
    CBitmap bmp; 
    bmp.CreateCompatibleBitmap(hdc, 600, 600); 
    memdc.CreateCompatibleDC(hdc); 
    memdc.SelectBitmap(bmp); 
    memdc.FillSolidRect(&rc, RGB(0, 0, 0)); 
    memdc.SelectPen(pen); 
    start = std::chrono::high_resolution_clock::now(); 
    for (int i = 0; i<1000; i++) 
    { 
     for (int j = 1; j<99; j++) 
     { 
      memdc.MoveTo(pts[j].fX, pts[j].fY); 
      memdc.LineTo(pts[j + 1].fX, pts[j + 1].fY); 
     } 
    } 
    auto cost2 = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now() - start); 

    //copy bitmap to window 
    BitBlt(hdc, 700, 0, 600, 600, memdc, 0, 0, SRCCOPY); 
    ReleaseDC(hdc); 
    memdc.DeleteDC(); 

    //wchar_t buf[256]; 
    //wsprintf(buf, L"left cost=%I64d, right cost=%I64d", cost.count(), cost2.count()); 
    //GetParent().SetWindowText(buf); 

    //cost == 1596615 microseconds 
    //cost2 == 107253 microseconds 
} 
+0

[最小、完全で、検証可能な例](http://stackoverflow.com/help/mcve)を投稿してください。 –

+1

申し訳ありませんが、ここにコードを投稿する方法はわかりません。上記のコードiがコアです。あなたが見ることができるように私はskiaとgdiで描くのに費やした時間を計算します。そのコストとコストは、費やされた時間を含む変数です。 – qianyi

答えて

2

最後に問題が見つかりました。私はデバッグモードで結果を与える!

ラスターバックエンドのskiaがgdiよりも20倍遅いデバッグモードです。 しかし、リリースモードでは、ラスターバックエンドのskiaはgdiよりも4〜5倍遅くなります。

私は、skiaがバックエンドとしてOpenGLを使用するという別のテストをしました。結果はskiaとgdiがほぼ同じ時間を費やすことを示します。スキアはgdiより約15%遅いです。

関連する問題