無題
furafura  2015/01/09(Fri) 18:38
以下のプログラムは、解像度に合わせて表示テクスチャの大きさを変える事を意図しております。

環境によって随分挙動が違うのですが、記憶違いでなければNovember 2014以前は、試した範囲で意図した結果だったと思います。
開発機では問題無かったので甘くみておりました。
3台それぞれハードウェア構成は異なります。

心苦しい限りですが、何か間違いがありましたら御指摘願えますでしょうか?

void Main()
{
// テクスチャを画像ファイルからロード
const Texture texture(L"Example/Windmill.png");

/* 最大解像度を設定 */
Point val = {0,0};
std::vector<Point>::iterator iter;
std::vector<Point> reso = Graphics::GetFullScreenSize();
/* フルスクリーンの最大解像度を求める */
for(iter = reso.begin(); iter != reso.end(); ++iter){
if(val.x * val.y < (*iter).x * (*iter).y) {
val = *iter;
}
}
// Window::SetFullscreen(false, val);
// Window::SetFullscreen(true, val);
Window::SetStyle(WindowStyle::NonFrame);
Window::Resize(val);
Window::SetPos(0, 0);

int putx, puty, wx,wy;

Point CWXY = Window::Size();
wx = texture.width;
wy = texture.height;

////// 解像度に画像を合わせてセンタリング
// 比率
double rateX = (double)CWXY.x / wx;
double rateY = (double)CWXY.y / wy;
double minRate = Min(rateX, rateY);
// サイズ計算
int newSizeX = (int)Round(wx * minRate);
int newSizeY = (int)Round(wy * minRate);

putx = (CWXY.x - newSizeX) >> 1;
puty = (CWXY.y - newSizeY) >> 1;

while (System::Update())
{
texture.scale(minRate).rotateAt({ 0, 0 }, Radians(0)).draw(putx, puty);
}
}
furafura  2015/01/09(Fri) 18:39
済みません、題名入れ忘れました。
Reputeless  2015/01/10(Sat) 13:01
調査します。
お手数ですが、具体的に結果がどう異なるか、
スクリーンショット or おおよその図を添付してください。
furafura  2015/01/10(Sat) 13:30
情報不足で御迷惑をお掛けしております。
スクリーンショットの手を思いつきませんで試してみましたが、それ上では無問題でした。正しい結果です。
以下の説明で不足の場合、実機上の画像を撮影してお出しする方法か、絵図を描く方法となりますね。

見た目の始点0,0からズレている場合があり、はみ出して表示される感じです。拡大が過ぎる状態とでもいいましょうか。
巧くいってるのは、自作機でAMDのカード、失敗しているのはメーカー製でintelのチップで表示されています。
表示結果は一定です。

メーカーPCはVAIO duo11初代機、もう1台が富士通のQH55/Mとなります。

訂正です。見た目の始点はセンタリングしてるのでズレるのは当然ですが、ズレ方が大きいという意味です。
計算された数値をデバッガ等で追っている限り、画面内に収まっているはずが、はみ出している、というのが今回起きている現象です。
furafura  2015/01/10(Sat) 13:53
汚い画面で恐縮です。
QH55/MでVAIO duo11の画面を撮影しました。
QH55/Mの結果だと、風車が見えないほど拡大されています。

またこの作業中、別件で申し上げましたduo11での例外が発生しまして、スリープしてなくても発生する感じです。



Reputeless  2015/01/10(Sat) 14:34
ご返信ありがとうございます。

DPI の設定が関連していると思われます。
お手数をおかけしますが、以下の追加情報をご提供いただけると幸いです。

[1]
a) PC のカタログ上の解像度
と、表示のずれが生じる際の
b) Windows で設定している画面の解像度
c) Println(Window::GetState().screenSize); で得られる解像度
d)Println(Graphics::GetFullScreenSize().back()); で得られる最大フルスクリーン解像度
の 4 つ

[2]
コントロールパネルのディスプレイの設定(画像参照)で
a) スライダーがどの位置にあるか
b) 拡大率が何 % か

[3]
a) スライダーを「小さくする」、拡大率を 100% にすると表示はどうなるか

DPI の設定が原因だった場合、将来のバージョンで対策をしたいと思います。
よろしくお願いいたします。



Reputeless  2015/01/10(Sat) 18:36
今回のトラブルとは関係ありませんが、
参考までに、ウィンドウのサイズいっぱいに画像を表示するサンプルコードを載せておきます。

# include <Siv3D.hpp>

void Main()
{
const Texture texture(L"Example/Windmill.png");

Window::SetStyle(WindowStyle::Sizeable);

while (System::Update())
{
const Vec2 screenSize = Window::Size();

const double scale = Min(screenSize.x / texture.width, screenSize.y / texture.height);

const Vec2 screenCenter = screenSize * 0.5;

texture.scale(scale).drawAt(screenCenter);
}
}
furafura  2015/01/10(Sat) 21:06
返事が遅くなりまして申し訳ございません。
加えてサンプルの提供ありがとうございます。参考にさせていただきます。


実行上問題が表面化しない自作機も加えました。
(必要ならWindows7のVAIO typeZも加えられます)
[1]
a) PC のカタログ上の解像度
duo11 ... 1920*1080
QH55/M ... 2560*1600
自作機 ... 1920*1200 ←プライマリモニタ

b) 表示のずれが生じる際のWindows で設定している画面の解像度
a)と同じです。

c) Println(Window::GetState().screenSize); で得られる解像度
duo11 ... 1536*864
QH55/M ... 1280*800
自作機 ... 1920*1200

d)Println(Graphics::GetFullScreenSize().back()); で得られる最大フルスクリーン解像度
a)と同じです。

[2]
コントロールパネルのディスプレイの設定(画像参照)で
a) スライダーがどの位置にあるか
duo11 ... 真ん中
QH55/M ... 大きくする
自作機 ... 小さくする

b) 拡大率が何 % か
duo11 ... 中125
QH55/M ... 特大200
自作機 ... 小100

[3]
a) スライダーを「小さくする」、拡大率を 100% にすると表示はどうなるか
全機 正常表示

なるほど……という感じです。
問題のあった2機種は、該当項目については購入時から設定変更していない、メーカー設定状態となっています。
Reputeless  2015/01/10(Sat) 21:27
一連のご報告ありがとうございました。
枠なしウィンドウによる仮想フルスクリーンの解像度は
Window::GetState().screenSize の値を用いるのが正解のようですね。

表示の問題は仮想フルスクリーン時のみでしょうか、フルスクリーンでも同じ問題が発生しますか?

DPI 関連に関して、Siv3D でどのような機能提供ができるか、将来のバージョンで検討したいと思います。
ご要望がありましたら是非書き込んでください。
furafura  2015/01/10(Sat) 22:14
小100%から上げて(戻し)
よけいな事せずに
Graphics::GetFullScreenSize().back()
のみで開始した所、意図する最大解像度となります。フルスクリーンであれば影響を受けないようです。

個人的には、フルスクリーンモードがパフォーマンス面からも好ましいと考えております。
しかしながら、

フルスクリーンモードが遅い

にて質問させていただいた、

他アプリケーションにフォーカスが移動
或いはAlt+TAB

で表示が壊れる点が引っかかって、これまで問題に気がつかなかった枠無し仮想フルスクリーンを用いてきました。
フルスクリーンにした結果、表示が乱れたら、ユーザーにタスクマネージャ起動してプロセス殺して下さいとは、ちょっと言いにくい所があります。現状選択に悩む所です。

要望ばかりで申し訳無いのですが、DPIの値を参照して挙動を整えて頂くか、私の用途的にはフルスクリーンモードの挙動改善が大変好ましく思います。

追記(DPIの値を参照というより、無視と言いますか100%表示が強要出来る事が望ましいと思います)
Reputeless  2015/01/11(Sun) 23:13
ご返信ありがとうございます。
フルスクリーンモードの挙動を改善していきたいと思います。
furafura  2015/01/12(Mon) 01:54
DPIについては考えてみたのですが、今の所気の利いた発言が出来ずに申し訳ございません。
DPIの値を得て、生かせる選択はあって良いとは思うのですが、最高解像度の状態であれば、大中小じゃないですけど、後はソフト制作者の好みで実装していく事で用が足りてしまう事が多い気がしております。

個人的な対応としましては、クライアント領域の大きさに対して何割、みたいな感じで、2Dオブジェクトの大きさ調整をしている感じです。

他の方だと良い発想があるのかも知れません…。

- WEB PATIO -