icon

もうこんな時間かぁ。何もしてない訳では決してないんだけど、もうかぁ

icon

記事読んでの違和感から、検証して自分の勘違いに気が付いたのは良い事だけど、割としょうもない事過ぎてあんまり達成感ない

icon

JavaScriptでも切り替える余地が無かったら同じやでって記事があった。記憶違いかぁ。
JavaScriptはシングルスレッドで実行される \#JavaScript \- Qiita

JavaScriptの非同期処理の歴史 \#JavaScript \- Qiita
あと、JavaScriptにasync/awaitが入る前の非同期処理が、どんなだったか順番に分かる記事もあったのでメモ。

Web site image
JavaScriptはシングルスレッドで実行される - Qiita
Web site image
JavaScriptの非同期処理の歴史 - Qiita
Attach image
icon

見直したらasyncメソッドの中でうっかりawait書いてて草。何の検証にもなってなかった。
改めてasyncメソッドでawait書かなかったら、同期メソッドの様に動いた。

[Warning] CS1998: この非同期メソッドには 'await' 演算子がないため、同期的に実行されます。'await' 演算子を使用して非ブロッキング API 呼び出しを待機するか、'await Task.Run(...)' を使用してバックグラウンドのスレッドに対して CPU 主体の処理を実行することを検討してください。
あとideoneじゃなくVisualStudioに書いたら、普通に警告も出てた。
中でawait書いてないのにasyncメソッドにする事、普通に実装してる時に確かにしないかもしれない。

ノンブロッキングなのを呼びもせず、メインスレッドでループ回ってたら切り替える余地もないって事か。
なるほどと思いつつ、昔のJavaScriptでは非同期のつもりでループ回して問題なかった様な気もしている。まぁもうよく覚えてないけど。
using System;
using System.Diagnostics;
using System.Threading.Tasks;
 
public class AsyncMethods {
    public async Task FirstMethodAsync() {
    	Console.WriteLine("First async method started.");
        Stopwatch stopwatch = Stopwatch.StartNew();
        while (stopwatch.ElapsedMilliseconds < 1000) {}
        stopwatch.Stop();
        Console.WriteLine("First async method completed.");
    }
 
    public async Task SecondMethodAsync() {
        Console.WriteLine("Second async method started.");
        Stopwatch stopwatch = Stopwatch.StartNew();
        while (stopwatch.ElapsedMilliseconds < 500) {}
        stopwatch.Stop();
        Console.WriteLine("Second async method completed.");
    }
}
 
public class SyncMethods {
    public void FirstMethod() {
        Console.WriteLine("First sync method started.");
        Stopwatch stopwatch = Stopwatch.StartNew();
        while (stopwatch.ElapsedMilliseconds < 1000) {}
        stopwatch.Stop();
        Console.WriteLine("First sync method completed.");
    }
 
    public void SecondMethod() {
    	Console.WriteLine("Second sync method started.");
        Stopwatch stopwatch = Stopwatch.StartNew();
        while (stopwatch.ElapsedMilliseconds < 500) {}
        stopwatch.Stop();
        Console.WriteLine("Second sync method completed.");
    }
}
 
public class Program {
    public static async Task Main() {
        AsyncMethods asyncMethods = new AsyncMethods();
        SyncMethods syncMethods = new SyncMethods();
 
        syncMethods.FirstMethod();
        syncMethods.SecondMethod();
 
        Task firstAsyncTask = asyncMethods.FirstMethodAsync();
        Task secondAsyncTask = asyncMethods.SecondMethodAsync();
 
        await Task.WhenAll(firstAsyncTask, secondAsyncTask);
        Console.WriteLine("All methods have completed.");
    }
}
https://ideone.com/pWJCKO

icon

ご飯食べると暑さが限界突破する

icon

おなか空いた

icon

try catchしてどうなるかを確認してみた。
Unity loggingの
Log.Error()だとちゃんとStacktraceが出て、例外の発生行が分かった。
とはいえハンドリングの不要な例外を全部catchするのはmain()関数もないUnityでは無理だし、Stacktraceが失われてる訳じゃないなら、未catchのもうまい事やって欲しい所。

Debug.LogException(e)の場合、10行目はDebug.LogException(e)なので発生行分からず

Object reference not set to an instance of an object
UnityEngine.Debug:LogException(Exception)
TryException:Start() (at Assets/TryException.cs:10)

Unity.Logging.Log.Error(e)

の場合、発生行が分かる。正確には17じゃなくて18行目だと思うが

"System.NullReferenceException: Object reference not set to an instance of an object
  at TryException.ThrowException () [0x00000] in E:\dev\unity\try-unity-logging\Assets\TryException.cs:17 
  at TryException.Start () [0x00000] in E:\dev\unity\try-unity-logging\Assets\TryException.cs:8 "
TryException:Start() (at Assets/TryException.cs:11)

throw e

の場合、未catchと当然同じく発生行分からず

Object reference not set to an instance of an object
UnityEngine.Debug:CallOverridenDebugHandler(Exception, Object)

以下、挙動確認用のコード。LoggingConfigの方は前回から変わらず。
using System;
using UnityEngine;

public class TryException : MonoBehaviour {

    private void Start() {
        try {
            this.ThrowException();
        } catch (Exception e) {
            Debug.LogException(e);
            Unity.Logging.Log.Error(e);
            throw e;
        }
    }

    private void ThrowException() {
        string[] array = null;
        Debug.Log(array.Length); // 故意にnull参照エラーを発生させる
    }
}

icon

寝る前は膨れてた水ぶくれが、起きたら萎んでた。穴が開いてる様子はない。中の液はどこに行ったんだろう?

icon

あーしまったこんな時間。今日もソシャゲの日課をやってなかった・・・
昨日は忙しかったからだけど、今日は休日だから勝手にやらなかっただけではあるが。30分でなんとかやらんと

icon

Unity loggingでRedirectUnityLogs(log: true)だと、未catchの例外のStacktraceが消滅してしまう問題を追いかけている。とりあえず1.0.16でも1.2.0でも残念ながら変化は無かった。

Unity logging未使用 or
RedirectUnityLogs(log: false)の場合...

NullReferenceException: Object reference not set to an instance of an object
TryException.ThrowException () (at Assets/TryException.cs:10)
TryException.Start () (at Assets/TryException.cs:6)

RedirectUnityLogs(log: true)

の場合...

Object reference not set to an instance of an object
UnityEngine.Debug:CallOverridenDebugHandler(Exception, Object)

未catchの例外のStacktrace見れないのはつらいから、
RedirectUnityLogs(log: true)は諦めるしかないだろうか・・・

以下、挙動確認用のコード
using Unity.Logging;
using Unity.Logging.Sinks;
using UnityEngine;
using Logger = Unity.Logging.Logger;

public static class LoggerConfigure {
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    public static void Initialize() {
        Log.Logger = new Logger(
#if UNITY_EDITOR
            EditorConfiguration()
#endif
        );
    }

    private static LoggerConfig EditorConfiguration()
        => new LoggerConfig()
            .SyncMode.FatalIsSync()
            .RedirectUnityLogs(log: false)
            .WriteTo.UnityEditorConsole();
}
using UnityEngine;

public class TryException : MonoBehaviour {

    private void Start() {
        this.ThrowException();
    }

    private void ThrowException() {
        string[] array = null;
        Debug.Log(array.Length); // 故意にnull参照エラーを発生させる
    }
}

Attach image
Attach image
icon

Packages/manifest.json書き換えてUnity logging 1.2.0にする分には普通に入る。依存解決でburst, collectionsのバージョンも上がって、test-frameworkとかも入るみたいだけど、別に問題は無さそう。
少なくとも、Unity logging 1.2.0が入った状態で即Consoleにエラーが出るとかは無い。

https://docs.unity3d.com/Packages/com.unity.logging@1.2/changelog/CHANGELOG.html
一方で、Changelog見ると1.2.0は"*Release Preparation"とだけ書いててなんか変。1.2.0はなんかの間違いだったりするんかな?
1.1.0はリリースされなかったみたいなので、実は1.0.16が正式なリリースでは最新とかか?よく分からん。

https://github.com/needle-mirror/com.unity.logging/compare/1.0.16...1.2.0
Misskeyは長文行けるからついでに1.0.16...1.2.0の差分URLも置いとこ

Web site image
Comparing 1.0.16...1.2.0 ?? needle-mirror/com.unity.logging
Attach image
Attach image
icon

UnityプロジェクトにインストールされてるUnity Loggingと、ドキュメントで見れる最新バージョンが違う・・・
https://docs.unity3d.com/Packages/com.unity.logging@1.2/manual/index.html

ドキュメントではUnity Logging@1.2がUnity 2022.3.11f1以上で使える風に書いてある。
けど、Unity 2022.3.12f1にインストール出来るのは1.0.16。
なんで1.2が提示されないんだろう?

Attach image
Attach image