2

Qt4 を使用してマーキー テキスト ウィジェットを実装しました。最初にテキスト コンテンツをピックスマップにペイントしました。そして、painter.drawTiledPixmap(offsetX, offsetY, myPixmap) を呼び出して、このピックスマップの一部をペイント デバイスにペイントします。

私の想像では、Qt はマーキー テキストの四角形全体を myPixmap のコンテンツで埋めます。

既存のすべてのコンテンツを 1 ピクセル左にシフトし、新しく公開された幅 1 ピクセル、高さ N ピクセルの領域を myPixmap のコンテンツで埋めるよりも高速な方法はありますか?

4

4 に答える 4

1

良い。これは、私が昔、遅いハードウェアで行っていたトリックです。基本的に、イメージ バッファは必要な 2 倍の幅で割り当てられ、先頭に 1 行追加されます。バッファーの左側にイメージをビルドします。次に、バッファー内で一度に 1 ピクセルずつ進めるバッファーで画像を繰り返し描画します。

int w = 200;
int h = 100;
int rowBytes = w * sizeof(QRgb) * 2; // line buffer is twice as the width
QByteArray buffer(rowBytes * (h + 1), 0xFF); // 1 more line than the height
uchar * p = (uchar*)buffer.data() + rowBytes; // start drawing the image content at 2nd line
QImage image(p, w, h, rowBytes, QImage::Format_RGB32); // 1st line is used as the padding at the start of scroll
image.fill(qRgb(255, 0, 0)); // well. do something to the image

p = image.bits() - rowBytes / 2; //  start scrolling at the middle of the 1st (blank) line
for(int i=0;i<w;++i, p+=sizeof(QRgb)) {
    QImage  scroll(p, w, h, rowBytes, QImage::Format_RGB32); // scrool 1 pixel at a time
    scroll.save(QString("%1.png").arg(i));
}

画像のオフセットを変更してまっすぐに描画するよりも速くなるかどうかはわかりません。今日のハードウェアは非常に強力で、多くの古いトリックが役に立たなくなります。でも、あいまいなトリックをするのは楽しいです。:)

于 2010-05-08T20:00:37.233 に答える
1

ご挨拶、

これを達成するための 1 つの可能性は次のとおりです。

  1. QGraphicsScene + View を作成し、ピックスマップを (QGraphicsPixmapItem として) その上に 2 回配置して、それらが互いに隣り合うようにします。
  2. (1 つの) ピックスマップのサイズに合わせてビューのサイズを変更します。
  3. 次に、ピックスマップを再描画する代わりに、あるピックスマップから次のピックスマップに移動して、ビューのビューポートを再配置するだけです。
  4. 最後にジャンプしてループを作成します。

これは(パフォーマンスの点で)速いかもしれないし、そうでないかもしれません - 私はそれをテストしていません。しかし、実験のためだけなら、試してみる価値があるかもしれません。

于 2010-04-26T12:54:57.743 に答える
1

低レベルの描画方法を使用しているため、あなたのアプローチはおそらく最速のアプローチの1つです。QGraphicsSceneラベルを含むスクロール領域を使用して、低レベルの描画とオプションの中間のアプローチを実装できます。

テキスト ラベルを含む新しいスクロール領域を作成するコードのサンプルを次に示します。を使用してラベルを自動的QTimerにスクロールし、スクロール効果をトリガーすることができます。これにより、素敵なマーキー ウィジェットが得られます。

QScrollArea *scrollArea = new QScrollArea();

// ensure that scroll bars never show
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

QLabel *label = new QLabel("your scrolling text");

// resize the scroll area : 50px length and an height equals to its content height.
scrollArea->resize(50, label->size().height());
scrollArea->setWidget(label);
label->show(); // optionnal if the scroll area is not yet visible

The text label inside the scroll area can be moved from left to right by one pixel using the QScrollArea::scrollContentsBy(int dx, int dy) with a dx parameter equals to -1.

于 2010-05-05T12:03:12.863 に答える
0

ピクセルごとにそれをしないのはなぜですか? キャッシュが最後に到達するまで、その前のピクセルにピクセルを書き込む方法が原因です。次に、他の画像から読み取って最後の列を埋めることができます。

SIMD 最適化も非常に簡単です。ただし、この時点でプラットフォームごとの最適化を開始します。

于 2010-05-11T17:52:37.810 に答える