SQLiteDBからの結果が入力されるメニューをUnityで作成しました。ただし、メニューを作成すると、DBにクエリを実行している間、ゲーム全体が一時的にフリーズします。
これを修正するために、メニューの作成とデータの入力を分離しようとしています(つまり、クエリが完了するまでメニューに「読み込み中」と表示されます)。
私はこれを行うためにyield-returnコルーチンを使用しようとしていますが、ゲームはまだフリーズしています。以下に、私が行っていることを示すいくつかの擬似コードがあります...
void createMenu () {
// code to create menu...
StartCoroutine(getData());
}
IEnumerator getData () {
List<string> sqlResults = Database.query("SELECT * FROM table");
yield return null;
updateMenu();
}
void updateMenu() {
// replaces "loading" strings with sql data results
}
私はこれを間違った方法で行っていますか、それともコルーチンを間違って使用していますか?
データベース操作がメインスレッドをブロックしているようです。ThreadPool.QueueUserWorkItem
関数を使用して新しいスレッドで実行します。完了したらUnityThread.executeInUpdate
、この投稿の関数を使用して関数を呼び出しupdateMenu()
ます。このソリューションを使用するにはUnityThread
、この投稿からクラスを取得する必要があります。
void Awake()
{
UnityThread.initUnityThread();
}
void runQuery(string query)
{
ThreadPool.QueueUserWorkItem(RunInNewThread, query);
}
private void RunInNewThread(object a)
{
string query = (string)a;
List<string> sqlResults = Database.query(query);
//We are in another Thread. Use executeInUpdate to run in Unity main Thread
UnityThread.executeInUpdate(() =>
{
updateMenu();
});
}
使用法:
runQuery("SELECT * FROM table");
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加