Project

General

Profile

« Previous | Next » 

Revision c43abe6c

Added by Leszek Koltunski about 5 years ago

Fixes for memory leak problems uncovered by the 'Rubik' app. (mainly: new method DistortedNode.markForDeletion)

View differences:

src/main/java/org/distorted/library/main/Distorted.java
26 26
import android.opengl.GLES31;
27 27

  
28 28
import org.distorted.library.effect.Effect;
29
import org.distorted.library.effect.FragmentEffect;
30 29
import org.distorted.library.effect.PostprocessEffect;
31
import org.distorted.library.effect.VertexEffect;
32 30
import org.distorted.library.message.EffectMessageSender;
33 31

  
34 32
///////////////////////////////////////////////////////////////////////////////////////////////////
......
108 106
// ARM Mali driver r12 has problems when we keep swapping many FBOs (fixed in r22)
109 107
// PowerVR GE8100 compiler fails to compile OIT programs.
110 108

  
111
  static void detectBuggyDrivers()
109
  private static void detectBuggyDrivers()
112 110
    {
113 111
    String vendor  = GLES31.glGetString(GLES31.GL_VENDOR);
114 112
    String version = GLES31.glGetString(GLES31.GL_VERSION);
......
149 147

  
150 148
///////////////////////////////////////////////////////////////////////////////////////////////////
151 149
/**
152
 * When OpenGL context gets created, you need to call this method so that the library can initialise its internal data structures.
150
 * When OpenGL context gets created, call this method so that the library can initialise its internal data structures.
153 151
 * I.e. best called from GLSurfaceView.onCreate().
154 152
 * <p>
155 153
 * Needs to be called from a thread holding the OpenGL context.
src/main/java/org/distorted/library/main/DistortedEffects.java
415 415

  
416 416
  void newNode(DistortedNode node)
417 417
    {
418
    mM.newNode(node);
419
    mF.newNode(node);
420
    mV.newNode(node);
421 418
    mP.newNode(node);
422 419
    }
423 420

  
421
///////////////////////////////////////////////////////////////////////////////////////////////////
422

  
423
  void removeNode(DistortedNode node)
424
    {
425
    mP.removeNode(node);
426
    }
427

  
424 428
///////////////////////////////////////////////////////////////////////////////////////////////////
425 429

  
426 430
  private void displayNormals(MeshBase mesh)
src/main/java/org/distorted/library/main/DistortedNode.java
101 101
    mMapNodeID.clear();
102 102
    }
103 103

  
104
///////////////////////////////////////////////////////////////////////////////////////////////////
105

  
106
  public void markForDeletion()
107
    {
108
    if( --mData.numPointingNodes==0 )
109
      {
110
      mMapNodeID.remove(mData.key);
111

  
112
      if( mData.mFBO!=null )
113
        {
114
        mData.mFBO.markForDeletion();
115
        mData.mFBO = null;
116
        }
117
      }
118

  
119
    mEffects.removeNode(this);
120
    }
121

  
104 122
///////////////////////////////////////////////////////////////////////////////////////////////////
105 123

  
106 124
  private ArrayList<Long> generateIDList()
......
656 674
  public void doWork()
657 675
    {
658 676
    int num = mJobs.size();
659
    Job job;
660

  
661
    int numChanges=0;
662 677

  
663
    for(int i=0; i<num; i++)
678
    if( num>0 )
664 679
      {
665
      job = mJobs.remove(0);
680
      Job job;
681
      int numChanges=0;
666 682

  
667
      switch(job.type)
683
      for(int i=0; i<num; i++)
668 684
        {
669
        case ATTACH: numChanges++;
670
                     if( mChildren==null ) mChildren = new ArrayList<>(2);
671
                     job.node.mParent = this;
672
                     job.node.mSurfaceParent = null;
673
                     DistortedMaster.addSortingByBuckets(mChildren,job.node);
674
                     mNumChildren[0]++;
675
                     break;
676
        case DETACH: numChanges++;
677
                     if( mNumChildren[0]>0 && mChildren.remove(job.node) )
678
                       {
679
                       job.node.mParent = null;
685
        job = mJobs.remove(0);
686

  
687
        switch(job.type)
688
          {
689
          case ATTACH: numChanges++;
690
                       if( mChildren==null ) mChildren = new ArrayList<>(2);
691
                       job.node.mParent = this;
680 692
                       job.node.mSurfaceParent = null;
681
                       mNumChildren[0]--;
682
                       }
683
                     break;
684
        case DETALL: numChanges++;
685
                     if( mNumChildren[0]>0 )
686
                       {
687
                       DistortedNode tmp;
688

  
689
                       for(int j=mNumChildren[0]-1; j>=0; j--)
693
                       DistortedMaster.addSortingByBuckets(mChildren,job.node);
694
                       mNumChildren[0]++;
695
                       break;
696
          case DETACH: numChanges++;
697
                       if( mNumChildren[0]>0 && mChildren.remove(job.node) )
690 698
                         {
691
                         tmp = mChildren.remove(j);
692
                         tmp.mParent = null;
693
                         tmp.mSurfaceParent = null;
699
                         job.node.mParent = null;
700
                         job.node.mSurfaceParent = null;
701
                         mNumChildren[0]--;
694 702
                         }
703
                       break;
704
          case DETALL: numChanges++;
705
                       if( mNumChildren[0]>0 )
706
                         {
707
                         DistortedNode tmp;
708

  
709
                         for(int j=mNumChildren[0]-1; j>=0; j--)
710
                           {
711
                           tmp = mChildren.remove(j);
712
                           tmp.mParent = null;
713
                           tmp.mSurfaceParent = null;
714
                           }
695 715

  
696
                       mNumChildren[0] = 0;
697
                       }
698
                     break;
699
        case SORT  : mChildren.remove(job.node);
700
                     DistortedMaster.addSortingByBuckets(mChildren,job.node);
701
                     break;
716
                         mNumChildren[0] = 0;
717
                         }
718
                       break;
719
          case SORT  : mChildren.remove(job.node);
720
                       DistortedMaster.addSortingByBuckets(mChildren,job.node);
721
                       break;
722
          }
702 723
        }
724
      if( numChanges>0 ) adjustIsomorphism();
703 725
      }
704

  
705
    if( numChanges>0 ) adjustIsomorphism();
706 726
    }
707 727

  
708 728
///////////////////////////////////////////////////////////////////////////////////////////////////
src/main/java/org/distorted/library/main/DistortedObject.java
171 171
    {
172 172
    android.util.Log.e("Object", "Done list:");
173 173

  
174
    DistortedObject object;
175
    int num = mDoneList.size();
176

  
177
    for(int i=0; i<num; i++)
174
    for(DistortedObject object : mDoneList)
178 175
      {
179
      object = mDoneList.get(i);
180 176
      object.print("");
181 177
      }
182 178

  
src/main/java/org/distorted/library/main/DistortedOutputSurface.java
1041 1041
  public void doWork()
1042 1042
    {
1043 1043
    int num = mJobs.size();
1044
    Job job;
1045 1044

  
1046
    for(int i=0; i<num; i++)
1045
    if( num>0 )
1047 1046
      {
1048
      job = mJobs.remove(0);
1047
      Job job;
1049 1048

  
1050
      switch(job.type)
1049
      for(int i=0; i<num; i++)
1051 1050
        {
1052
        case ATTACH: if( mChildren==null ) mChildren = new ArrayList<>(2);
1053
                     job.node.setSurfaceParent(this);
1054
                     DistortedMaster.addSortingByBuckets(mChildren,job.node);
1055
                     mNumChildren++;
1056
                     break;
1057
        case DETACH: if( mNumChildren>0 && mChildren.remove(job.node) )
1058
                       {
1059
                       job.node.setSurfaceParent(null);
1060
                       mNumChildren--;
1061
                       }
1062
                     break;
1063
        case DETALL: if( mNumChildren>0 )
1064
                       {
1065
                       DistortedNode tmp;
1066

  
1067
                       for(int j=mNumChildren-1; j>=0; j--)
1051
        job = mJobs.remove(0);
1052

  
1053
        switch(job.type)
1054
          {
1055
          case ATTACH: if( mChildren==null ) mChildren = new ArrayList<>(2);
1056
                       job.node.setSurfaceParent(this);
1057
                       DistortedMaster.addSortingByBuckets(mChildren,job.node);
1058
                       mNumChildren++;
1059
                       break;
1060
          case DETACH: if( mNumChildren>0 && mChildren.remove(job.node) )
1068 1061
                         {
1069
                         tmp = mChildren.remove(j);
1070
                         tmp.setSurfaceParent(null);
1062
                         job.node.setSurfaceParent(null);
1063
                         mNumChildren--;
1071 1064
                         }
1065
                       break;
1066
          case DETALL: if( mNumChildren>0 )
1067
                         {
1068
                         DistortedNode tmp;
1069

  
1070
                         for(int j=mNumChildren-1; j>=0; j--)
1071
                           {
1072
                           tmp = mChildren.remove(j);
1073
                           tmp.setSurfaceParent(null);
1074
                           }
1072 1075

  
1073
                       mNumChildren = 0;
1074
                       }
1075
                     break;
1076
        case SORT  : mChildren.remove(job.node);
1077
                     DistortedMaster.addSortingByBuckets(mChildren,job.node);
1078
                     break;
1076
                         mNumChildren = 0;
1077
                         }
1078
                       break;
1079
          case SORT  : mChildren.remove(job.node);
1080
                       DistortedMaster.addSortingByBuckets(mChildren,job.node);
1081
                       break;
1082
          }
1079 1083
        }
1080 1084
      }
1081 1085
    }
src/main/java/org/distorted/library/main/EffectQueue.java
148 148
    mNodes.add(node);
149 149
    }
150 150

  
151
///////////////////////////////////////////////////////////////////////////////////////////////////
152

  
153
  void removeNode(DistortedNode node)
154
    {
155
    mNodes.remove(node);
156
    }
157

  
151 158
///////////////////////////////////////////////////////////////////////////////////////////////////
152 159

  
153 160
  @SuppressWarnings("unused")

Also available in: Unified diff