Apakah gambar indeks lebih cepat daripada gambar non-indeks

8

Saya perlu menggambar banyak poligon yang terdiri dari 6 simpul (dua segitiga).

Tanpa koordinat tekstur, normal, dll., Kedua pendekatan menghasilkan 72 byte. Di masa depan saya pasti juga akan membutuhkan koordinat tekstur dan normal, yang akan membuat gambar indeks mengkonsumsi lebih sedikit memori. Tapi tidak banyak.

Jadi pertanyaan saya adalah: Untuk VAO dengan beberapa titik tumpang tindih, pendekatan mana yang lebih cepat? Saya tidak peduli dengan memori ekstra yang dikonsumsi oleh gambar non-indeks, hanya kecepatan.

Sunting: Untuk membuatnya jelas.

Pendekatan non-indeks:

float[18] vertices = {
//Triangle 1
1,1,0,
1,0,0,
0,0,0,

//Triangle 2
1,0,0,
0,1,0,
0,0,0,
};

Pendekatan indeks:

float[12] vertices = {
1,1,0,
1,0,0,
0,0,0,
0,1,0,
};

int[6] indices = {
//Triangle 1
0,1,2,

//Triangle 2
0,3,2
};
KaareZ
sumber
1
... mengapa tidak mengukur kedua pendekatan untuk aplikasi spesifik Anda pada perangkat keras target Anda dan mencari tahu secara meyakinkan?
Sean Middleditch

Jawaban:

4

Saya mencoba menjawab pertanyaan itu. Saya pikir Anda harus menggunakan indeks, karena beberapa alasan:

1) Dalam hal apa pun, pengindeksan adalah operasi gratis di sisi GPU, Anda tidak menerima penalti di sana. (ditambahkan) Tentu saja, indeks adalah operasi akses acak, dan dapat merusak kinerja cache memori GPU.

2) Pengindeksan dapat memungkinkan cache vertex GPU untuk membuat beberapa optimasi untuk tumpang tindih simpul.

3) Jejak memori yang lebih kecil di sisi GPU berkali-kali berarti kinerja yang lebih baik, karena bandwidth memori adalah salah satu kendala, dan karena berkali-kali operasi penggalian (mis. 10_10_10_2 -> 4 x float) tidak berbiaya.

Perbedaan kecepatan mungkin tidak terlihat jika tidak ada banyak titik yang tumpang tindih di mana Anda mungkin mendapatkan peningkatan kecepatan. Tetapi saya benar-benar tidak memiliki fakta keras untuk mendukung pendapat saya (sesuai dengan indeks).


Lihat juga ini:

/programming/17503787/buffers-indexed-or-direct-interlaced-or-separate

MaKo
sumber
1
ulang 1) bagaimana dengan mengoptimalkan pemesanan indeks untuk kinerja cache? ada algoritma untuk ini bahkan. seperti k-cache reordering. ulang 3) bagaimana dengan overhead buffer indeks itu sendiri? terkadang tri-stripping menghasilkan lebih sedikit data untuk diunggah ... meskipun ini bukan kasus umum.
jheriko
1

Jika posisinya selalu sama, Anda bahkan dapat melakukannya tanpa buffer dengan menyimpan array di shader dan menggunakannya gl_VertexIDuntuk memilih vertex di vertex shader.

#version 330 core

const vec3 data[4] = vec3[]
(
//Triangle 1
vec3(1,1,0),
vec3(1,0,0),
vec3(0,0,0),

//Triangle 2
vec3(1,0,0),
vec3(0,1,0),
vec3(0,0,0)
);

void main()
{
  gl_Position = vec4( data[ gl_VertexID ], 1.0);
}
aneh ratchet
sumber
Dan ketika ditampilkan dengan instance, Anda dapat mengatur titik, rotasi, dan skala per instance.
Lasse
@ratchet freak Posisi tidak akan selalu sama, karena ini untuk medan (dan saya tidak bisa menggunakan triangle_strips karena itu akan sangat sulit untuk diterapkan dengan cara yang tepat, karena berbasis voxel). Saya hanya perlu tahu apakah saya harus menggunakan gambar indeks atau non-indeks. Atau bahkan daftar tampilan lama, jika itu akan lebih cepat.
KaareZ
@ KaareZ Anda masih dapat menggunakan seragam untuk mengubah posisi. Atau gunakan instancing untuk menyampaikan data per wajah.
ratchet freak
0

seperti semua hal kinerja, jangan menebak, buat profil untuk mengetahuinya.

itu akan bervariasi tergantung pada perangkat keras dan faktor rumit yang sangat banyak. mengukurnya dengan membuat profil akan secara otomatis mempertimbangkan semua hal ini untuk Anda tanpa Anda perlu tahu apa-apa tentang mereka.

jheriko
sumber
-1

Asumsi saya adalah bahwa menggunakan pengindeksan untuk simpul akan lebih lambat.

Saya salah paham dengan pertanyaan aslinya, tetapi inilah jawaban untuk pengindeksan warna. Saya menebak aturan yang sama akan berlaku untuk pengindeksan vertex (tanpa kehilangan presisi), tapi itu hanya dugaan.

Tapi...

  • Sebagai aturan umum, saya sarankan pengindeksan.
  • Pengindeksan lebih lambat.
  • Tidak mengindeks lebih cepat.
  • Pengindeksan lebih hemat memori.
  • Tidak mengindeks kurang efisien memori.
  • Pengindeksan kehilangan presisi warna.
  • Tidak mengindeks tidak kehilangan ketepatan warna.

72 byte sangat kecil sehingga mungkin akan lebih efisien memori untuk tidak mengindeksnya.

Beberapa aturan praktis: Pengindeksan lebih hemat memori. Pengindeksan kehilangan presisi warna. Tidak mengindeks lebih cepat.

Ini mungkin membuat Anda ingin tidak pernah menggunakan pengindeksan, tetapi pertukaran memori agak signifikan untuk gambar berukuran layak. Ketepatan warna tidak terlalu mencolok.

Cara pengindeksan bekerja adalah ketika menggambar pixel, itu diberikan indeks dan harus melihat warna dalam tabel ukuran yang telah ditentukan. (Katakanlah 256 byte, jadi Anda terbatas pada 256 warna). Kemudian itu menarik pixel itu. Tidak ada pengindeksan yang menyimpan data piksel secara langsung, jadi tidak ada batas warna hingga 256. Namun dalam gambar 100x100, gambar 400ish byte Anda sekarang 10.000 byte.

Penafian, saya menarik angka-angka ini dari topiku.

Evorlor
sumber
Saya tidak bertanya tentang kompresi warna.
KaareZ
Jawaban super singkat: pengindeksan selalu lebih lambat. Saya mengubur jawaban saya di sana, tetapi menambahkannya ke baris pertama sekarang saya pergi ke kompresi warna, karena itulah pengindeksan.
Evorlor
Saya berbicara tentang pengindeksan verteks, bukan kompresi tekstur. Seperti misalnya Anda memiliki v0, v1, v2 dan v, 3. Untuk menggambar dua segitiga Anda tentukan indeks berikut ini: 0, 2, 3, 0, 2, 4
KaareZ
Oh, kesalahanku. Dalam hal ini saya tidak tahu, tapi saya menganggap aturan praktis yang sama akan berlaku (dikurangi resolusi hilang)
Evorlor