てくメモ

trivial な notes

索引

C# 型 言語機能 その他 Godot Engine C# 型 配列 【C#】一次元配列を二次元に回転 - てくメモ 【C#】多次元配列と Span - てくメモ 【C#】配列の部分的なコピー - てくメモ 【C#】配列のシャローコピー - てくメモ 【C#】降順(逆順)ソートと Reverse() - …

【Godot C#】R3.Godot のUI用便利拡張メソッド

現在プレビューリリースされている Rx ライブラリR3。Unity の R3.Unity にはUI用便利拡張メソッド群の UnityUIComponentExtensions が用意されているが、Godot にはなかった。 ver.0.1.6 までは。 PRを出して無事マージしてもらい、Godot でも同じような感…

【Godot C#】Cysharp の次世代 Rx ライブラリ「R3」を Godot で使ってみる

【追記】 この記事はR3のプレビューリリース時に書かれたものであり、正式リリース (2024/2/16) においては内容が符合しない部分があります。 Cysharp からプレビューリリースされた次世代 Rx ライブラリ、「R3」を Godot(ver. 4.2.1)で試す。 GitHub - Cy…

【C#】並列実行での数値カウント

C#

マルチスレッドの排他制御に関するある記事で、数値を操作するだけであってもInterlockedクラスよりlockステートメントの方がよい、と書かれていたのが感覚と異なったので、自分でも測ってみる。 単純なインクリメントを、Parallel.Forにより並列実行したベ…

【C#】スタック上に class インスタンスを錬成する

C#

以下のポストがきっかけ。 In .NET you can load a huge graph(s) of objects directly from a file and, basically, mmap it & register as a managed heap! GC won't waste time scanning/compacting/collecting it. Quick example of me registering stac…

【C#】長さを利用した CopyTo のJIT最適化を試す

C#

最初にきっかけとなったポストを示す。"why the _hacker version is faster?" ということなので、ポスト初見の場合、一度考えてもいいかもしれない。 Some JIT magic for you - both methods do the same work, why the _hacker version is faster? pic.twi…

【C#】ASCII文字に最適化された処理を提供する Ascii クラス(.NET 8~)

C#

.NET 8 から、ASCII文字に最適化された処理を提供するAsciiクラスが提供された。 Ascii クラス (System.Text) | Microsoft Learn Performance Improvements in .NET 8 - .NET Blog 文字列を扱う際、仕様上・あるいは事実上ASCII文字だけということは珍しくな…

【Godot Shader】2D Doodle エフェクトの作成

横着しようと AIに Unity 用シェーダーの Godot ポートをお願いしてみたところ、上手くいかなかった。 なので、手を動かして学習する。ここでは、Doodle エフェクト1を、Sprite2D にかけてみる。(Godot 4.x) 最初に成果物。以下の画像のような感じ。(外部…

【Godot C#】標準ライブラリと被っていない Mathf メンバー

Godot C# のMathfクラスは、GDScript の数学定数・数学関数に対応するメンバーを提供している。 そのなかには、C# における標準ライブラリ提供のメンバーとオーバーラップしているため、処理がそのまま委譲されているものもある。 独自に提供されている機能…

【Godot C#】Godot C# における Rx、または ProcessAsObservable を自前で用意する方法

【追記】 UniRx の Cysharp から次世代 Rx ライブラリがリリースされ(2024/1~)、明示的に Godot がサポートも含まれています。オレオレ Rx をする理由がなくなりました。 Godot における Rx (Reactive Extensions) について、GDScript には GodotRx があ…

【Godot C#】async/await な流れで落ち物ゲームをつくる

本記事は、Godot Engine Advent Calendar 2023 参加記事となっています。 空きのある日があったので、枯れ木も山の賑わいとばかりに参加させていただきました。不勉強な部分があるかと思いますが、よろしくお願いいたします。 以下の画像(外部サイト投稿の …

【C#】分岐最適化時代の Compare の書き方

C#

※ 大仰なタイトルですが、下記記事の一部分を引き伸ばした内容になります。 Performance Improvements in .NET 8 - .NET Blog 上記記事の Branching の項目で、分岐レス化による最適化が解説されている。 詳細は元記事参照として、Compare 的な処理が例とし…

【C#】Span<byte>.SequenceEqual に代えて数値型で == する方法の確認

C#

下記スライドを学習した際、記事名の内容の効用が気になったので、マイクロベンチマークする。 CEDEC 2023 モダンハイパフォーマンスC# 2023 Edition - Speaker Deck byte列の照合を取る際は通常、SequenceEqualメソッドを用いる。比較するReadOnlySpan<byte>が静</byte>…

【C#】辞書の key への列挙型の利用

C#

enumを数値型にキャストして辞書の key にする、というコードを見たのをきっかけ。enumそのままとintにキャストした key で比較。 結論から言えば、単純な get/set のマイクロベンチマークでは有意な差はなかった。 レガシーな環境以外では実益はなさそう? …

【C#】2つの float が概ね等しいかを得る処理の確認

C#

実用のうえで、近似した2つの浮動小数点数(この記事ではfloat)を等価として扱いたい場合がある。 Console.WriteLine(0.2f * 0.1f == 0.02f); // False // ⇧ 実用のうえで、True として扱ってほしい 記事現在、標準ではその機能を直接提供するメソッドはな…

【C#】null許容型のイディオム

C#

null許容型(プロジェクト設定に応じてT?型または参照型)をパターンマッチングでさっと扱うコードを見て、まだ頭に馴染んでなかったと感じたので記事に書いて馴染ませる。 ついでにパターンマッチング以外も整理する。 null 条件演算子 (?. / ?[]) null 合…

【C#】デリゲートを取る引数に ラムダ式 / 各種メソッド / ローカル関数 を渡した際の違いを確認する

C#

自分の認識と少し状況が変わっているという話を見聞きし、まとめて確認。 ラムダ式、インスタンスメソッド、staticメソッド、拡張メソッド、ローカル関数を渡す メンバーやローカル変数をキャプチャしないのを前提 .NET 8 / C# 12 ケースをフォーカスしてし…

【C#】DefaultInterpolatedStringHandler を StringBuilder 的に使う

C#

本記事は、C# Advent Calendar 2023 12日目参加記事となっています。 11日目:【C#】抽象クラスとインターフェースを併用する理由を考えた by @seiya2130 13日目:ISpanFormattableを使おう by @Shaula C#において、複雑な文字列を組み立てる手段として挙げ…

【C#】FakeTimeProvider と FakeLogger を試す

C#

.NET 8 の目玉のひとつに時間抽象化があり、それを利用したFakeTimeProviderが提供された。 (.NET 8~) また、同様に Fake を冠するロガーとして、FakeLoggerが提供された。 (.NET 8~) FakeTimeProvider クラス (Microsoft.Extensions.Time.Testing) | Micr…

【C#】OrderBy(_ => Guid.NewGuid())

C#

.NET 8 で標準のシャッフルが用意されたということで、OrderBy(_ => Guid.NewGuid())との差を確認しておいてみる。 念のため触れておくと、OrderBy(_ => Guid.NewGuid())は、本来ソートに使うメソッドに本来Guidとして生成する数値を渡し、シャッフルとして…

【C#】.NET 8 で Random クラスに追加された Shuffle と GetItems の中身の確認

C#

.NET 8で追加されたRandom.ShuffleメソッドとRandom.GetItemsメソッドの中身を確認しておく。(.NET 8.0 リリース時点) 前者はシャッフル、後者は選択肢の中からランダムに選ぶ(よその名前では choice とか sample とか)もの。 なお、System.Security.Cry…

【C#】コレクション式 : 独自型でコレクション式を使ってみる (CollectionBuilder 属性)

C#

C# 12 で導入されたコレクション式は、CollectionBuilderAttributeを用いることで、独自型にも導入できる。 公式ドキュメント ・コレクション式 (コレクション リテラル) - C# | Microsoft Learn ・CollectionBuilderAttribute クラス (System.Runtime.Compi…

【C#】コレクション式 : ILを見てどういう中身か掴む(Span, ReadOnlySpan, 配列, List)

C#

C# 12 で導入されたコレクション式について、従来型の記述などとILを簡単に見比べておくもの。(.NET 8.0 リリース時点、ILSpy使用) コレクション式についての参考リンク ・コレクション式 (コレクション リテラル) - C# | Microsoft Learn ・コレクション…

【C#】文字列から<T>型への汎用コンバート : IParseble<TSelf>

C#

IParsable<TSelf>というインターフェースがある。(.NET 7~) https://learn.microsoft.com/ja-jp/dotnet/api/system.iparsable-1?view=net-8.0 実装している型は、ParseメソッドとTryParseメソッドを持つ。 例えば以下のように使える。 public T ConvertByIParsab</tself>…

【C#】SearchValues<char> を測ったら桁違いに速かった

C#

Youtubeの動画みたいな記事タイトル。でも実際速い。 SearchValues<T>は .NET 8 から入った効率的な検索用に最適化された型。 SearchValues.Createメソッドから生成したSearchValues<T> (.NET 8.0 現在、Tはchar/byte) を、Span<T>.IndexOfAnyメソッドなどに渡して用</t></t></t>…

【C#】ReadOnlySpan<T>最適化の確認

C#

以前、最適化によりbyte[], sbyte[]がゼロアロケーションとなる場合を確認した。 【C#】ゼロアロケーションバイト列 - てくメモ これについて、現在1は対象が拡大している。 参考 ・コレクション式 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C …

---

【追記】この記事について、SignalAwaiterを試すにあたって悪いTaskの扱い方(※)をしており、にもかかわらず微妙に検索からのアクセスがあるようであり、冒頭明記のうえ記事名を削除しました。※ 完了しないTaskがさまようGodot の Getting Started をやって…

【雑記】Godot 入門「最初の2Dゲーム」を履修する前に知れたらよかった情報

記事現在、公式入門記事「最初の2Dゲーム」の日本語版は最新版(ver. 4.1)に対応していないが、英語版(たぶん原文)は対応している のでそちらを参照するとよい。 Your first 2D game — Godot Engine (stable) documentation in English(英語版へのリンク…

索引

型 その他 型 配列 【C#】一次元配列を二次元に回転 - てくメモ 【C#】多次元配列と Span - てくメモ 【C#】配列の部分的なコピー - てくメモ 【C#】配列のシャローコピー - てくメモ 【C#】降順(逆順)ソートと Reverse() - てくメモ Span 【C#】Span.Over…

【C#】ジェネリック型引数の型の new()

C#

ジェネリック型引数の型のインスタンスを作成したいという場合がある。このときはまず、型制約のnew()制約が考えられる。 public interface IInterface { } public IInterface GenericNew<T>() where T : IInterface, new() { return new T(); } ただ、これは内</t>…