2010-11-28 1 views
1

私のプロジェクトの1つに、描画テキストがあります。このプロジェクトは、中レベルの16ビットマイクロコントローラ「dsPIC33FJ128GP802」をベースにしています。それは40 MIPSが可能ですが、そのうちの約92%はバックグラウンド処理(オンスクリーンディスプレイを出力)用に予約されているので、平均して3 MIPSのものをレンダリングします。このプロセッサは、ハードウェアの乗算、補助除算(18サイクル)および完全な16ビットバレルシフタを備えています。複数の単語にいくつかのビットを書き込むための効率的なアルゴリズム

元の方法は単純でした。書き込みが必要な各ピクセルのピクセルルーチンを呼び出しただけですが、これは非常に遅いです:各ピクセル書き込みにはアドレスデコード、ビットマスク、メモリへの書き込みが必要です。また、マスク配列(ピクセルが可視かどうかを判断する)に1つ、レベル配列に1つ(ピクセルが白か黒かを判断する)の各ピクセルに対して2つのビットを書き込む必要があります。 1文字8×14ピクセルの場合、これは13,440サイクルにオーバーヘッドを加えたものです。多くの処理能力が不足しているため、どれが多いですか。

このため、私は水平線を描画するためのアルゴリズムを考え出しました。それは約20サイクルで最大16ピクセルを効率的に書き込むことができ、ピクセルを個別に設定すると60倍に向上します。単語境界(巧妙なビット数を使って)に横たわらない行や、完全に1つの単語の内側にある行までも扱うことができます。 (注 - 1ワードは16ビットで、ビデオメモリは3,072ワード、フロントバッファとバックバッファの4つの配列として保存されています)アルゴリズムがオリジナルであるかどうかはわかりませんが、 I've documented it here

ここでは、複数の単語に複数の異なるピクセルを設定する方法を理解しようとしています。誰もがそのようなのを知っている場合は

Memory before : 0000 0000 0000 0000 0000 0000 0000 0000 
Word to write : 1111 1010 1111 1111 
Memory after : 0000 0111 1101 0111 1111 1000 0000 0000 

:最初の単語の(ビットがゼロから数えて)私たちは、ビット4から始まるこの言葉を書きたいし、それが次にオーバーフローすることができます - 理想的には、それは次のように動作しますアルゴリズムを使用するか、過去にこのようなことをしたことがありました。私は今、大きな脳のブロックを持っています。

答えて

2

5ビットシフトして、最初のWORDをANDしてから11をシフトし、次に2番目のWORDをANDするか、何か不足していますか?

+0

あなたは私がこれについて考えなかったことを知っています。それは今かなり明らかなようです!脳のブロック、ugh。 –

+0

@トーマス、これを答えとして受け入れることができます。 :) – MSN

0

洗練されたグラフィックアクセラレータの前の日に、人々はbitbltなどのインターフェイスの背後に実装できるものを隠していました。 http://swtch.com/~rsc/talks/drawtalk.pdfにあるこの例のいくつかは、自動生成してからマシンコードを実行することによって処理されています。この論文からのアプローチは、「効果的には、ドローイングの実装は、 で十分であり、オーバーヘッドを耐えられるだけの十分なループとループが の外側にプッシュされています。私が見た1つのバージョンはかなり長いものでしたが、一般的な特殊なケースでは「高速パス」が抽出されていました。

関連する問題