テクスチャ最大サイズについて
furafura 2021/01/21(Thu) 01:10
ある画像ファイルを読み込ませた所、何故か失敗するので不思議に思ったのですが、なんと縦が1万ドットを超える画像でした。
twitterでも言及されていましたが、openSiv3D 0.6にてImageの最大サイズ8192を16384に引き上げるとの事。
しかし、0.3では8192ですし、Imageだけ大きくなっても私の所では困ります。
https://siv3d.jp/bbs/patio.cgi?read=506&ukey=0
で教えていただいた、OpenSiv3D の再ビルドについて試してみました。(この件の続きは、次に記述させていただきます)
そのついでに、Image.hppのMaxWidthとMaxHeightを倍に操作して試した所、無事に読み込んで表示する事が出来るようになりました。
勝手ではありますが、差し支えなければテクスチャの最大サイズも、今後の更新で増やしていただけるとありがたく思います。
公にリリースする用途ならば、現状は、テクスチャ分割すべき大きさに思いますが、
実験や配布対象ではないプログラムのために、増やしていただくかビルドで変更出来るようですと助かります。
furafura 2021/01/21(Thu) 01:13
本スレッドのタイトルの件から外れますが御容赦下さい。
以下、見当違いかも知れませんし、検証に時間がかかってしまいましたが御報告させていただきます。
再ビルドでの
::FreeLibrary(m_xaudio28); をコメントアウトは試してみましたが、状況が変わる様子はありませんでした。
それで、困ったのでMemory ValidatorとDeleakerの試用版を用いてメモリリーク検出が出来ないかと導入。
正直使い方がもう1つわからずで、何か役立ちそうな感じがあるのはDeleakerでした。
結果としてはメモリリークを断定するようなものは見つからなかったのですが、例外が発生した時のDeleaker上の内容に、
CSystem::update()
内の
Siv3DEngine::Get<ISiv3DGamepad>()->update(onDeviceChange);
が高い頻度で出ていました。
マウスやキーボード等の入力中に落ちる感じ強かったため、
駄目元で
const bool onDeviceChange = false;
にして動作させてみたところ、数日間かつ長時間試している範囲では表面上大変良好です。
少なくとも突然終了する事が無くなりました。
私自身は当面ゲームパッドの類を用いる事は無いので、問題のPCでは接続も所有もしていませんでした。
私だけの技量ですと、これ以上の報告は難しいと思われます。
長文・乱文失礼しました。
Reputeless 2021/01/21(Thu) 21:59
ご報告ありがとうございます。
[1]
◆ 簡単に Texture サイズの上限を無くせるようにします。
テクスチャサイズの上限が 8192px になっているのは、
Direct3D 11 やその他のレンダリング API で保証されている最大のテクスチャサイズに合わせるためです。
ゲーム開発者の PC で 10000px の画像を読み込めても、
プレイヤーの PC で動作しない問題を避けるために制限を設けていました。
自分の環境のために、自前のビルドで定数を変更することは問題ありません。
OpenSiv3D v0.6 では Main.cpp にビルドオプション的なものを記述する機能が追加されます。
そのオプトインによって Texture サイズの上限を無くせるようにします(再ビルド不要にします)。
https://github.com/Siv3D/OpenSiv3D/issues/554
[2]
◆ 問題を回避できるよう設計を見直します。
原因の調査ありがとうございました。クラッシュを減らせる貴重な情報です。
オーディオよりも Siv3DEngine::Get<ISiv3DGamepad>()->update(onDeviceChange);
に問題がありそうということですね。
確かにデバイスの接続・取り外し時のクラッシュが、ここ数年で複数報告されています。
OpenSiv3D v0.6 では、様々なデバイスの接続・取り外しを繰り返し行うテストを行い、再現できないか試行します。
再現ができなかった場合でも、上記関数をスキップできるような方法を加えたいと思います。
外部デバイスを使用しない場合は const bool onDeviceChange = false;
というワークアラウンドで問題は生じません。ご不便をおかけしますが、v0.6 までお待ちください。
https://github.com/Siv3D/OpenSiv3D/issues/550#issuecomment-764633939
furafura 2021/01/24(Sun) 00:06
furafura 2021/01/24(Sun) 02:04
早速、役に立たない追加情報です。
まずライブラリのdebugの構成。
プロパティでC/C++→コマンドラインの追加のオプションにて、
/Z7
を付けてライブラリを構築。
それでサンプルを実行していると、
void CGamepad::update
の
::joyGetDevCapsW(userIndex, &caps, sizeof(caps)
で例外発生している感じです。
但し、
https://github.com/SFML/SFML/issues/1251
のように、
::joyGetPosEx
もくせ者かも知れません。
VS上では、
userIndex = 0
state.connected = false
の状態。
問題の環境ではジョイスティックの類が接続されていません。
以下推測に過ぎませんが、
state.connected
だけで弾いてAPI呼び出しを避ければ、
とりあえず例外は発生しなくなる感じがします。(試していません)
APIか何かドライバに問題がある場合、現在のコードでは対応出来ないかも知れないなと、
勝手に感じました。
他の回避や対応策があるのかもしれませんが……。