source: binary-improvements/7dtd-server-fixes/src/FileCache/MapTileCache.cs@ 374

Last change on this file since 374 was 351, checked in by alloc, 6 years ago

Fixed game version compatibility of GamePrefs
Code style cleanup (mostly argument names)

File size: 3.6 KB
Line 
1using System;
2using System.IO;
3using UnityEngine;
4using UnityEngine.Profiling;
5using Object = UnityEngine.Object;
6
7namespace AllocsFixes.FileCache {
8 // Special "cache" for map tile folder as both map rendering and webserver access files in there.
9 // Only map rendering tiles are cached. Writing is done by WriteThrough.
10 public class MapTileCache : AbstractCache {
11 private readonly byte[] transparentTile;
12 private CurrentZoomFile[] cache;
13
14 public MapTileCache (int _tileSize) {
15 Texture2D tex = new Texture2D (_tileSize, _tileSize);
16 Color nullColor = new Color (0, 0, 0, 0);
17 for (int x = 0; x < _tileSize; x++) {
18 for (int y = 0; y < _tileSize; y++) {
19 tex.SetPixel (x, y, nullColor);
20 }
21 }
22
23 transparentTile = tex.EncodeToPNG ();
24 Object.Destroy (tex);
25 }
26
27 public void SetZoomCount (int _count) {
28 cache = new CurrentZoomFile[_count];
29 for (int i = 0; i < cache.Length; i++) {
30 cache [i] = new CurrentZoomFile ();
31 }
32 }
33
34 public byte[] LoadTile (int _zoomlevel, string _filename) {
35 try {
36 lock (cache) {
37 CurrentZoomFile cacheEntry = cache [_zoomlevel];
38
39 if (cacheEntry.filename == null || !cacheEntry.filename.Equals (_filename)) {
40 cacheEntry.filename = _filename;
41
42 if (!File.Exists (_filename)) {
43 cacheEntry.pngData = null;
44 return null;
45 }
46
47 Profiler.BeginSample ("ReadPng");
48 cacheEntry.pngData = ReadAllBytes (_filename);
49 Profiler.EndSample ();
50 }
51
52 return cacheEntry.pngData;
53 }
54 } catch (Exception e) {
55 Log.Warning ("Error in MapTileCache.LoadTile: " + e);
56 }
57
58 return null;
59 }
60
61 public void SaveTile (int _zoomlevel, byte[] _contentPng) {
62 try {
63 lock (cache) {
64 CurrentZoomFile cacheEntry = cache [_zoomlevel];
65
66 string file = cacheEntry.filename;
67 if (string.IsNullOrEmpty (file)) {
68 return;
69 }
70
71 cacheEntry.pngData = _contentPng;
72
73 Profiler.BeginSample ("WritePng");
74 using (Stream stream = new FileStream (file, FileMode.Create, FileAccess.ReadWrite, FileShare.None,
75 4096)) {
76 stream.Write (_contentPng, 0, _contentPng.Length);
77 }
78 Profiler.EndSample ();
79 }
80 } catch (Exception e) {
81 Log.Warning ("Error in MapTileCache.SaveTile: " + e);
82 }
83 }
84
85 public void ResetTile (int _zoomlevel) {
86 try {
87 lock (cache) {
88 cache [_zoomlevel].filename = null;
89 cache [_zoomlevel].pngData = null;
90 }
91 } catch (Exception e) {
92 Log.Warning ("Error in MapTileCache.ResetTile: " + e);
93 }
94 }
95
96 public override byte[] GetFileContent (string _filename) {
97 try {
98 lock (cache) {
99 foreach (CurrentZoomFile czf in cache) {
100 if (czf.filename != null && czf.filename.Equals (_filename)) {
101 return czf.pngData;
102 }
103 }
104
105 if (!File.Exists (_filename)) {
106 return transparentTile;
107 }
108
109 return ReadAllBytes (_filename);
110 }
111 } catch (Exception e) {
112 Log.Warning ("Error in MapTileCache.GetFileContent: " + e);
113 }
114
115 return null;
116 }
117
118 private static byte[] ReadAllBytes (string _path) {
119 using (FileStream fileStream = new FileStream(_path, FileMode.Open, FileAccess.Read, FileShare.Read, 4096)) {
120 int bytesRead = 0;
121 int bytesLeft = (int) fileStream.Length;
122 byte[] result = new byte[bytesLeft];
123 while (bytesLeft > 0) {
124 int readThisTime = fileStream.Read (result, bytesRead, bytesLeft);
125 if (readThisTime == 0) {
126 throw new IOException ("Unexpected end of stream");
127 }
128
129 bytesRead += readThisTime;
130 bytesLeft -= readThisTime;
131 }
132
133 return result;
134 }
135 }
136
137
138 private class CurrentZoomFile {
139 public string filename;
140 public byte[] pngData;
141 }
142 }
143}
Note: See TracBrowser for help on using the repository browser.