Search Unity

  1. If you have experience with import & exporting custom (.unitypackage) packages, please help complete a survey (open until May 15, 2024).
    Dismiss Notice
  2. Unity 6 Preview is now available. To find out what's new, have a look at our Unity 6 Preview blog post.
    Dismiss Notice

Colliderless Trees... again

Discussion in 'Scripting' started by Antitheory, Nov 25, 2010.

  1. Antitheory

    Antitheory

    Joined:
    Nov 14, 2010
    Posts:
    549
    So it seems there are still problems with the tree colliders. Well, it's a problem if you want to use scripts to add trees.

    Code (csharp):
    1.  
    2. List<TreeInstance> treeInstances = new List<TreeInstance>();
    3. treeInstances.AddRange(terrainData.treeInstances);
    4. treeInstances.AddRange(newTreeInstances);
    5. terrainData.treeInstances = treeInstances.ToArray();
    6.  
    I messed around a bit to see what was going on and I discovered that if I place trees using the IDE the colliders worked fine. If I then added some more trees via a script (fragment above) the colliders on the NEW trees wouldn't work. The trees I placed in the IDE still had their colliders intact.

    Has anyone figured out how to get trees added through script to have colliders?
     
  2. Antitheory

    Antitheory

    Joined:
    Nov 14, 2010
    Posts:
    549
    Even more weirdness.... If I stop the game and start it again, the trees I added on the previous run now have colliders working normally. It seems only the trees added during the gameplay don't have colliders working.
     
  3. Antitheory

    Antitheory

    Joined:
    Nov 14, 2010
    Posts:
    549
    Ok I solved the problem. You can't simply throw in a new version of TreeInstance[] and expect your trees to have colliders.

    using

    terrain.AddTreeInstance(instance);

    does work with colliders! Sorry for all my complaining. I guess I should stick to the methods in place instead of hacking my way through the internal arrays!
     
  4. alexzzzz

    alexzzzz

    Joined:
    Nov 20, 2010
    Posts:
    1,447
    Are you sure on that?

    As far as I understand, all tree colliders become a part of the global TerrainCollider when you plant trees on your terrain. Well, it's true when you plant them in editor. But if you plant trees using terrain.AddTreeInstance or terrainData.treeInstances, the TerrainCollider doesn't update (at least in last 3.1.0f4 version of Unity). If you stop the scene and restart it, the TerrainCollider updates and all new trees get their colliders.

    In my current playground project, in order to force TerrainCollider to update, I have to call

    terrainData.SetHeights(0, 0, new float[,] { { } });

    It does nothing, but TerrainCollider updates (at least I think it does), and I get my lovely tree colliders.

    The problem is that terrainData.SetHeights lags pretty much. It's ok when the scene starts, but in runtime it is annoying.
     
    Last edited: Jan 7, 2011
  5. Antitheory

    Antitheory

    Joined:
    Nov 14, 2010
    Posts:
    549
    Yeah I forgot to mention that you have to add the pointless height update in order to get the colliders working. But if you are adding trees you have to do this anyways to get the trees at the right height. I don't think there is anyway around the lag issue...

    I have created a set of classes to load image files and load a terrain heightmap, splatmaps, trees, grass, etc... I have got everything except the actual manipulation of the terrainData in a separate thread to avoid any lag... But there is no way around this lag when you set heights or adjust the splatmap data. The lag is so terrible on a 2048x2048 terrain (the game freezes for like 3-5 seconds) that my classes are totally useless for runtime terrain generation.

    In general the lack of thread-safe classes in Unity means that runtime procedural generation of terrains or other complex objects isn't feasible.
     
  6. alexzzzz

    alexzzzz

    Joined:
    Nov 20, 2010
    Posts:
    1,447
    My trees are cuttable, so and I have to modify terrainData.treeInstances. It takes no time at all, but I'm forced to call SetHeights() to get rid of old tree colliders, and this call takes ~500ms.

    I think to try to split my terrain into a bunch of small ones. Maybe this will help.
     
  7. alexzzzz

    alexzzzz

    Joined:
    Nov 20, 2010
    Posts:
    1,447
    Last few days I have been creating a dynamicly generated archipelago of islands. Each island is represented by a grid of terrains. The size of the grids may vary. I have run few tests on different sizes of grids/terrains and here they are:

    1. One 2048x2048 terrain
    Code (csharp):
    1. Island resolution=2048, chunks=1, chunkResolution=2048
    2.  
    3. Chunk(0, 0) heights=1481ms, alphamaps=544ms, details=193ms, trees=354ms, finalHeights=415ms, TOTAL=2987ms
    4.  
    5. Generation stage=32862ms, allocation stage=103ms, splitting stage=2867ms, terrain updating stage=2992ms
    2. Four 1024x1024 terrains
    Code (csharp):
    1. Island resolution=2048, chunks=4, chunkResolution=1024
    2.  
    3. Chunk(0, 0) heights=337ms, alphamaps=137ms, details=46ms, trees=19ms, finalHeights=109ms, TOTAL=648ms
    4. Chunk(0, 1) heights=330ms, alphamaps=130ms, details=46ms, trees=14ms, finalHeights=103ms, TOTAL=623ms
    5. Chunk(1, 0) heights=336ms, alphamaps=136ms, details=49ms, trees=33ms, finalHeights=101ms, TOTAL=655ms
    6. Chunk(1, 1) heights=348ms, alphamaps=137ms, details=48ms, trees=35ms, finalHeights=102ms, TOTAL=670ms
    7.  
    8. Generation stage=31264ms, allocation stage=102ms, splitting stage=2584ms, terrain updating stage=2620ms
    3. Sixteen 512x512 terrains
    Code (csharp):
    1. Island resolution=2048, chunks=16, chunkResolution=512
    2.  
    3. Chunk(0, 0) heights=72ms, alphamaps=34ms, details=10ms, trees=0ms, finalHeights=21ms, TOTAL=137ms
    4. Chunk(0, 1) heights=73ms, alphamaps=33ms, details=10ms, trees=0ms, finalHeights=22ms, TOTAL=138ms
    5. Chunk(0, 2) heights=73ms, alphamaps=33ms, details=11ms, trees=0ms, finalHeights=25ms, TOTAL=142ms
    6. Chunk(0, 3) heights=71ms, alphamaps=33ms, details=10ms, trees=0ms, finalHeights=21ms, TOTAL=135ms
    7. Chunk(1, 0) heights=73ms, alphamaps=33ms, details=10ms, trees=0ms, finalHeights=22ms, TOTAL=138ms
    8. Chunk(1, 1) heights=73ms, alphamaps=33ms, details=14ms, trees=14ms, finalHeights=46ms, TOTAL=180ms
    9. Chunk(1, 2) heights=72ms, alphamaps=31ms, details=16ms, trees=34ms, finalHeights=41ms, TOTAL=194ms
    10. Chunk(1, 3) heights=69ms, alphamaps=31ms, details=10ms, trees=0ms, finalHeights=22ms, TOTAL=132ms
    11. Chunk(2, 0) heights=69ms, alphamaps=31ms, details=9ms, trees=0ms, finalHeights=21ms, TOTAL=130ms
    12. Chunk(2, 1) heights=69ms, alphamaps=32ms, details=15ms, trees=12ms, finalHeights=30ms, TOTAL=158ms
    13. Chunk(2, 2) heights=72ms, alphamaps=33ms, details=17ms, trees=24ms, finalHeights=34ms, TOTAL=180ms
    14. Chunk(2, 3) heights=73ms, alphamaps=33ms, details=11ms, trees=0ms, finalHeights=24ms, TOTAL=141ms
    15. Chunk(3, 0) heights=71ms, alphamaps=33ms, details=10ms, trees=0ms, finalHeights=21ms, TOTAL=135ms
    16. Chunk(3, 1) heights=73ms, alphamaps=32ms, details=10ms, trees=0ms, finalHeights=21ms, TOTAL=136ms
    17. Chunk(3, 2) heights=73ms, alphamaps=32ms, details=10ms, trees=0ms, finalHeights=22ms, TOTAL=137ms
    18. Chunk(3, 3) heights=72ms, alphamaps=32ms, details=10ms, trees=0ms, finalHeights=22ms, TOTAL=136ms
    19.  
    20. Generation stage=32954ms, allocation stage=104ms, splitting stage=2626ms, terrain updating stage=2450ms
    4. Sixty four 256x256 terrains
    Code (csharp):
    1.  
     
  8. alexzzzz

    alexzzzz

    Joined:
    Nov 20, 2010
    Posts:
    1,447
    heights is how long SetHeights() takes
    alphamaps is how long SetAlphamaps() takes (4 maps)
    details is how long a set of SetDetails() takes (5 layers)
    trees is how long a set of AddTreeInstance() takes (~4000 trees per 1024x1024 island)
    finalHeights is how long SetHeights(0, 0, new float[,] { { } }) takes

    1. Generation stage is where I generate all maps and trees for the island.

    2. Allocation stage is where I just allocate smaller maps for each terrain/chunk of the future big island.

    3. Splitting stage is where I fill smaller maps with data from the big maps. For example, instead of one 2048x2048 heightmap/alphamap/etc I get sixteen 512x512 heightmaps/etc.

    4. Terrain updating stage is where I create Terrain objects and call their SetHeights/SetAlphamaps/etc.

    First three stages can be moved into background threads. The work that is done by the last stage, in case of large amount of chunks, can be easily spread out in time.
     
    Last edited: Jan 10, 2011
  9. Antitheory

    Antitheory

    Joined:
    Nov 14, 2010
    Posts:
    549
    Your numbers look very similar to what I was getting. I tried running it in a webplayer and it freezes the entire browser during that terrain update stage. This may be the reason why some of these Terrain methods are undocumented... maybe they don't want us freezing people's browsers?

    Judging by your numbers it almost looks like it's not worth it to split up the terrains like that, unless you happen to also get the side benefit of increased framerate during the game itself.(I'd be interested to know if this is the case)

    My solution to this lag problem is to generate the terrain on my own time, and then just place them regularly as you would a hand-made terrain. The nice thing is that when you add trees, splatmaps, heightmap etc. the changes are saved in the TerrainData asset in your project. This means you can run it once, generate everything, and then just drag the Terrain into the scene and everything should be there.

    It's a poor solution really though, because it means you can't have infinite islands, which is what I wanted. I built a class to stream in images for the heightmaps, trees, so I could have huge seamless worlds (without having a huge initial download). It doesn't seem possible to achieve this yet without the dreaded 3 second freeze up. Hopefully Unity 3.2 will have threadsafe terrain generation!

    It's kinda interesting that both of us seem to be working on the same project (first your buoyancy script, and now this). Don't tell me your also making ambient-sound maps too?
     
  10. alexzzzz

    alexzzzz

    Joined:
    Nov 20, 2010
    Posts:
    1,447
    Not really, otherwise, I get -1fps for 1024x1024, -2fps for 512x512 etc. But I now have the possibility to fully disable all chunks that I don't see. Will try it later.

    The idea of terrain chunks is really worth. Not because it would take less time to update many small chunks instead of one huge terrain, but because small chunks are updated really fast and we can update one chunk per frame without much performance hit. Moreover, the first frame we can update only heights, the next frame - only alphamaps, etc. For 256x256 chunks the most expensive operation is SetHeights that takes only 15ms on my Q6600 2.4GHz. 15ms = 0.015s = 66fps.

    Here is a proof of concept:
    http://dl.dropbox.com/u/8203557/WebPlayer1/WebPlayer.unity3d

    It will take 30-60 seconds to calculate the maps, then you'll see a sky and sand. If you press 'Z', the island starts to update and will do it in infinite loop until you press 'Z' again. Other keys might be useful: 'F' - fullscreen, 'R' - toggles reflections, 'Tab' - speeds up time, 'Backspace' - creates another island somewhere on the map (can be seen or can be not).

    I don't know what exactly I'm working on. I found Unity not long ago and still playing with it, learning how to do things. Currently I think about something like Stranded in large or infinite world, but not sure what exactly will come out, if it will come at all.

    Ambient-sound maps sound cool! I have never thought of sounds in terms of sound maps. They should solve some problems, I'll definitely try them later.
     
    Last edited: Jan 10, 2011
  11. Antitheory

    Antitheory

    Joined:
    Nov 14, 2010
    Posts:
    549
    Cool! I'm definitely going to try some terrain chunking for my project too. Maybe I can have that streamed loading after-all. I didn't really think that 256x256 would be so fast.

    I just started with the soundmap idea yesterday and it is working great. It came from the idea of having different footstep sounds when the character is walking on different textures on a Terrain splatmap. Then I realized I could easily make a second sound map for ambient zones. A quick way of generating the sound map is just to gaussian blur the RGB images I am using for splatmaps. Each color channel has a corresponding sound clip and the volume is controlled by the color intensity and the height that you are above the terrain (so the sound fades if you are flying or climbing or something)....
     
  12. alexzzzz

    alexzzzz

    Joined:
    Nov 20, 2010
    Posts:
    1,447
    And also normal maps - from which direction should come the sound.

    PS
    One more thing to notice about terrain chunks. As you could see from the results of my tests above, total terrain update stage for the small chunks takes 2.2 seconds, that is 0.8 sec faster than one for the huge terrain. I'm not sure, but believe that's because chunks' data fits the processor cache.
     
    Last edited: Jan 11, 2011
  13. Antitheory

    Antitheory

    Joined:
    Nov 14, 2010
    Posts:
    549
    Yeah normal maps! Thanks for the idea. Just got it up and running with normal maps and it sounds great.
     
    Last edited: Jan 11, 2011
  14. alexzzzz

    alexzzzz

    Joined:
    Nov 20, 2010
    Posts:
    1,447
    I was wrong about the most expensive operation. It's not terrainData.SetHeights, it is a Terrain object creation.

    Code (csharp):
    1. var td = new TerrainData(); [B]// 9 ms[/B]
    2.  
    3. td.heightmapResolution = heightsResolution + 1; [B]// 2 ms[/B]
    4. td.alphamapResolution = heightsResolution;  [B]// 7 ms[/B]
    5. td.baseMapResolution = heightsResolution;   [B]// 2 ms[/B]
    6. td.splatPrototypes = sample.terrainData.splatPrototypes;    [B]// 6 ms[/B]
    7. td.detailPrototypes = sample.terrainData.detailPrototypes;  [B]// 2 ms[/B]
    8. td.treePrototypes = sample.terrainData.treePrototypes;
    9. td.wavingGrassAmount = sample.terrainData.wavingGrassAmount;
    10. td.wavingGrassStrength = sample.terrainData.wavingGrassStrength;
    11. td.wavingGrassSpeed = sample.terrainData.wavingGrassSpeed;
    12. td.wavingGrassTint = sample.terrainData.wavingGrassTint;
    13. td.SetDetailResolution(detailsResolution, 16);
    14.  
    15. td.size = new Vector3(chunkSize, maxHeight, chunkSize);
    16.  
    17. var go = Terrain.CreateTerrainGameObject(td); [B]// 13 ms[/B]
    ~40ms in total and it feels very laggy. So this code should be split into several separate tasks too.

    Here is what my new island generation procedure looks like:


    It's a 4*4 * 256*256 island.
     
    Last edited: Jan 21, 2011
  15. alexzzzz

    alexzzzz

    Joined:
    Nov 20, 2010
    Posts:
    1,447
    Performance report

    Code (csharp):
    1. job "CreateTerrainData (0, 0)" took 8ms
    2. job "SetHeightmapResolution (0, 0)" took 1ms
    3. job "SetAlphamapResolution (0, 0)" took 7ms
    4. job "SetBasemapResolution (0, 0)" took 2ms
    5. job "SetSplatPrototypes (0, 0)" took 6ms
    6. job "SetOtherTerrainDataProperties (0, 0)" took 2ms
    7. job "SetTerrainSize (0, 0)" took 13ms
    8. job "CreateTerrain (0, 0)" took 0ms
    9. job "CreateTerrainData (0, 1)" took 8ms
    10. job "SetHeightmapResolution (0, 1)" took 1ms
    11. job "SetAlphamapResolution (0, 1)" took 7ms
    12. job "SetBasemapResolution (0, 1)" took 2ms
    13. job "SetSplatPrototypes (0, 1)" took 6ms
    14. job "SetOtherTerrainDataProperties (0, 1)" took 2ms
    15. job "SetTerrainSize (0, 1)" took 13ms
    16. job "CreateTerrain (0, 1)" took 0ms
    17. job "CreateTerrainData (0, 2)" took 8ms
    18. job "SetHeightmapResolution (0, 2)" took 1ms
    19. job "SetAlphamapResolution (0, 2)" took 7ms
    20. job "SetBasemapResolution (0, 2)" took 2ms
    21. job "SetSplatPrototypes (0, 2)" took 6ms
    22. job "SetOtherTerrainDataProperties (0, 2)" took 2ms
    23. job "SetTerrainSize (0, 2)" took 13ms
    24. job "CreateTerrain (0, 2)" took 0ms
    25. job "CreateTerrainData (0, 3)" took 8ms
    26. job "SetHeightmapResolution (0, 3)" took 1ms
    27. job "SetAlphamapResolution (0, 3)" took 7ms
    28. job "SetBasemapResolution (0, 3)" took 2ms
    29. job "SetSplatPrototypes (0, 3)" took 6ms
    30. job "SetOtherTerrainDataProperties (0, 3)" took 2ms
    31. job "SetTerrainSize (0, 3)" took 14ms
    32. job "CreateTerrain (0, 3)" took 0ms
    33. job "CreateTerrainData (1, 0)" took 8ms
    34. job "SetHeightmapResolution (1, 0)" took 1ms
    35. job "SetAlphamapResolution (1, 0)" took 7ms
    36. job "SetBasemapResolution (1, 0)" took 2ms
    37. job "SetSplatPrototypes (1, 0)" took 6ms
    38. job "SetOtherTerrainDataProperties (1, 0)" took 3ms
    39. job "SetTerrainSize (1, 0)" took 13ms
    40. job "CreateTerrain (1, 0)" took 0ms
    41. job "CreateTerrainData (1, 1)" took 8ms
    42. job "SetHeightmapResolution (1, 1)" took 2ms
    43. job "SetAlphamapResolution (1, 1)" took 7ms
    44. job "SetBasemapResolution (1, 1)" took 3ms
    45. job "SetSplatPrototypes (1, 1)" took 6ms
    46. job "SetOtherTerrainDataProperties (1, 1)" took 2ms
    47. job "SetTerrainSize (1, 1)" took 13ms
    48. job "CreateTerrain (1, 1)" took 0ms
    49. job "CreateTerrainData (1, 2)" took 8ms
    50. job "SetHeightmapResolution (1, 2)" took 2ms
    51. job "SetAlphamapResolution (1, 2)" took 7ms
    52. job "SetBasemapResolution (1, 2)" took 2ms
    53. job "SetSplatPrototypes (1, 2)" took 6ms
    54. job "SetOtherTerrainDataProperties (1, 2)" took 2ms
    55. job "SetTerrainSize (1, 2)" took 13ms
    56. job "CreateTerrain (1, 2)" took 0ms
    57. job "CreateTerrainData (1, 3)" took 8ms
    58. job "SetHeightmapResolution (1, 3)" took 1ms
    59. job "SetAlphamapResolution (1, 3)" took 8ms
    60. job "SetBasemapResolution (1, 3)" took 3ms
    61. job "SetSplatPrototypes (1, 3)" took 6ms
    62. job "SetOtherTerrainDataProperties (1, 3)" took 2ms
    63. job "SetTerrainSize (1, 3)" took 13ms
    64. job "CreateTerrain (1, 3)" took 0ms
    65. job "CreateTerrainData (2, 0)" took 8ms
    66. job "SetHeightmapResolution (2, 0)" took 1ms
    67. job "SetAlphamapResolution (2, 0)" took 7ms
    68. job "SetBasemapResolution (2, 0)" took 2ms
    69. job "SetSplatPrototypes (2, 0)" took 6ms
    70. job "SetOtherTerrainDataProperties (2, 0)" took 3ms
    71. job "SetTerrainSize (2, 0)" took 13ms
    72. job "CreateTerrain (2, 0)" took 0ms
    73. job "CreateTerrainData (2, 1)" took 8ms
    74. job "SetHeightmapResolution (2, 1)" took 1ms
    75. job "SetAlphamapResolution (2, 1)" took 7ms
    76. job "SetBasemapResolution (2, 1)" took 2ms
    77. job "SetSplatPrototypes (2, 1)" took 6ms
    78. job "SetOtherTerrainDataProperties (2, 1)" took 2ms
    79. job "SetTerrainSize (2, 1)" took 13ms
    80. job "CreateTerrain (2, 1)" took 0ms
    81. job "CreateTerrainData (2, 2)" took 8ms
    82. job "SetHeightmapResolution (2, 2)" took 1ms
    83. job "SetAlphamapResolution (2, 2)" took 7ms
    84. job "SetBasemapResolution (2, 2)" took 2ms
    85. job "SetSplatPrototypes (2, 2)" took 6ms
    86. job "SetOtherTerrainDataProperties (2, 2)" took 4ms
    87. job "SetTerrainSize (2, 2)" took 13ms
    88. job "CreateTerrain (2, 2)" took 0ms
    89. job "CreateTerrainData (2, 3)" took 8ms
    90. job "SetHeightmapResolution (2, 3)" took 1ms
    91. job "SetAlphamapResolution (2, 3)" took 7ms
    92. job "SetBasemapResolution (2, 3)" took 2ms
    93. job "SetSplatPrototypes (2, 3)" took 6ms
    94. job "SetOtherTerrainDataProperties (2, 3)" took 2ms
    95. job "SetTerrainSize (2, 3)" took 13ms
    96. job "CreateTerrain (2, 3)" took 0ms
    97. job "CreateTerrainData (3, 0)" took 8ms
    98. job "SetHeightmapResolution (3, 0)" took 1ms
    99. job "SetAlphamapResolution (3, 0)" took 7ms
    100. job "SetBasemapResolution (3, 0)" took 4ms
    101. job "SetSplatPrototypes (3, 0)" took 6ms
    102. job "SetOtherTerrainDataProperties (3, 0)" took 2ms
    103. job "SetTerrainSize (3, 0)" took 13ms
    104. job "CreateTerrain (3, 0)" took 0ms
    105. job "CreateTerrainData (3, 1)" took 8ms
    106. job "SetHeightmapResolution (3, 1)" took 1ms
    107. job "SetAlphamapResolution (3, 1)" took 7ms
    108. job "SetBasemapResolution (3, 1)" took 2ms
    109. job "SetSplatPrototypes (3, 1)" took 6ms
    110. job "SetOtherTerrainDataProperties (3, 1)" took 3ms
    111. job "SetTerrainSize (3, 1)" took 12ms
    112. job "CreateTerrain (3, 1)" took 0ms
    113. job "CreateTerrainData (3, 2)" took 12ms
    114. job "SetHeightmapResolution (3, 2)" took 1ms
    115. job "SetAlphamapResolution (3, 2)" took 7ms
    116. job "SetBasemapResolution (3, 2)" took 2ms
    117. job "SetSplatPrototypes (3, 2)" took 6ms
    118. job "SetOtherTerrainDataProperties (3, 2)" took 2ms
    119. job "SetTerrainSize (3, 2)" took 13ms
    120. job "CreateTerrain (3, 2)" took 0ms
    121. job "CreateTerrainData (3, 3)" took 8ms
    122. job "SetHeightmapResolution (3, 3)" took 1ms
    123. job "SetAlphamapResolution (3, 3)" took 7ms
    124. job "SetBasemapResolution (3, 3)" took 2ms
    125. job "SetSplatPrototypes (3, 3)" took 6ms
    126. job "SetOtherTerrainDataProperties (3, 3)" took 2ms
    127. job "SetTerrainSize (3, 3)" took 13ms
    128. job "CreateTerrain (3, 3)" took 0ms
    129. job "SetNeighbors (0, 0)" took 0ms
    130. job "ClearTrees (0, 0)" took 0ms
    131. job "ClearTrees (0, 1)" took 0ms
    132. job "ClearTrees (0, 2)" took 0ms
    133. job "ClearTrees (0, 3)" took 0ms
    134. job "ClearTrees (1, 0)" took 0ms
    135. job "ClearTrees (1, 1)" took 0ms
    136. job "ClearTrees (1, 2)" took 0ms
    137. job "ClearTrees (1, 3)" took 0ms
    138. job "ClearTrees (2, 0)" took 0ms
    139. job "ClearTrees (2, 1)" took 0ms
    140. job "ClearTrees (2, 2)" took 0ms
    141. job "ClearTrees (2, 3)" took 0ms
    142. job "ClearTrees (3, 0)" took 0ms
    143. job "ClearTrees (3, 1)" took 0ms
    144. job "ClearTrees (3, 2)" took 0ms
    145. job "ClearTrees (3, 3)" took 0ms
    146. job "SetHeights (0, 0)" took 15ms
    147. job "SetHeights (0, 1)" took 15ms
    148. job "SetHeights (0, 2)" took 15ms
    149. job "SetHeights (0, 3)" took 16ms
    150. job "SetHeights (1, 0)" took 15ms
    151. job "SetHeights (1, 1)" took 15ms
    152. job "SetHeights (1, 2)" took 16ms
    153. job "SetHeights (1, 3)" took 16ms
    154. job "SetHeights (2, 0)" took 15ms
    155. job "SetHeights (2, 1)" took 15ms
    156. job "SetHeights (2, 2)" took 15ms
    157. job "SetHeights (2, 3)" took 16ms
    158. job "SetHeights (3, 0)" took 15ms
    159. job "SetHeights (3, 1)" took 15ms
    160. job "SetHeights (3, 2)" took 15ms
    161. job "SetHeights (3, 3)" took 16ms
    162. job "SetAlphamaps (0, 0)" took 7ms
    163. job "SetAlphamaps (0, 1)" took 8ms
    164. job "SetAlphamaps (0, 2)" took 7ms
    165. job "SetAlphamaps (0, 3)" took 7ms
    166. job "SetAlphamaps (1, 0)" took 8ms
    167. job "SetAlphamaps (1, 1)" took 7ms
    168. job "SetAlphamaps (1, 2)" took 7ms
    169. job "SetAlphamaps (1, 3)" took 8ms
    170. job "SetAlphamaps (2, 0)" took 7ms
    171. job "SetAlphamaps (2, 1)" took 8ms
    172. job "SetAlphamaps (2, 2)" took 7ms
    173. job "SetAlphamaps (2, 3)" took 8ms
    174. job "SetAlphamaps (3, 0)" took 8ms
    175. job "SetAlphamaps (3, 1)" took 7ms
    176. job "SetAlphamaps (3, 2)" took 7ms
    177. job "SetAlphamaps (3, 3)" took 8ms
    178. job "AddTrees (0, 0)" took 0ms
    179. job "AddTrees (0, 1)" took 0ms
    180. job "AddTrees (0, 2)" took 1ms
    181. job "AddTrees (0, 3)" took 1ms
    182. job "AddTrees (1, 0)" took 0ms
    183. job "AddTrees (1, 1)" took 2ms
    184. job "AddTrees (1, 2)" took 3ms
    185. job "AddTrees (1, 3)" took 1ms
    186. job "AddTrees (2, 0)" took 1ms
    187. job "AddTrees (2, 1)" took 3ms
    188. job "AddTrees (2, 2)" took 3ms
    189. job "AddTrees (2, 3)" took 1ms
    190. job "AddTrees (3, 0)" took 1ms
    191. job "AddTrees (3, 1)" took 0ms
    192. job "AddTrees (3, 2)" took 0ms
    193. job "AddTrees (3, 3)" took 0ms
    194. job "SetDetails (0, 0)" took 4ms
    195. job "SetDetails (0, 1)" took 4ms
    196. job "SetDetails (0, 2)" took 6ms
    197. job "SetDetails (0, 3)" took 5ms
    198. job "SetDetails (1, 0)" took 5ms
    199. job "SetDetails (1, 1)" took 6ms
    200. job "SetDetails (1, 2)" took 6ms
    201. job "SetDetails (1, 3)" took 7ms
    202. job "SetDetails (2, 0)" took 5ms
    203. job "SetDetails (2, 1)" took 6ms
    204. job "SetDetails (2, 2)" took 6ms
    205. job "SetDetails (2, 3)" took 6ms
    206. job "SetDetails (3, 0)" took 5ms
    207. job "SetDetails (3, 1)" took 5ms
    208. job "SetDetails (3, 2)" took 4ms
    209. job "SetDetails (3, 3)" took 4ms
    210. job "UpdateCollider (0, 0)" took 5ms
    211. job "UpdateCollider (0, 1)" took 6ms
    212. job "UpdateCollider (0, 2)" took 7ms
    213. job "UpdateCollider (0, 3)" took 7ms
    214. job "UpdateCollider (1, 0)" took 6ms
    215. job "UpdateCollider (1, 1)" took 7ms
    216. job "UpdateCollider (1, 2)" took 8ms
    217. job "UpdateCollider (1, 3)" took 7ms
    218. job "UpdateCollider (2, 0)" took 6ms
    219. job "UpdateCollider (2, 1)" took 8ms
    220. job "UpdateCollider (2, 2)" took 8ms
    221. job "UpdateCollider (2, 3)" took 7ms
    222. job "UpdateCollider (3, 0)" took 6ms
    223. job "UpdateCollider (3, 1)" took 6ms
    224. job "UpdateCollider (3, 2)" took 6ms
    225. job "UpdateCollider (3, 3)" took 6ms
     
  16. alexzzzz

    alexzzzz

    Joined:
    Nov 20, 2010
    Posts:
    1,447