コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
bはかせ ◆fgfPl6qLuzIU
2018/7/15 21:28
質問
GSPOITの戻り値
グラフィック系命令をいろいろ試しているのですが、
GSPOITの戻り値の、ARGB各8ビットの色コード
ってのがよく分かりません
真っ白な所をGSPOITすると
255255255 みたいな数値が戻るのかなと思いましたが
-460552 という数値が戻って来ました
どういう事でしょうか?教えてください

コメント

アバター
笹身 2018/7/16 10:28 ◆AUnhmHIpE1fp
253じゃなくて248ね
内部では1色につき5ビット保持しててそれを8倍にして返してくるんよ
アバター
bはかせ 2018/7/16 13:15 ◆fgfPl6qLuzIU
詳しい説明、補足ありがとうございます

RGBREADっていう便利命令あったんですね...
ちょっと自分でも符号付き32ビット整数型とかっていうのを
調べたりしてきました。
各8ビットの色コードとか
何でRGBは255までしか設定できないのとか
いろいろ分かってなかった事が分かってスッキリしました。
ちなみに符号付き32ビット整数型っていうのは
左端のビットが符号を表しているので
実質31桁の2進数までしか表せないということですか?
アバター
突然でてきたBAKA!! 2018/7/16 13:45 ◆EfKewrRlmOns
新しい質問だな
アバター
こういち 2018/7/16 15:08 ◆ou0jbJnEJ0Kb
はい。表現できる最大値は2147483647になりますが、その分負の数が-2147483648まで表現できるので表現できる範囲はpow(2,32)あります。
(負の数が正の数より絶対値が大きな数を表現できるのは-0が存在しないから)
アバター
あまさとしおん 2018/7/16 17:41 ◆mzDKTVUAtwqE
(ところでSquidSky氏の『-2の誤差』とかいう斬新な誤情報は何じゃい)
アバター
こういち 2018/7/16 18:15 ◆ou0jbJnEJ0Kb
DIV 8
アバター
あまさとしおん 2018/7/16 18:32 ◆mzDKTVUAtwqE
>>3
※整数部を捨てる割り算で2の累乗で割る場合はビットシフトが便利です。
(レス番号を指すアレではない。)
アバター
はる 2018/7/16 18:46 ◆75Vh4SY8TdKS
"レス番号を指すアレ"はアンカー(安価)といいます。
アバター
こういち 2018/7/16 18:48 ◆ou0jbJnEJ0Kb
ボクとしたことが…シフト忘れてました。
アバター
はる 2018/7/16 18:50 ◆75Vh4SY8TdKS
ビットシフトよりもPOWのが分かりやすいのでPOWでもいいと思います。
アバター
こういち 2018/7/16 19:40 ◆ou0jbJnEJ0Kb
pow()…
短さが…
速度が…
(シフトとDIVは定数時間で済むけどpow()は対数時間かかる。シフトはDIVの数倍速いらしい。ただし実数なら変換カイロスもあるのでpow()の方がが速くなることももあるかも?)
アバター
はる 2018/7/16 19:42 ◆75Vh4SY8TdKS
そうですね。
自分も普通はビットシフトを使うようにしています。
アバター
しんいち 2018/7/16 20:27 ◆lHy.hAWXbthn
私はF=0の時必ず1で、F=1の時はA、としたい時にPOW(A,F)使ったりすることがありますが、多分IF文で書いた方が速いでしょう^^;
アバター
Soybeanman 2018/7/16 21:02 ◆/ggd1c6ZKIiI
>>しんいちさん
検証してみました。
方法:10000回繰り返してミリ秒を計る。

整数のとき
R%=POW(A%,F%)のとき、約221ミリ秒
IF F% THEN R%=A% ELSE R%=1のとき、約212ミリ秒
R%=A%*F%+!F%(自分が使ってた奴)のとき、約236ミリ秒

じゃないとき
R=POW(A,F%)のとき、約223ミリ秒
IF F% THEN R=A ELSE R=1のとき、約224ミリ秒
R=A*F%+!F%(自分が使ってた奴)のとき、約250ミリ秒

整数のときはIF文使った方が早いですね。
そうでないときは...結構接戦ですね。
自分が使ってた奴が遅くて結構ショックだったりする。
検証は大切ですね。
アバター
SquidSky 2018/7/16 21:41 ◆qhyT2aHAyMJC
ああーごめんなさい!!
正しくは元の値をDIV 8で割ったものでした…。
アバター
おちゃめ 2018/7/16 21:52 ◆jH1opV6FnGyx
プチコン3号は乗算より除算の方が高速なのです。
したがって、A%=B%*2 よりも A=B/0.5 の方が処理が高速になります。
もちろん、アルゴリズムの違いによる高速化の方が大きいですが、こうしたちょっとしたことを知っておくことで高速化に繋がります。
詳しくは、私のプチコン3号講座を参照してください。(計測に使ったバージョンが古いため数値自体は現バージョンと変わっていますが、傾向そのものはあまり変わっていません)
http://ochameclub.web.fc2.com/petitcom3/lecture/speedup_nano.htm

ちなみに私の簡易地球儀QSP(上記プログラムリスト)もアルゴリズム変更による高速化以外にもこの乗算より除算が速いことを活用してQSPの範囲内では限界となる高速処理を実現しています。
2重ループの内側では本来であれば乗算で記述すべきものをループ外で逆数の値を代入することですべて除算に置き換えているわけです。
http://ochameclub.web.fc2.com/petitcom3/soft/qsp.htm#glb
アバター
おちゃめ 2018/7/16 22:59 ◆jH1opV6FnGyx
冒頭の質問に関してはすでに回答が得られていますが、GRP画面では色指定は32bitで行われるのに実際の表示は16bitで丸められるため表示のRGB値とGSPOITによるRGB値が異なる場面が出てくるというのは知っておく必要があると思います。

詳しくは私のプチコン3号入門講座を読んでください。
http://ochameclub.web.fc2.com/petitcom3/lecture/grp.htm#5

ちなみに「16bitに丸められる」というのはR、G、Bが各5bit(32段階)に丸められるということです。(残り1bitは透明色か否かを示す)

あと、グラフィックの回転ですが、N×Nドットのグラフィックの回転は拡大表示を行わなくても最大でN×N×2回のループ処理を行う必要があります。
そのため、速度面ではかなり厳しくなるためどうしてもグラフィックに拘る必要がないならばスプライトで行うのがベターです。(GRP4にGPUTCHR表示を行い、スプライトとして表示する)

単純な回転ではなく2軸回転を行うならばスプライトではできないためGRPを使わざるを得ないです。
2軸回転処理を行えばスーファミのF-ZEROやFFの飛空艇のような表示も可能になります。(上記のスクリーンショットは私の2軸回転プログラムによって実行されたもの)
アバター
bはかせ 2018/7/18 1:16 ◆fgfPl6qLuzIU
符号付き32ビット整数は実質31桁なことだったり
RGBREADで違う値が返ってくることだったり
乗法より除法が速いことだったり
たくさんのコメントありがとうございます

自分複雑な処理あまり書かないので
まだどれが速いのかとかは気にしてないですね(ハナホジー

やっぱり回転はスプライトの方がいいんですね
参考にさせていただきます
アバター
こういち 2018/9/24 22:34 ◆ou0jbJnEJ0Kb
久々に見に来た。
符号付き32bit整数型の最大値を表すC言語プログラムの
unsigned n=-1;
というパワーワード。
(unsigned型…符号なし32bit整数型。当然負数を表現できない。)
そしてよく考えたら
printf("%u",n/2);

printf("%u",n>>1);
と書き直せることに今さら気付いた。

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -