যখন আপনার গেম দুটি কারণে লোডিং ইভেন্টগুলি সম্পাদন করে তখন রেকর্ড করা গুরুত্বপূর্ণ:
- লোড করার সময় আপনার ফ্রেম টাইম ডেটা দূষণ এড়াতে।
- কখন এবং কোথায় লোডের সময় গ্রহণযোগ্যতার চেয়ে বেশি তা দেখতে লোডের সময় বিশ্লেষণ করতে।
একটি লোডিং ইভেন্টের সাথে সম্পর্কিত মেটাডেটা থাকতে পারে:
public class LoadingTimeMetadata
{
public enum LoadingState
{
Unknown = 0,
/// <summary>
/// The first time the game is run.
/// </summary>
FirstRun = 1,
/// <summary>
/// App is not backgrounded.
/// </summary>
ColdStart = 2,
/// <summary>
/// App is backgrounded.
/// </summary>
WarmStart = 3,
/// <summary>
/// App is backgrounded, least work needed.
/// </summary>
HotStart = 4,
/// <summary>
/// Asset loading between levels.
/// </summary>
InterLevel = 5
}
public LoadingState state;
public enum LoadingSource
{
UnknownSource = 0,
/// <summary>
/// Uncompressing data.
/// </summary>
Memory = 1,
/// <summary>
/// Reading assets from APK bundle.
/// </summary>
Apk = 2,
/// <summary>
/// Reading assets from device storage.
/// </summary>
DeviceStorage = 3,
/// <summary>
/// Reading assets from external storage, e.g. SD card.
/// </summary>
ExternalStorage = 4,
/// <summary>
/// Loading assets from the network.
/// </summary>
Network = 5,
/// <summary>
/// Shader compilation.
/// </summary>
ShaderCompilation = 6,
/// <summary>
/// Time spent between process starting and onCreate.
/// </summary>
PreActivity = 7,
/// <summary>
/// Total time spent between process starting and first render frame.
/// </summary>
FirstTouchToFirstFrame = 8,
/// <summary>
/// Time from start to end of a group of events.
/// </summary>
TotalUserWaitForGroup = 9
}
public LoadingSource source;
/// <summary>
/// 0 = no compression, 100 = max compression
/// </summary>
public int compression_level;
public enum NetworkConnectivity
{
Unknown = 0,
Wifi = 1,
CellularNetwork = 2
}
public NetworkConnectivity network_connectivity;
/// <summary>
/// Bandwidth in bits per second.
/// </summary>
public ulong network_transfer_speed_bps;
/// <summary>
/// Latency in nanoseconds.
/// </summary>
public ulong network_latency_ns;
}
আপনার প্রয়োজনের সাথে প্রাসঙ্গিক নয় এমন যেকোনো ক্ষেত্র শূন্য হতে পারে।
একটি লোডিং ইভেন্টের একটি সম্পর্কিত টীকাও থাকতে পারে। আপনি Annotation
বার্তার এক বা একাধিক ক্ষেত্র ব্যবহার করে ফ্রেম টাইম টীকাগুলির মতো একইভাবে সংজ্ঞায়িত করতে পারেন।
Result<ulong> StartRecordingLoadingTime(LoadingTimeMetadata eventMetadata, TAnnotation annotation);
এই ফাংশনটি প্রদত্ত মেটাডেটা এবং টীকা সম্পর্কিত একটি লোডিং টাইম ইভেন্ট রেকর্ড করা শুরু করে এবং StopRecordingLoadingTime()
ফাংশনে ব্যবহার করার জন্য একটি Result<ulong>.value
পূরণ করে।
ErrorCode StopRecordingLoadingTime(ulong handle);
এই ফাংশনটি StartRecordingLoadingTime()
দ্বারা পূর্বে শুরু হওয়া একটি ইভেন্ট রেকর্ড করা বন্ধ করে। ইভেন্টটি পরবর্তী সেশন ফ্লাশে আপলোড করা হয়।
গ্রুপ ফাংশন লোড হচ্ছে
আপনার গেমে, আপনি ব্যবহারকারীর দ্বারা দেখা একটি একক লোডিং সময়ের জন্য বেশ কয়েকটি লোডিং ইভেন্ট রেকর্ড করতে পারেন। কিছু উদাহরণের মধ্যে ফাইল লোডিং , দৃশ্য লোডিং , ডিকম্প্রেশন এবং শেডার সংকলন অন্তর্ভুক্ত।
Android পারফরম্যান্স টিউনারকে জানানো গুরুত্বপূর্ণ যে লোডিং ইভেন্টগুলি এমন একটি গ্রুপের অংশ যাতে এটি আরও ভাল অন্তর্দৃষ্টি প্রদান করতে পারে। এটি করার জন্য নিম্নলিখিত স্টার্ট এবং স্টপ ফাংশনগুলির সাথে আপনার লোডিং ইভেন্টগুলি বন্ধনী করুন৷
Result<ulong> StartLoadingGroup(LoadingTimeMetadata eventMetadata, TAnnotation annotation);
এই ফাংশনটি প্রদত্ত মেটাডেটা এবং টীকাটির সাথে যুক্ত একটি লোডিং গ্রুপ শুরু করে এবং StopLoadingGroup()
ফাংশনে ব্যবহার করার জন্য একটি Result<ulong>.value
পূরণ করে। মেটাডেটা এবং টীকা বর্তমানে প্লে ব্যাকএন্ড দ্বারা ব্যবহৃত হয় না তবে শুধুমাত্র টীকাটিকে null
সেট করা যেতে পারে। সমস্ত পরবর্তী লোডিং ইভেন্টগুলি একটি অনন্য গ্রুপ আইডি দ্বারা ট্যাগ করা হয়।
ErrorCode StopLoadingGroup(ulong handle);
এই ফাংশনটি StartLoadingGroup()
দ্বারা পূর্বে শুরু করা একটি লোডিং গ্রুপকে থামিয়ে দেয়। StartLoadingGroup()
আবার কল না করা পর্যন্ত পরবর্তী লোডিং ইভেন্টগুলির একটি গ্রুপ আইডি থাকবে না।
চিত্র 1. লোডিং গ্রুপের উদাহরণ।
উদাহরণ
আপনার গেমে কীভাবে লোডিং টাইম ফাংশন যুক্ত করবেন তার কিছু উদাহরণ এখানে রয়েছে।
ফাইল লোডিং ইভেন্ট
নিম্নলিখিত কোড উদাহরণ দেখায় কিভাবে আপনার গেমে ফাইল লোডিং ইভেন্ট রেকর্ড করতে হয়।
public RawImage image;
IEnumerator LoadImageFromStreamingAssets(string imageName)
{
string imagePath = "file://" + Path.Combine(Application.streamingAssetsPath, imageName);
using (var r = UnityWebRequestTexture.GetTexture(imagePath))
{
LoadingTimeMetadata fileLoadingMetadata = new LoadingTimeMetadata()
{
state = LoadingTimeMetadata.LoadingState.InterLevel,
source = LoadingTimeMetadata.LoadingSource.DeviceStorage,
// Fields are zero by default but they could be set as follows
compression_level = 0,
network_connectivity = 0,
network_transfer_speed_bps = 0,
network_latency_ns = 0
};
Annotation annotation = new Annotation()
{
Scene = Scene.MagicalForest
};
// Start recording loading time.
Result<ulong> result = performanceTuner.StartRecordingLoadingTime(fileLoadingMetadata, annotation);
yield return r.SendWebRequest();
// Stop recording loading time.
performanceTuner.StopRecordingLoadingTime(result.value);
if (r.isNetworkError || r.isHttpError)
{
Debug.Log(r.error);
}
else
{
Texture2D tex = DownloadHandlerTexture.GetContent(r);
image.texture = tex;
}
}
}
দৃশ্য লোডিং ঘটনা
নিম্নলিখিত কোড উদাহরণটি দেখায় কিভাবে আপনার গেমের দৃশ্য লোডিং ইভেন্টগুলি রেকর্ড করতে হয়।
IEnumerator LoadScene(int sceneIndex)
{
LoadingTimeMetadata metadata = new LoadingTimeMetadata()
{state = LoadingTimeMetadata.LoadingState.InterLevel};
Annotation annotation = new Annotation() {Scene = (Scene) (sceneIndex + 1)};
Result<ulong> result = performanceTuner.StartRecordingLoadingTime(metadata, annotation);
AsyncOperation asyncSceneLoad = SceneManager.LoadSceneAsync(sceneIndex, LoadSceneMode.Single);
while (!asyncSceneLoad.isDone)
{
yield return null;
}
performanceTuner.StopRecordingLoadingTime(result.value);
}
গ্রুপ ফাংশন লোড হচ্ছে
নিম্নলিখিত কোড উদাহরণ দেখায় কিভাবে আপনার গেমে লোডিং গ্রুপ ফাংশন যোগ করতে হয়।
IEnumerator LoadImages()
{
LoadingTimeMetadata groupMetadata = new LoadingTimeMetadata()
{
state = LoadingTimeMetadata.LoadingState.InterLevel,
source = LoadingTimeMetadata.LoadingSource.DeviceStorage,
};
Result<ulong> result = performanceTuner.StartLoadingGroup(groupMetadata, null);
yield return StartCoroutine(LoadImageFromStreamingAssets("image1.jpeg"));
yield return StartCoroutine(LoadImageFromStreamingAssets("image2.jpeg"));
yield return StartCoroutine(LoadImageFromStreamingAssets("image3.jpeg"));
yield return StartCoroutine(LoadImageFromStreamingAssets("image4.jpeg"));
var stopErrorCode = performanceTuner.StopLoadingGroup(0);
}