Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Copiare array senza uso di Marshal
Forum - C# / VB.NET - Copiare array senza uso di Marshal

Avatar
julius (Normal User)
Newbie


Messaggi: 2
Iscritto: 25/06/2015

Segnala al moderatore
Postato alle 17:37
Giovedì, 25/06/2015
Ciao a tutti,
avrei dei chiarimenti da sottoporvi, ho un dispositivo (telecamera) che attraverso una callback mi passa un indirizzo ad un puntatore di memoria e una dimensione del buffer. Ora per poter utilizzare questi dati sono costretto (per quanto ne so io) ad utilizzare Marshal, ma questo comporta un certo dispendio di tempo e un impegno non trascurabile da parte della cpu. Vorrei sapere se e esistono dei metodi e, se potete indicarmi esempi in merito, che mi permettano di eseguire una copià in modo più rapido.
la dimensione dell'array da copiare è di 1280*1024*3 quindi 3.932.160 byte
Codice sorgente - presumibilmente VB.NET

  1. Public mCamBuf() As Byte 'buffer pubblico dei dati raw
  2. Public mCameraLiveBitmap As Image 'immagine pubblica da utilizzare nel programma
  3.  
  4. Public Function MyCallbackFunc(ByVal pBuf As IntPtr, ByVal lBufferSize As Integer) As Integer
  5.  
  6.         'ridimensiono l'array
  7.         ReDim mCamBuf(lBufferSize)
  8.  
  9.         'copio i dati dalla memoria non gestita
  10.         Marshal.Copy(pBuf, mCamBuf, 0, lBufferSize)
  11.  
  12.         'creo una nuova bitmap
  13.         Dim CameraLiveBitmap As Bitmap = New Bitmap(1280, 1024)
  14.  
  15.         'blocco i bit
  16.         Dim bData As Imaging.BitmapData = CameraLiveBitmap.LockBits(New Rectangle(0, 0, 1280, 1024), _
  17.                                           Imaging.ImageLockMode.WriteOnly, Imaging.PixelFormat.Format24bppRgb)
  18.  
  19.         'copia i valoi rgb nella bitmap
  20.         Marshal.Copy(mCamBuf, 0, bData.Scan0, mCamBufLen)
  21.  
  22.         'sblocco i bit
  23.         CameraLiveBitmap.UnlockBits(bData)
  24.  
  25.         mCameraLiveBitmap = CameraLiveBitmap
  26.     Return 1


Ultima modifica effettuata da julius il 25/06/2015 alle 17:55


...:::----Julius----:::...
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6108
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 22:23
Giovedì, 25/06/2015
Non puoi saltare il marshalling, ma il problema di performance non è nel Marshal.Copy, ma in tutto il resto!

Non ridimensionare l'array, siccome le dimensioni non cambiano! (Elimina redim)

Perchè fai due Marshal.Copy? Ne basta uno.

Non creare una nuova Bitmap ad ogni chiamata, usa direttamente la Bitmap esistente.


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM Quote
Avatar
julius (Normal User)
Newbie


Messaggi: 2
Iscritto: 25/06/2015

Segnala al moderatore
Postato alle 23:23
Giovedì, 25/06/2015
innanzitutto grazie per la risposta.
proverò appena possibile a eliminare il redim in effetti l'immagine ha sempre le stesse dimensioni per via delle impostazioni fisse della telecamera.
il doppio marshal lo avrei evitato volentieri ma da esempi che ho trovato pare sia l'unico modo per poi ottenere un'immagine.


...:::----Julius----:::...
PM Quote