「プログラミング」に関する日記(3)

プログラミング関係の話題。プログラミングコーナーを更新したとか、プログラミングの内容に踏み込んだ話とか。

<前 次>

Unity

先日GodotのDPI対応について調べたので、今度はUnityも調べてみました。
画像は割愛しますが、Godotがシステムで、Unityはモニターごと(v2)。

システムは、解像度がメインモニター基準固定で、別ディスプレイに行くと機械的に拡大縮小されてぼやけます。
最初の解像度対応さえちゃんとすれば後は全自動で、Godotは最初の起動時の状態をドットバイドットの表示にします。

モニターごとは、各モニターごとに解像度が再設定されます。
そのため、画面が切り替わるごとに処理が発生します。
起動時の状態は、Unityでもドットバイドットになりますが、別モニターに行くと結局拡大縮小が発生します。
ここで、3Dならば、解像度をちゃんと切り替えたうえで、新しい解像度でドットバイドットになるようにレンダリングできます。
しかし、2Dの場合、SVGみたいなベクターグラフィックでまない限りは、ドット数固定で、別解像度など存在しないので、機械的に拡大縮小するしかなく、やはりぼやけてしまいます。

うーむ、3DならUnityのほうが強いけど、2Dだと実質変わらないってことか。
2Dの作りやすさでいえば、Godotのほうがやりやすく感じたし、2Dゲーム開発するときはGodotを先に考えるようにしてみよう。

Godot


ふにゃ1を移植することを念頭に、ドット絵が動表示されるのか確認。
メインディスプレイでは、1枚目のように、原寸で表示。
ディスプレイの拡大率は200%に設定されていますが、拡大されずに表示されています。
より正確に言うと、ゲーム本体ではない外枠だけが拡大されています。


これを、拡大率100%のサブディスプレイに移動すると、全体が200%→100%で半分サイズになって、ドットが潰れました。
ゲームはマルチディスプレイ環境でもメインディスプレイだけで遊ぶことがほとんどだとは思いますが、一応注意が必要かもしれませんね。

具体的にどう注意するのか…というと、それはまあ、ゲーム画面の物理ピクセル数を見て個別に判断する…ってことになるかなぁ。

アンパンマンDBとWinUI 3

アンパンマンDB(記事更新)

来週の放送情報。
再放送ですな。

WinUI 3

MediaPlayerElementで今表示されている映像を静止画として使いたいけどやり方がわからぬ…。
MediaPlayer.IsVideoFrameServerEnabled プロパティあたりを使えば何かできそうな気はするけど、これを使うと画面に表示されないし…。

WinUI 3(Today I Learned)

スレッド機能の移行 - Windows apps | Microsoft Learn
WinFormsでも厄介だった非同期処理でのUI処理。
WinFormsで使ってた方法そのままは無理なので、ちょっと違う方法になります。
とはいえ、使うメソッドが変わっただけで、メソッドを一枚噛ませてやるという構造自体は変わらない模様。

ListViewBase.ScrollIntoView メソッド (Windows.UI.Xaml.Controls) - Windows UWP applications | Microsoft Learn
そんでもってこっち。
ListViewはプログラムで選択を変えても自動でそこまでスクロールしないので、同じくプログラムでスクロールさせてやる必要がありました。
とはいえ、どこまでスクロールするかを指定する必要はなく、メソッド一つでよしなにしてくれます。

アンパンマンDBとWinUI 3

アンパンマンDB(記事更新)

コラムから転記。
転記元の時点で文章がおかしな部分があったので、コラムともども修正しています。

WinUI 3(Today I Learned)

データ バインディングの詳細 - UWP applications | Microsoft Learn
これまで「Binding」によるバインディングしか使ってなかったけど、「x:Bind」によるバインディングも調べてみました。
「Binding」が動的に解決するのに対して、「x:Bind」は静的に解決するということ。
つまりまあ、コーディング中にもう既にどこからデータが来るのかわかっているということですな。
で、コーディング中に既に分かっているので、インテリセンスがどんどん自動的に候補とかを出してくれるし、実行中にデータを探しに行ったりしないので、動作も高速と。
「Binding」でしんどい部分があったから「x:Bind」を調べ始めたんですが、思ったよりだいぶいいですね。
もちろん、やりたいことを全部簡単に完全にできるというわけではないですが。

アンパンマンDBと.NET 9

アンパンマンDB(記事更新)

来週の放送情報。

.NET 9

Visual Studio本体のバージョンを上げたら.NET9が使えるようになっていました。
WinUI3試してるプロジェクトでもさっそく適用。
今のところ、ビルドが問題なくできたのを確認できただけで、新機能とかはまだ見ていません。
C#13も使えるはずなんで、コードがもっといい感じになるはずなんですよね。
いつもの流れなら、普通にプログラムを組んでいたら、コード解析が新機能を提案してくるという形で触れることになると思いますが。

アンパンマンDBとWinUI3

アンパンマンDB(記事更新)

コラムから転記。

WinUI3(Today I Learned)

ピッカーでファイルやフォルダーを開く - UWP applications | Microsoft Learn
Windows App SDK, WinUI3, Desktopでファイル選択ダイアログを表示する #C# - Qiita
ファイルダイアログを開く方法。
やっぱりWinUI3でもファイルの読み書きはしたいですからね。
エラーなく動かすためには気持ち悪いおまじない書かないといけないというのが残念なところ。
将来的に開発が進んで不要になったらいいけど、マイクロソフトのこれまでから考えると、普及しないまま開発が止まって立ち消えるというのもありうる…。

WinUI 3

Config.Netで設定読み書きうまくいきました。
デフォルト値とか項目名の別名作れたりするし、初期値→設定ファイルで上書き→コマンドライン引数でさらに上書きみたいなこともできるし、ファイルから読み込んだ設定は自動で同じファイルに保存されるし、標準のWindows.Storage.ApplicationDataよりむしろ便利。
あとは、CommandBarでツールバー的なものを作ってみたり、ページ遷移で値を受け渡すのとかやってみたり。
着実に作りたいものに近付いてきた感があります。
まあ、作ってるのは一般公開しない自分専用ツールですけどね。

アンパンマンDBとWinUI 3

アンパンマンDB(記事更新)

来週の放送情報。

WinUI 3

Windows.Storage.ApplicationData使ったら使ったでエラーが起きました。
Unpackagedだと制限かかるみたいね。
昨日紹介した記事の後半に書いてあったConfig.Netならいけるのかな?

アンパンマンDBとWinUI 3

アンパンマンDB(記事更新)

Blu-rayの情報出るの待ってたんだけど、結局なさそうだったので、DVDの情報を追加。

WinUI 3(Today I Learned)


設定ファイルはどうするのかなって思って昔ながらのSettings.settings追加してみたらこの通り。
参照が足りないといわれつつも、必要な参照は候補に出ず、どうやら昔と同じ方法では動かないようです。

Recommended way of doing user settings with WindowsAppSDK 1.0? · microsoft/WindowsAppSDK · Discussion #1478
ここを見る感じ、UWPのやり方を踏襲して、Windows.Storage.ApplicationDataを使うのがいいのかな。

アンパンマンDBとXdebug

アンパンマンDB(記事更新)

コラムからの転記。
この程度なら毎日いっぱいやってもいいのにね。

アンパンマンDB(システム)

リストをNULL検索できないバグを修正しました。
ただ、今のところ、何もない項目はNULLじゃなくて空文字列が入っているので、実質的に影響はありません。

Xdebug

Xdebug - Debugger and Profiler Tool for PHP
Xdebug導入しました。
すなわち、Xdebug使わない縛り辞めました。

もともとデバッガとしては、PHP標準のphpdbgを使ってました。
PHPUnitのカバレッジもphpdbgだったんですが、PHPUnit10以降(最新版は11)には使えなくて、phpdbgのために古いのを使う続けるのも厳しいなって思ってました。

カバレッジ計測の選択肢としては、PCOVもあったんですが、あんまり更新されてなさそうだったし、カバレッジ「だけ」というのもどうかと思ったので、デバッグ並びにカバレッジ計測の定番、Xdebugを導入した次第です。

そもそもXdebugを避けてphpdbgを使っていたのは、XdebugはPHP標準に入っていないというのと、カバレッジ計測が遅いという話を聞いたからだったのですが、実測してみると、今はXdebugのほうがphpdbgより1割ほど早く終わりました。

WinUI 3(Today I Learned)

DataGrid - Windows Community Toolkit | Microsoft Learn
ListView クラス (Microsoft.UI.Xaml.Controls) - Windows App SDK | Microsoft Learn
これまでDataGridViewとかでやっていたことをやろうと思ったら、素直に考えればDataGrid。
ただ、WinUI 3では標準機能ではなく、NuGetでライブラリとして導入する必要があります。
標準機能にあるListViewは、ヘッダ表示とかは期待できませんが、テンプレートをうまく使えば、複数列表示も可能です。
外部依存を不必要に増やすのはあまり面白くないし、いったんListViewを試してみようかな。

Godot Engine

Godot Engine - Free and open source 2D and 3D game engine
インストールしてみました。
funyak、実質開発凍結みたいな状況ですが、あきらめたわけじゃないので、C#で作ったロジックを乗せられるゲームエンジンを、Unity以外でも考えてたんですよね。
で、とりあえず最新版の4.3をインストールしてみたんですが、C#+HTMLの組み合わせは4系ではまだできないらしかったので、3系最新の3.6も入れました。

Unityはシーン遷移がよくわからないまま積んでしまったので、Godotのほうはシーン周りを早めに調べておこうと思います。
やっぱりシーン遷移があると、タイトル画面を出せて、見た目にも映えますからね。

あと、Steamのゲームでよく見かける、日本語が中華フォントで表示する問題への対応は、早々に調べました。
言語設定をはっきり明示することでフォントの優先順位を正しくできるってことですね。
そう考えると、国際化対応は、言葉そのものだけじゃなく、言語設定やフォントにも気を使う必要があるってことになりますね。

HTMLとGitHub Copilot

HTML

以前修正したHTMLと、あの後もちまちま作業してたHTML、順次アップ中。
エラーが起こらないかどうかと、デザイン崩れの目視確認もしながらなんで、あんまり進んではないです。

GitHub Copilot

GitHub Copilotちょっとお試し中。
コミットメッセージ生成が便利かなと思ったけど、何でもかんでも「読みやすさのためのリファクタリング」扱いしてくる印象。

プログラミングとドラゴンクエスト10

プログラミング

予告通り、更新しました。
やっぱり選択ソートじゃねえか!

ドラゴンクエスト10(全員)

銃士ナスビス

  • クエスト「まもの博士の研究レポート」をクリアした!

時機を逃して同盟を組めずずっとできてなかったのですが、この度全員クリアしました。

毎月10日はDQ10で遊ぼう! ~もうすぐ協力チャレンジバトル開催! 仲間モンスター大特訓!!~ (2024/9/3)|目覚めし冒険者の広場
このイベントですな。
ァォィョッュはソロ派なので、極力同盟組まずに頑張りたかったのですが、やっぱり無理だったのでここは妥協して同盟組んでクリアしました。

他の写真は以下から。
写真置き場「2024/09/10」

highlight.js

highlight.js
シンタックスハイライト調整、以前から使っていたものではありますが、highlight.jsを使うことにしました。
ただし、今度は最新版の11.10.0。
ちょっと使い方が変わっていました。

で、動作確認も兼ねて「言語ごとに空ループ&バブルソートの速度比較」を書き直していたのですが、C#のバブルソートのコードが動かないものだったので、書き直しました。
そもそもバブルソートかすら怪しいけど。
確認してから明日アップする予定です。

WinUI 3(Today I Learned)

MediaPlayerElement クラス (Windows.UI.Xaml.Controls) - Windows UWP applications | Microsoft Learn
WinUI 3で動画再生するにはMediaPlayerElementを使えばいいみたい。
メディアプレイヤーを作りたければメディアプレイヤーを使う、わかりやすくていいね!
ただ、1コマ戻す機能が1/24秒固定だったり、妙なところで不便さがある感じ。
1コマ進めるほうはちゃんと1コマのようだけど。

WinUI 3

埋め込みリソースから画像を表示する方法がわからん。
実行ファイルやDLLと一緒にファイルとして配置したものから表示するのは簡単にできたけど。
本来はパッケージ化して使うものだからファイルとして配置しても大丈夫ってことなのかな。
非パッケージ化で使いたいんだけどな。

WinUI 3

高DPI対応、そもそも古いフレームワークで対応しようとするから面倒なんじゃないかと考えて、現状最新の.NET用Windowsデスクトップアプリケーション用フレームワーク「WinUI 3」を試してみました。
WinUI 3 - Windows apps | Microsoft Learn

UWPみたいに新しめなUI使えて、それでいてUWPみたいな制限は少なく、普通のEXEファイルとしてもビルドできます。
任意のプロセスの起動とか、Windows APIも呼び出せます。
もちろん、高DPI対応は、もっとも正確にDPI対応が行われるPerMonitorV2。

試しに画像と文字を置いてみました。


これは等倍。
画像ははっきりくっきり、文字も普通にいい感じですね。


これが200%。
画像は拡大されました。
ぼやけてしまいましたが、元の解像度が低かったし、これが本来の動作なのでとりあえずOKです。
文字はより一層はっきりくっきりして、高DPIに求めているものがしっかり出てくれた感じですね。

複数ウィンドウを扱うのができるかどうかが今ちょっとわからないのですが、一画面で収まるものなら問題なくできそう。

あと、DPI変更に反応して画像を差し替えるみたいなこともできたらいいですね。
このあたりかな。
How to get DPI with WinUI 3? - Microsoft Q&A

アンパンマンDBとDPIAware

アンパンマンDB(記事更新)

来週の放送情報。
再放送ですね。

DPIAware

いつぞやの高DPI対応、ちゃんとドットバイドットで表示させたいアプリ作りたくなってきたので、本格的にあれこれ試してみようかなと思ってます。
考えているユースケースがサブモニター用なので、しっかりとPerMonitorV2に対応させていきたいところ。
まずは単にDPI無視(拡大率によらず同じドット数で表示され、見た目の大きさがモニタごとに違う)から始めようかと。
一応、WPFでやるつもりです。

<前 次>