How to share large image (Texture2d) across photon network?

In my mobile game, one user takes a picture and then shares it with all other players so that the image can be saved to the raw image on everyone's phones so they can vote on that image. I am doing this by converting the image to byte[] and calling an RPC for all that applies the texture to the raw image. However, the image seems to be too large of a file to share and it crashes the room and does not send. I am trying to find a solution to this by maybe saving the image to the cloud and loading it on other devices or serializing the raw image but I don't know how to do this. I am new to photon also. Can anyone please help me out to share the image across the network?

Here are the relevant parts of my script,
public class PlayerInfo : MonoBehaviourPun
     {
     public Text elimSelectText;
     public Player selectedPlayer;
     private Transform choosePlayersContainer;
     public AspectRatioFitter sharePhotoAspectFitter;
     public  NatSuite.Examples.MiniCam cam;
     public RawImage photoPanel;
     public PhotonView votePView;
     public Texture2D receivedTexture;
     public RawImage sharePhotoPanel;
     public GameObject voteElimPanel;
     private GameObject chooseListingPrefab;
 
       private void Update(){
              if(cam.isCapturing){            
             cam.isCapturing=false;
             openElimSelect();
         }  
         }
         
         public void openElimSelect(){
             photoPanel.texture = cam.previewTexture;
             photoAspectFitter.aspectRatio = cam.previewTexture.width / (float)cam.previewTexture.height;
             elimSelectHold.SetActive(true);
             listPlayersToChoose();
         }
 
 
  public void openElimSelect(){
         photoPanel.texture = cam.previewTexture;
         photoAspectFitter.aspectRatio = cam.previewTexture.width / (float)cam.previewTexture.height;
 
         elimSelectHold.SetActive(true);
         listPlayersToChoose();
     }
     void listPlayersToChoose(){
         foreach(Player player in PhotonNetwork.PlayerList){
            if(getAlive(player)){
                 GameObject tempListing = Instantiate(chooseListingPrefab, choosePlayersContainer);
                 Text tempText = tempListing.transform.GetChild(0).GetComponent<Text>();
                 tempText.text = player.NickName;
                 Button button= tempListing.gameObject.GetComponent<Button>();
                 button.onClick.AddListener(()=>{
                     votePView.RPC("selectedPlayerForVote", RpcTarget.All, player, cam.previewTexture.EncodeToPNG(), cam.previewTexture.width, cam.previewTexture.height);
                     elimSelectHold.SetActive(false);
                     ClearElimSelectPlayerListings();
                     Texture2D.Destroy(cam.previewTexture);
                 });    
             }   
         }
     }
 [PunRPC]
     private void selectedPlayerForVote(Player player, byte[] receivedByte, int width, int height){
         selectedPlayer = player;
         receivedTexture = new Texture2D(1, 1);
         receivedTexture.LoadImage(receivedByte);        
         sharePhotoPanel.texture =  receivedTexture;
         sharePhotoAspectFitter.aspectRatio = width / (float)height;
         isVoting = true;
         elimSelectText.text = "Is this " + player.NickName + "?";
         voteElimPanel.SetActive(true);
     }

Comments

  • hi, @adagne16

    best way is to use external storage.
    otherwise I would recommend you to add file size limit. This is always good because unlimited size can be abused to crush other devices

    sending as byte[] is fine however you have to split your file in small chunks - 10-16 KB and send. also it would be good if you will control send rate on client that sends data. so that others are not overwhelmed - 200 KB per second should be good

    best,
    ilya
  • adagne16adagne16
    edited March 22
    Hi, @chvetsov

    Thank you for clearing this up for me. Do you have any suggestions on where to start for external cloud storage?

    Also, right now, I created a 000webhost account and created a php file that works with a wwwform in unity so I can upload the image. My problem is that it takes more than 10 seconds to upload and probably more to load it in.
  • hi, @adagne16

    No, I do not have any suggestions.

    best,
    ilya
Sign In or Register to comment.