2016-01-04 28 views
0

在先前的問題(propagateComposedEvents: mouse data not accurate?)我有一個例程(下)用於檢查鼠標單擊點是否在Canvas組件中的透明像素上。畫布:緩存imageData

var imageData = ctx.getImageData(mouseX, mouseY, 1, 1) 

緩存「imageData」是否有任何表現理由,因爲在我的用例中,它不會改變?或者存儲器問題,它會反對緩存。還是我只是盯着這行太久....


MouseArea { 
     anchors.fill: parent 
     drag.target: parent 

     propagateComposedEvents: true 

     onClicked: { 
      var ctx = parent.getContext("2d") 
      var imageData = ctx.getImageData(mouseX, mouseY, 1, 1) 

      if (imageData.data[3] == 0){ 
       console.log("graphic alpha clicked:", mouseX, mouseY); 
       mouse.accepted = false; 

      } else { 
       mouse.accepted = true; 
      } 
     } 
    } 

回答

3

圖像可能不會改變,但看着你是如何得到只是其中的像素,並考慮到的位置點擊更改,緩存是毫無意義的,除非您緩存整個圖像。

你真的應該輪廓,因爲有幾個因素在起作用這裏:

  • 確實爲imageData檢索涉及VRAM到RAM轉移 - 這些都是昂貴的,即使是單個像素
  • 如何經常會出現這種情況
  • 多大整個圖像,是可行的完全緩存它

即使它不是一個性能熱點,最好是有效率,做unnec僅僅因爲你可以擺脫這種不良習慣,它會影響消費者的能量,CPU時間和消耗電池。做很多這樣的事情最終會讓你陷入困境,因爲這些都會堆積起來。