現在、Windowsハンドヘルド向けのDevice Profileを作成しようと考えております。
GetRuntimeDeviceProfileName() と FWindowsPlatformMisc::IsDeviceHandheld() を組み合わせることで、基本的な実装は可能と考えておりますが、以下2点についてご教示いただけますでしょうか。
1. Windowsハンドヘルド向けDevice Profileについて
将来的なUnreal Engineのアップデートにおいて、WindowsHandheld のようなWindowsハンドヘルド向けDevice Profileを標準でサポートする予定はございますでしょうか。
もし今後対応予定がある場合は、独自実装との重複を避けるため、参考にさせていただきたいと考えております。
2. FWindowsPlatformMisc::IsDeviceHandheld() の利用について
IsDeviceHandheld() は、DEVICEFAMILYDEVICEFORM_GAMING_HANDHELD の判定をベースに実装されていると理解しております。
基本的には、各デバイスがこの値を適切に返すことを前提に利用する想定で問題ないでしょうか。
また、現時点で既知の制限事項や利用時の注意点、ハンドヘルド判定に関する推奨事項などがございましたら、ご教示いただけますと幸いです。
何卒よろしくお願いいたします。
お世話になっております。
1. 標準Device Profileの予定について
将来の対応予定については、確定した情報を持ち合わせておりません。私の把握している範囲では、UE 5.8時点でも WindowsHandheld のような標準Device Profileは含まれておらず、ハンドヘルド用プロファイルを自動で選ぶ仕組みも見当たりませんでした。
なお、5.8では本APIが FPlatformMisc::IsDeviceGamingHandheld() に改名されているようですので、アップグレードの際はご確認いただければと思います。また、Windows向けConfigRules (デフォルト無効) が追加されており、SRC_IsHandheld 変数で判定結果を参照でき、Profile 変数でDevice Profile名を上書きできるようです。
ご計画中の独自セレクター実装は、現時点では妥当なアプローチかと思われますし、標準実装と競合するものも今のところ見当たりません。標準対応のご要望があれば、エンジンチームにお伝えすることもできますので、お知らせください。
2. IsDeviceHandheld() について
ご理解の方向で問題ないかと思います。
ntdll.dll の RtlGetDeviceFamilyInfoEnum で DeviceForm が DEVICEFAMILYDEVICEFORM_GAMING_HANDHELD (0x2E) かどうかを判定しており、Microsoftが推奨している方法と同じもののようです。加えて、Steam Deck (LCD/OLED) についてはCPU名で判定するフォールバックが入っています。
前提としては概ね問題ないかと思いますが、この値はOEMとWindows側で設定されるものなので、対応済みの機種 では正しく返る一方、旧世代機では返らないケースもあるかもしれません。Steam Deck以外もカバーしたい場合は、GetDeviceMakeAndModel() などの追加判定を併用いただくのも一案かと思います。
判定は起動時に一度だけ行われてキャッシュされるようですので、動的な判定には向かないかと思います。古いOSでAPIが無い場合は false が返るようです。実機確認には起動ログの “Handheld Device: 0/1” が使えますし、テストには -DeviceProfile=<Name> や dp.Override が便利かと思います。
ご不明な点がありましたら、お気軽にお問い合わせください。
ご回答ありがとうございます。
大変参考になりました。
大きな懸念は無さそうですので頂いた情報を参考に進めたいと思います。