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

アバター
あまさとしおん ◆mzDKTVUAtwqE
2025/5/4 16:25
情報交換
1pxより太い線分の描画
GLINEで描くことができない太い線を描く方法を改めて募集します。

1.既に把握しているDEFの改良
2.公開されているが私が気付いていないDEFの情報
3.新しいDEFを作る
どれでも構いません。1は思い当たる所を書きます。

要件:
・3号用、または3号用ではないが軽い修正で動くもの
・どちらかというと速度優先(メインループ内の処理ではないが、無印3DSで毎秒100本は余裕で描けること)
・ペン先(端部)は円形が好ましい
※要件が分かりにくかったので書き直しました。ただし微妙なものでも参考になるのでどんどん挙げてください

コメント

アバター
あまさとしおん 2025/5/4 16:32 ◆mzDKTVUAtwqE
https://x.com/lfo_whisper/status/979385006605844480

1.の把握済みDEF改良案ですが
こちらのIfoさんのを土台に高速化できそうな部分を挙げていきます。

・TX,TYが配列なので無くしたい
不都合がないならTX_0のような変数をDEF外で宣言しておくと良さそう。そのうえで[1]と[2]は1度しか使われないのでGTRIに直接式を書くと、より速そう

・SQRを無くしたい
比較目的なので、相手であるSを2乗しても目的は達成でき、変数Lは1度しか使われないのでIF文の条件に直接書くと、より速そう

・色指定をDEF外に出す
4回の描画命令に渡されているので、事前にGCOLORで指定してもらう前提で省略する方法もあり得る

・RAD(90)を無くす
上で挙げているようにDEF外での宣言に不都合がないなら、RAD90#=RAD(90)など(3号。4はCONSTでも良い)と定義しておいたほうが速い(要検証)
※実行時コンパイルの定数式の計算は関数を除外しているという前提で
アバター
あまさとしおん 2025/5/4 16:39 ◆mzDKTVUAtwqE
・丸をGPSETでちまちま描かないほうが良さそう
SQRが出てくるあたりの処理、GCIRCLEにするほうが根本的な解決
GCIRCLEの円の形が優れていないために、意図的にそうしている可能性はある。違いが許容できるならという感じか
アバター
あまさとしおん 2025/5/4 17:59 ◆mzDKTVUAtwqE
2.
ペイントツールの作者さんが自前実装している可能性がわりとある。ただし今回は一気に100本以上描くという前提なので「綺麗だが遅い」という実装は採用しない可能性あり
アバター
KGB 2025/5/7 1:11 ◆5iPNLsUxca1V
サンセーい
アバター
おちゃめ 2025/5/10 22:43 ◆jH1opV6FnGyx
速度重視するならばGTRI2つで直線(というか長方形)を描画するのが最も高速です。サンプルプログラムを用意しました。
New3DSならば太さ9ドットの線(S=4)が毎秒11700本程度描画できます。
ノーマル3DSでも毎秒3000本程度は描画できると思います(太さ1ドットの線の描画品質が落ちてもよいのであればS<1のIF文処理を削ることでほんの少しだけ高速になる)。
線の端が丸い方が良いのであれば両端に塗りつぶし円を描画すれば良いです。
ただし、GCIRCLE+GPAINTだとNew3DSで毎秒4800本程度まで速度が落ちました。
これでもノーマル3DSで毎秒1000本以上は余裕で描画は可能な速度ですが、常に丸型処理が必要でないのであれば丸型処理の線描画DEFと角形処理の線描画DEFの2つを使い分けるのが最も高速だと思います。
アバター
おちゃめ 2025/5/11 14:34 ◆jH1opV6FnGyx
高速な塗りつぶし円の描画DEFです。
このプログラムは円に内接する正方形をGFILLで描画してあとは残りの4方向をGLINEで描画するアルゴリズムとなっています。これによりループ回数を大幅に減らせるため全体をGLINEで描画するよりも1.6倍くらい高速になっています。
あと幅1ドットの縦線はGLINEよりGFILLの方が少しだけ速いので縦方向だけGFILLを使用しています(あとFOR〜NEXTやWHILE〜WENDよりもREPEAT〜UNTILの方が高速)。

GCIRCLE+GPAINTは塗りつぶし円の描画としては最もシンプルでプログラムがコンパクトサイズというのが最大のメリットでしょう。
ちなみに私のQSPのお絵描きソフト「PETIT PAINT 2 QSP」はGCIRCLE+GPAINTを採用しています。カラー対応してQSPに収めるために通常ではありえないような処理をしていますが。
アバター
おちゃめ 2025/5/11 16:17 ◆jH1opV6FnGyx
あまさとしおんさんの紹介したプログラムを見ましたが

sin (θ+90°)=cos θ
cos(θ+90°)=-sin θ

なのでわざわざ別途90度足す必要はないです。
アバター
あまさとしおん 2025/5/11 16:20 ◆mzDKTVUAtwqE
やはりGTRI×2が定番なんですねぇ
塗りつぶし円は矩形になる範囲だけGFILLして足りないところを埋めるのが速い、さすがです(直感的には複雑そうで思いつかない)
アバター
おちゃめ 2025/5/11 19:14 ◆jH1opV6FnGyx
プチコン3号にGTRIが実装される前やmkII時代は高速な太線はGLINEをループで描画するしかなかったですからね。どういうアルゴリズムにするかで描画品質や速度に差が出ました。
GTRIを使ったものだと大きく分けて角形処理をするか丸形処理をするかの二択しかないですからね。
GTRI部分では大きな速度差は発生しないため円描画で速度が変わる感じです。

ちなみに私がプチコンmkIIで作ったポリゴン描画プログラムは塗りつぶし三角形のサブルーチンではGLINEを使用しています。縦長の三角形か横長の三角形かを判定することでループ回数を減らすことで処理の高速化を行っています。
プチコン3号ではGTRIが使えるためポリゴン描画性能は飛躍的に高まりました(約300ポリゴン/秒→約10000ポリゴン/秒)、描画品質を若干犠牲にすればスプライトを使ってさらに高速なポリゴン表示もできますからね。
アバター
こういち 2025/5/14 19:55 ◆ou0jbJnEJ0Kb
GTRIって塗り潰された領域を描画すること忘れてた。
手軽で良いですね。(GPAINTとか駆使して頑張ってた)

コメントを書く

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

- WEB PATIO -