Game Engine
Panda3D
Pada tugas softskil
kali ini saya akan mereview sedikit tentang game engine, yang saya akan review
yaitu game engine Panda3D. Panda3D adalah mesin permainan yang mencakup grafis,
audio, I / O, tabrakan, dan kemampuan lain yang relevan dengan penciptaan game
3D.
Panda3D adalah open source dan, pada 28 Mei,
2008 perangkat lunak bebas di bawah revisi lisensi BSD. Rilis sebelum 28 Mei
2008 tidak dianggap Free Software karena kesalahan tertentu dalam desain
lisensi Panda3D tua. Meskipun demikian, rilis ini lebih tua dari Panda3D juga
dapat digunakan untuk kedua pengembangan game gratis dan komersial tanpa biaya
keuangan.
Dimaksudkan Panda3D ini
permainan pengembangan bahasa Python. Mesin itu sendiri ditulis dalam C + + ,
dan menggunakan sebuah otomatis wrapper-generator untuk mengekspos fungsi
lengkap dari mesin dalam antarmuka Python. Pendekatan ini memberikan pengembang
keuntungan dari pengembangan Python, seperti perkembangan pesat dan manajemen
memori maju, namun tetap kinerja bahasa disusun dalam inti mesin. Misalnya,
mesin yang terintegrasi dengan kolektor sampah Python, dan struktur mesin
secara otomatis dikelola.
The manual dan contoh program
menggunakan Python, meskipun pengembang bekerja pada menerjemahkan manual untuk
C + + dan menyediakan C + + sampel program.
Seorang pengembang menggunakan Panda3D
biasanya menulis kode di Python, tetapi juga memungkinkan untuk langsung
mengakses mesin menggunakan C + + code.
Para pengguna Panda3D termasuk
pengembang dari beberapa game komersial besar, sebuah proyek sumber terbuka
beberapa, dan sejumlah program universitas yang memanfaatkan kurva belajar
pendek Panda3D itu. Masyarakat kecil tapi aktif, dan pertanyaan pada forum
umumnya menjawab dengan cepat.
Desain
Panda3D adalah mesin
grafik adegan. Ini berarti bahwa dunia maya ini awalnya kosong Cartesian ruang
menjadi yang menyisipkan permainan programmer model 3D. Panda3D tidak
membedakan antara "besar" model 3D, seperti model dari penjara
seluruh atau pulau, dan "kecil" model 3D, seperti model meja atau
pedang. Model baik besar dan kecil yang dibuat dengan menggunakan program
pemodelan standar seperti Blender , 3ds Max atau Maya , dimuat ke Panda3D, dan
kemudian dimasukkan ke dalam ruang Cartesian.
Grafik adegan Panda3D mengekspos fungsi
OpenGL dan DirectX dalam bentuk yang cukup literal. Misalnya, OpenGL dan DirectX
keduanya memiliki kemampuan kabut. Untuk mengaktifkan kabut di Panda3D, satu
hanya menyimpan parameter kabut pada node dalam grafik adegan. Parameter kabut
sama persis dengan parameter panggilan setara dalam API yang mendasarinya.
Dengan cara ini, Panda3D dapat dilihat sebagai pembungkus tipis sekitar API
tingkat rendah. Dimana hal itu berbeda dari mereka adalah bahwa ia menyimpan
adegan, sedangkan OpenGL dan DirectX tidak. Tentu saja, itu juga menyediakan
tingkat yang lebih tinggi operator, seperti memuat model, melaksanakan animasi,
mendeteksi tabrakan, dan sejenisnya.
Panda3D pertama
direkayasa sebelum adanya shader vertex dan pixel. Ini diperoleh dukungan untuk
shader manual ditulis pada tahun 2005. Namun, pengguna telah lambat untuk
meningkatkan modern yang per-pixel teknik pencahayaan dalam permainan mereka.
Para pengembang berteori bahwa ini adalah karena program shader bisa sangat
sulit, dan bahwa pengembang game banyak ingin mesin untuk menangani secara
otomatis.
Untuk memperbaiki situasi ini, para
pengembang Panda3D baru-baru ini diberikan Panda3D kemampuan untuk mensintesis
shader otomatis. Sintesis ini terjadi jika pemodel 3D menandai model untuk
per-pixel pencahayaan, atau jika pemodel menerapkan peta normal, peta, gloss
diri iluminasi peta, atau kemampuan lain yang melebihi kemampuan dari pipa
fixed-fungsi. Tujuan dari sintesis ini adalah untuk membuat model sebagai
modeler dimaksud, tanpa intervensi dari programmer.
Non-Graphical Kemampuan
Panda3D menyediakan kemampuan selain render 3D. Kepala di antara ini adalah
:
-
Kinerja alat analisis.
-
Eksplorasi grafik alat adegan.
-
Debugging alat.
-
Sebuah seni pipa ekspor / impor lengkap.
-
3D Audio, baik menggunakan FMOD , OpenAL atau
Sistem Suara Miles .
-
Deteksi tabrakan. - Fisika sistem, dan
integrasi penuh untuk Mesin Dynamics Terbuka , eksperimental PhysX dan
integrasi Bullet.
-
Keyboard dan dukungan Mouse.
-
Dukungan untuk I / O device.
-
Negara yang terbatas mesin.
-
GUI, integrasi libRocket.
-
Jaringan.
-
Kecerdasan buatan.
Sejarah
The Disney studio VR
adalah cabang dari Disney yang diciptakan untuk membangun atraksi 3D untuk
taman hiburan Disney. Mereka membangun daya tarik yang disebut "Magic
Carpet Aladin," dan mesin yang mereka buat untuk itu akhirnya menjadi
Panda3D. Mesin dalam bentuk yang sekarang sedikit beruang kemiripan kepada
tahun-tahun awal. Seiring waktu, Panda3D digunakan untuk naik VR tambahan di
taman hiburan Disney, dan akhirnya digunakan dalam penciptaan Toontown online ,
game online diatur dalam dunia kartun, dan kemudian untuk kedua MMORPG ,
Pirates of the Caribbean online.
Pada tahun 2002, mesin dirilis sebagai
open source. Menurut penulis, ini adalah agar mereka "bisa lebih mudah
bekerja dengan universitas pada proyek-proyek penelitian Virtual
Reality." Namun, butuh beberapa
waktu untuk Panda3D untuk lepas landas sebagai proyek open-source. Dari
artikel:
Sistem ini, meskipun
cukup digunakan oleh tim yang mengembangkan itu, tidak cukup "open source
siap." Ada beberapa pengguna yang tertarik, tetapi membangun dan memasang
sistem itu sangat kompleks, dan ada sedikit di jalan dokumentasi atau kode
sampel, sehingga tidak ada komunitas sumber terbuka yang signifikan segera.
Namun, terbuka-sumber dari mesin
diperbolehkan Carnegie Mellon Pusat Teknologi Hiburan untuk bergabung dalam
pengembangan mesin. Sementara Disney insinyur terus melakukan sebagian besar
pembangunan, tim Carnegie Mellon-membangun peran untuk dirinya sendiri
polishing mesin untuk konsumsi publik, menulis dokumentasi, dan menambahkan
beberapa fitur high-end seperti shader.
Nama Panda3D yang pernah akronim:
"Agnostic platform jaringan Arsitektur Tampilan." Namun, karena frase
yang telah kehilangan sebagian besar maknanya, kata "Panda3D" jarang
dianggap sebagai akronim lagi.
Software Lisensi
Pada tahun 2002, ketika
mesin itu open source, tujuan dari pengembang adalah untuk menciptakan sebuah
Free Software lisensi. Namun, lisensi memiliki beberapa kekurangan yang
membuatnya non-Free: bisa dibilang diperlukan mengirimkan perubahan Panda.
Project @ Disney.com, dan secara eksplisit melarang ekspor perangkat lunak
untuk berbagai bangsa terhadap mana Amerika Serikat memiliki embargo
perdagangan.
Pada Rabu Mei 28, 2008, batang
pembangunan Panda3D beralih ke lisensi BSD. Namun, rilis lama masih menggunakan
lisensi lama.
Panda3D membuat penggunaan beberapa
perpustakaan pihak ketiga yang izinnya juga tidak Free Software , termasuk FMOD
, Nvidia Cg , DirectX , dan MFC. Sebagian besar dari modul ini dapat dengan
mudah dikeluarkan dari instalasi, namun.
Mendukung protokol Buffer
Saya ingin bicara sejenak tentang dukungan protokol buffer baru dalam versi
pengembangan terbaru dari Panda3D. Ini bukan fitur yang sangat menarik, tetapi
dapat menjadi salah satu yang penting, terutama jika Anda menggunakan Panda3D
bersama-sama dengan perpustakaan lain seperti NumPy atau jika Anda perlu untuk
melakukan banyak operasi tingkat rendah pada tekstur atau data geometri dari
Python. Namun, sebagian besar kasus penggunaan tidak akan memerlukan fungsi ini.
The Python penyangga protokol adalah cara untuk aplikasi Python untuk mendapatkan hook langsung ke C / C + + memori, array pada khususnya. Kelas Panda3D yang mendukungnya memberikan pointer ke memori yang mendasari untuk interpreter Python bersama dengan penjelasan tentang bagaimana data diletakkan di memori. Deskripsi ini diperlukan untuk Python untuk mengetahui bagaimana untuk mengakses dan menyalin informasi.
Dimulai dengan Python 2.6, Anda dapat menggunakan built-in jenis multiview untuk mengakses memori yang mendasari obyek mengekspos antarmuka penyangga. Anda kemudian dapat memanipulasi data dengan mengubahnya menjadi daftar atau objek array.array, menciptakan sub-pandangan dan beroperasi pada mereka, menulis atau membaca bagian ke file, atau bahkan hanya memodifikasi memori langsung seolah-olah itu biasa daftar Python.
Saat ini, satu-satunya kelas Panda3D yang mengekspos antarmuka penyangga GeomVertexArrayData dan PointerToArray (yang terakhir yang digunakan untuk tujuan penyimpanan array yang paling di Panda3D, termasuk tekstur), tetapi lebih kelas dapat dengan mudah ditambahkan pada permintaan. Sebaliknya, Panda memungkinkan mengambil objek penyangga yang sudah ada (seperti dari array.array atau array NumPy) sebagai sumber data untuk tekstur atau array data vertex.
Saat menyalin data ke perpustakaan lain seperti NumPy, hal ini dapat
membantu mengurangi operasi copy yang tidak perlu. Saat ini, Anda akan
memanggil metode seperti get_data () untuk membuat C + + string, yang merupakan
salah satu operasi copy sudah, yang kemudian akan dibungkus ke dalam string
Python, yang adalah hal lain. Akhirnya, Anda akan melewati string ini ke NumPy,
yang akan melakukan setidaknya satu operasi copy untuk menyalin ke representasi
sendiri. Tapi karena NumPy juga mendukung protokol penyangga, Anda sekarang
dapat menyalin isi dari tekstur atau dari array data vertex langsung ke array
NumPy tanpa operasi copy yang tidak perlu.
Satu kasus penggunaan menarik lainnya untuk fitur ini adalah manipulasi
cepat dan efisien data vertex dan data tekstur dari Python. Daripada harus
membuat GeomVertexRewriter atau PNMImage untuk memodifikasi data masing-masing,
kini Anda dapat membuat memoryview untuk iterate atas data secara langsung,
dengan mudah menyalin subset sekitar, atau halaman mereka keluar ke disk. Dalam
kasus penggunaan saya sendiri, yang melibatkan banyak generasi geometri dan
manipulasi, fleksibilitas ini memungkinkan saya untuk secara dramatis
mengurangi waktu yang dihabiskan menghasilkan geometri dan meratakannya. Akses
langsung ke memori juga memungkinkan saya untuk cepat potongan halaman data
geometri ke disk dan kembali ke dalam memori bila diperlukan.
Protokol penyangga menyediakan banyak fleksibilitas akses memori tingkat
rendah tanpa terkena semua seluk-beluk C / C + + memori manajemen. Secara
khusus, data referensi dihitung, sehingga Anda tidak perlu khawatir tentang
menghapus data. Anda harus sebenarnya mampu menjaga multiviews sekitar untuk
konsumsi non-langsung, namun perlu diingat bahwa Anda mungkin masih perlu
memberitahu Panda3D ketika Anda telah memodifikasi data kemudian (misalnya
dengan panggilan eksplisit tambahan untuk modify_ram_image ()).
Fitur ini akan tersedia dalam 1.9.0 rilis Panda3D SDK.
Tiga kali lipat frame rate
Anda?
Secara historis, Panda selalu menjalankan single-core. Dan meskipun basis
kode Panda3D telah ditulis untuk memberikan multithreaded benar, dukungan
multi-processor bila disusun dalam, secara default kita telah menyediakan versi
Panda dibangun dengan apa yang disebut "benang sederhana" model yang
memaksa satu- modus pengolahan inti, bahkan pada mesin multi-core. Tapi semua
itu berubah.
Dimulai dengan Panda3D mendatang versi 1.8, kita akan mulai
mendistribusikan Panda dengan benang benar diaktifkan dalam membangun, yang
memungkinkan Anda untuk mengambil keuntungan dari paralelisasi yang benar pada
setiap modern, mesin multi-core. Tentu saja, jika Anda ingin menggunakan
threading secara langsung, Anda akan harus berurusan dengan isu-isu
kompleksitas coding, seperti kebuntuan dan kondisi ras, yang selalu datang
bersama dengan hal semacam ini. Dan interpreter Python masih fundamental
single-core, sehingga kode yang benar-benar paralel harus ditulis dalam C + +.
Tapi, lebih menggairahkan, kami juga memungkinkan fitur baru opsional dalam
mesin Panda3D sendiri, untuk membuat rendering (yang semua C + + code)
dijalankan sepenuhnya pada sub-benang, memungkinkan kode Python Anda untuk
menjalankan sepenuhnya paralel dengan rendering proses, mungkin dua kali lipat
frame rate Anda. Tapi bahkan melangkah lebih jauh dari itu. Anda berpotensi
dapat membagi seluruh frame ke tiga core yang berbeda, mencapai paralelisasi
belum pernah terjadi sebelumnya dan peningkatan kinerja 3x teoritis (meskipun,
secara realistis, 1.5x 2x lebih mungkin). Dan semua ini terjadi tanpa coding upaya
khusus pada bagian Anda, pengembang aplikasi-Anda hanya perlu menyalakannya.
Bagaimana cara kerjanya?
Bagaimana cara kerjanya?
Untuk menggunakan fitur ini berhasil, Anda akan perlu memahami sesuatu
tentang cara kerjanya. Pertama, pertimbangkan Panda normal, single-threaded membuat
pipa. Waktu yang dihabiskan memproses setiap frame dapat dibagi lagi menjadi
tiga fase yang terpisah, yang disebut "App", "menyisihkan",
dan "Draw":
app, pemusnahan, draw
Dalam nomenklatur Panda, "App" adalah setiap waktu yang
dihabiskan dalam aplikasi sendiri, yaitu program anda. Ini adalah lingkaran
utama Anda, termasuk kode Python (atau C + + code) Anda menulis untuk
mengontrol logika game tertentu Anda. Hal ini juga termasuk perhitungan Panda
berbasis yang harus dilakukan serentak dengan kode aplikasi ini; misalnya,
tabrakan traversal biasanya dianggap sebagai bagian dari App.
"Menyisihkan" dan "Menggambar" adalah dua fase mesin
rendering utama Panda. Setelah kode aplikasi Anda selesai mengeksekusi untuk
frame, maka Cull mengambil alih. Nama "menyisihkan" menyiratkan
pandangan-frustum pemusnahan, dan ini adalah bagian dari itu; tetapi juga
banyak lagi. Fase ini meliputi semua proses grafik adegan yang diperlukan untuk
mengidentifikasi benda-benda yang akan diberikan frame ini dan negara mereka
saat ini, dan semua proses yang diperlukan untuk menempatkan mereka ke dalam
daftar memerintahkan untuk menggambar. Menyisihkan biasanya juga termasuk waktu
untuk menghitung karakter animasi. Output dari Cull adalah daftar diurutkan
objek dan negara-negara terkait untuk dikirim ke kartu grafis.
"Draw" adalah tahap akhir dari proses rendering, yang tidak lebih
dari berjalan melalui daftar objek output dengan menyisihkan, dan mengirim
mereka satu per satu untuk kartu grafis. Hasil imbang ini dirancang untuk menjadi
sebagai ringan mungkin pada CPU; idenya adalah untuk menjaga perintah pipa
grafis diisi dengan banyak perintah render karena akan terus. Draw adalah
satu-satunya tahap proses di mana perintah grafis yang benar-benar dikeluarkan.
Anda dapat melihat waktu aktual yang dihabiskan dalam tiga fase jika Anda memeriksa pelaksanaan program Anda melalui alat PStats. Setiap aplikasi yang berbeda, tentu saja, tapi dalam banyak aplikasi cukup kompleks, waktu yang dihabiskan di masing-masing tiga fase mirip dengan orang lain, sehingga tiga fase kira-kira membagi total waktu bingkai menjadi tiga bagian.
Sekarang bahwa kita memiliki kerangka waktu dibagi menjadi tiga bagian yang lebih-atau-kurang sama, kode pipa ulir dapat berlaku, dengan memisahkan setiap tahap ke dalam thread yang berbeda, sehingga dapat dijalankan (berpotensi) pada CPU yang berbeda, seperti ini :
app, menyisihkan, menarik benang terpisah
Anda dapat melihat waktu aktual yang dihabiskan dalam tiga fase jika Anda memeriksa pelaksanaan program Anda melalui alat PStats. Setiap aplikasi yang berbeda, tentu saja, tapi dalam banyak aplikasi cukup kompleks, waktu yang dihabiskan di masing-masing tiga fase mirip dengan orang lain, sehingga tiga fase kira-kira membagi total waktu bingkai menjadi tiga bagian.
Sekarang bahwa kita memiliki kerangka waktu dibagi menjadi tiga bagian yang lebih-atau-kurang sama, kode pipa ulir dapat berlaku, dengan memisahkan setiap tahap ke dalam thread yang berbeda, sehingga dapat dijalankan (berpotensi) pada CPU yang berbeda, seperti ini :
app, menyisihkan, menarik benang terpisah
Perhatikan bahwa App tetap pada pertama, atau main benang; kita hanya
pindah Cull dan Draw ke thread terpisah. Hal ini penting, karena itu berarti
bahwa semua kode aplikasi Anda dapat terus menjadi single-threaded (dan karena
itu jauh lebih mudah dan lebih cepat untuk mengembangkan). Tentu saja, ada juga
tidak ada yang mencegah Anda menggunakan benang tambahan di App jika Anda ingin
(dan jika Anda memiliki cukup tambahan CPU untuk membuatnya berharga).
Jika memisahkan fase ke benang yang berbeda adalah semua yang kita lakukan,
kita tidak akan mencapai sesuatu yang berguna, karena setiap fase masih harus
menunggu untuk tahap sebelumnya untuk menyelesaikan sebelum dapat melanjutkan.
Tidak mungkin untuk menjalankan menyisihkan untuk mencari tahu hal-hal apa yang
akan diberikan sebelum fase App telah selesai mengatur adegan grafik dengan
benar. Demikian pula, tidak mungkin untuk menjalankan Menggambar sampai tahap
menyisihkan selesai memproses grafik adegan dan membangun daftar objek.
Namun, setelah App selesai diproses frame 1, tidak ada alasan untuk itu
thread untuk duduk-duduk menunggu untuk sisa frame yang akan selesai menggambar.
Hal ini dapat pergi ke depan dan mulai bekerja pada frame 2, pada saat yang
sama bahwa benang menyisihkan mulai memproses frame 1. Dan kemudian pada saat
menyisihkan selesai diproses frame 1, dapat mulai bekerja pada pemusnahan
bingkai 2 (yang juga memiliki App baru saja selesai dengan). Puting itu semua
dalam bentuk grafis, kerangka waktu sekarang terlihat seperti ini:
Sepenuhnya dipentaskan membuat pipa
Jadi, kita melihat bahwa kita sekarang dapat engkol keluar frame sampai
tiga kali lebih cepat daripada di aslinya, single-threaded kasus. Setiap frame
sekarang mengambil jumlah waktu yang sama, total, sebagai terpanjang asli tiga
fase. (Dengan demikian, speedup maksimum teoritis 3x hanya dapat dicapai dalam
praktek jika semua tiga fase yang persis sama panjang.)
Ini perlu menunjukkan bahwa satu-satunya hal yang kita telah meningkat di sini adalah bingkai * Throughput *-jumlah frame per detik bahwa sistem dapat membuat. Pendekatan ini tidak apa-apa untuk meningkatkan bingkai * latency *, atau total waktu yang berlalu antara waktu beberapa perubahan yang terjadi dalam permainan, dan waktu yang muncul pada layar. Ini mungkin menjadi salah satu alasan untuk menghindari pendekatan ini, jika latency lebih penting daripada throughput. Namun, kita masih berbicara tentang total latency yang biasanya kurang dari 100ms atau lebih, yang lebih cepat daripada waktu respon manusia pula; dan sebagian besar aplikasi (termasuk game) dapat mentolerir sejumlah kecil latency seperti ini dalam pertukaran untuk halus, frame rate yang cepat.
Ini perlu menunjukkan bahwa satu-satunya hal yang kita telah meningkat di sini adalah bingkai * Throughput *-jumlah frame per detik bahwa sistem dapat membuat. Pendekatan ini tidak apa-apa untuk meningkatkan bingkai * latency *, atau total waktu yang berlalu antara waktu beberapa perubahan yang terjadi dalam permainan, dan waktu yang muncul pada layar. Ini mungkin menjadi salah satu alasan untuk menghindari pendekatan ini, jika latency lebih penting daripada throughput. Namun, kita masih berbicara tentang total latency yang biasanya kurang dari 100ms atau lebih, yang lebih cepat daripada waktu respon manusia pula; dan sebagian besar aplikasi (termasuk game) dapat mentolerir sejumlah kecil latency seperti ini dalam pertukaran untuk halus, frame rate yang cepat.
Agar semua ini bekerja, Panda harus melakukan beberapa trik pintar di
belakang layar. Trik yang paling penting adalah bahwa perlu ada tiga salinan
yang berbeda dari adegan grafik di negara bagian yang berbeda dari modifikasi.
Karena proses App Anda bergerak node sekitar untuk frame 3, misalnya, Cull
masih menganalisis bingkai 2, dan harus mampu menganalisis grafik adegan *
sebelum * apa pun di App mulai penyia-nyiaan waktu untuk membuat frame 3. Jadi
perlu ada . salinan lengkap dari grafik adegan disimpan sebagai akhir App frame
2 Panda melakukan pekerjaan yang cukup baik untuk melakukan hal ini secara
efisien, bergantung pada kenyataan bahwa sebagian besar hal-hal yang sama dari
satu frame ke yang berikutnya; tapi masih ada beberapa overhead untuk semua
ini, sehingga keuntungan total kinerja selalu agak kurang dari 3x speedup
teoritis. Secara khusus, jika aplikasi sudah berjalan cepat (60fps atau di
atas), maka keuntungan dari paralelisasi kemungkinan akan dikerdilkan oleh
persyaratan overhead tambahan. Dan, tentu saja, jika aplikasi Anda sangat
sepihak, sehingga hampir semua waktunya dihabiskan di App (atau, sebaliknya,
hampir semua waktunya dihabiskan pada Draw), maka Anda tidak akan melihat
banyak manfaat dari ini trik.
Juga, perhatikan bahwa tidak mungkin lagi untuk apa pun di App untuk
menghubungi kartu grafis secara langsung; sementara App berjalan, kartu grafis
sedang dikirim perintah gambar dari dua frame lalu, dan Anda tidak dapat
dipercaya mengganggu ini tanpa mengambil kinerja hit besar. Jadi ini berarti
bahwa OpenGL callback dan sejenisnya harus peka terhadap sifat threaded pipa
grafis. (Inilah sebabnya mengapa antarmuka Panda untuk jendela grafis
memerlukan panggilan tidak langsung:. Base.win.requestProperties (), daripada
base.win.setProperties () Ini diperlukan karena permintaan properti-perubahan
harus ditangani oleh thread menarik.)
Pengadopsi awal diundang untuk mencoba fitur baru ini keluar hari ini, sebelum kami secara resmi merilis 1,8. Ini sudah tersedia dalam rilis buildbot saat ini; untuk menyalakannya, lihat halaman manual baru pada subjek. Marilah kita tahu tanggapan Anda! Masih mungkin kinks untuk bekerja keluar, jadi kami ingin tahu seberapa baik bekerja untuk Anda.
Pengadopsi awal diundang untuk mencoba fitur baru ini keluar hari ini, sebelum kami secara resmi merilis 1,8. Ini sudah tersedia dalam rilis buildbot saat ini; untuk menyalakannya, lihat halaman manual baru pada subjek. Marilah kita tahu tanggapan Anda! Masih mungkin kinks untuk bekerja keluar, jadi kami ingin tahu seberapa baik bekerja untuk Anda.
Panda3D dan Cython
Ini adalah tentang bagaimana untuk mempercepat Anda Kode Python, dan tidak
berdampak langsung pada kinerja Panda3D itu. Untuk sebagian besar proyek,
sebagian besar waktu eksekusi adalah di dalam Panda3D di C + + atau GPU, jadi
tidak peduli apa yang Anda lakukan, memperbaiki Python Anda tidak akan
membantu. Untuk kasus-kasus lain di mana Anda perlu untuk mempercepat kode
Python Anda, Cython dapat membantu. Hal ini terutama ditujukan kepada
orang-orang yang lebih memilih pemrograman Python, tapi tahu setidaknya sedikit
tentang C. Saya tidak akan membahas bagaimana melakukan optimasi dalam Python,
meskipun jika artikel ini adalah relevan bagi Anda, Anda benar-benar harus
melihat ke dalamnya.
Cython adalah bahasa pemrograman yang menarik. Ini menggunakan versi diperpanjang sintaks python untuk memungkinkan hal-hal seperti variabel statis diketik, dan panggilan langsung ke C + + perpustakaan. Cython mengkompilasi kode ini ke C + +. The C + + kemudian mengkompilasi sebagai modul ekstensi python yang Anda dapat mengimpor dan menggunakan seperti modul python biasa. Ada beberapa manfaat untuk ini, tetapi dalam konteks kita yang utama adalah kecepatan. Kode Cython benar ditulis bisa secepat kode C, yang dalam beberapa kasus tertentu bisa bahkan 1000 kali lebih cepat daripada kode python hampir identik. Umumnya Anda tidak akan melihat 1000x kecepatan meningkat, tetapi dapat cukup sedikit. Ini menyebabkan modul untuk hanya bekerja pada platform mereka dikumpulkan, jadi Anda akan perlu untuk mengkompilasi versi alternatif untuk platform yang berbeda.
Secara default, Cython mengkompilasi ke C, tapi versi baru 0,13 mendukung C + +. Ini lebih berguna karena Anda mungkin menggunakan setidaknya satu C + + perpustakaan, Panda3D. Saya memutuskan untuk mencoba ini, dan setelah tersandung pada masalah sederhana, saya mendapatkannya bekerja, dan aku bahkan tidak tahu C + +.
Cython adalah bahasa pemrograman yang menarik. Ini menggunakan versi diperpanjang sintaks python untuk memungkinkan hal-hal seperti variabel statis diketik, dan panggilan langsung ke C + + perpustakaan. Cython mengkompilasi kode ini ke C + +. The C + + kemudian mengkompilasi sebagai modul ekstensi python yang Anda dapat mengimpor dan menggunakan seperti modul python biasa. Ada beberapa manfaat untuk ini, tetapi dalam konteks kita yang utama adalah kecepatan. Kode Cython benar ditulis bisa secepat kode C, yang dalam beberapa kasus tertentu bisa bahkan 1000 kali lebih cepat daripada kode python hampir identik. Umumnya Anda tidak akan melihat 1000x kecepatan meningkat, tetapi dapat cukup sedikit. Ini menyebabkan modul untuk hanya bekerja pada platform mereka dikumpulkan, jadi Anda akan perlu untuk mengkompilasi versi alternatif untuk platform yang berbeda.
Secara default, Cython mengkompilasi ke C, tapi versi baru 0,13 mendukung C + +. Ini lebih berguna karena Anda mungkin menggunakan setidaknya satu C + + perpustakaan, Panda3D. Saya memutuskan untuk mencoba ini, dan setelah tersandung pada masalah sederhana, saya mendapatkannya bekerja, dan aku bahkan tidak tahu C + +.
Sebelum saya masuk ke rincian, saya akan menjelaskan mengapa Anda mungkin
ingin menggunakan Cython, daripada port kemacetan kinerja untuk C + + dengan
tangan. Manfaat utama adalah dalam proses, serta keahlian yang diperlukan. Jika
Anda memiliki basis besar Python kode untuk sebuah proyek, dan Anda memutuskan
beberapa hal perlu menjadi jauh lebih cepat, Anda memiliki beberapa pilihan.
Pendekatan umum tampaknya untuk belajar C + +, pelabuhan kode, dan belajar
bagaimana membuatnya sehingga Anda dapat antarmuka untuk itu dari python.
Dengan Cython, Anda hanya dapat menambahkan beberapa jenis definisi variabel di
mana Anda perlu peningkatan kinerja, dan kompilasi yang memberi Anda modul
Python yang bekerja seperti yang Anda miliki. Jika Anda perlu untuk mempercepat
kode yang interface dengan Panda3D, Anda dapat menukar panggilan Python API
untuk C + + yang. Menggunakan Cython memungkinkan Anda untuk hanya menempatkan
usaha dalam mempercepat bagian dari kode yang Anda butuhkan untuk bekerja, dan
untuk melakukannya tanpa harus mengubah sangat banyak. Hal ini sangat berbeda
dari membolos semua kode dan reimplementing itu bahasa lain. Hal ini juga
mengharuskan Anda untuk belajar jumlah yang cukup minimal barang. Anda juga
bisa menjaga kebaikan dari sintaks Python yang mungkin Python coders telah
datang untuk menghargai.
Masih ada alasan utama untuk benar-benar kode dalam C + + ketika bekerja dengan Panda, tapi sebagai seseorang yang tidak melakukan coding di C + +, saya tidak akan berbicara tentang hal itu banyak. Jika Anda ingin langsung memperpanjang atau berkontribusi Panda3D, ingin menghindari berlebihan menetapkan impor Anda dari file header (Cython akan meminta Anda untuk menentukan kembali bagian-bagian dari API yang Anda gunakan bukan hanya menggunakan file header dikirimkan dengan Panda), atau Anda hanya memilih C + +, C + + mungkin menjadi pilihan yang lebih baik. Aku terutama melihat Cython sebagai pilihan yang nyaman ketika Anda berakhir perlu mempercepat bagian dari Python kode-dasar; bagaimanapun, adalah praktis untuk melaksanakan proyek-proyek besar dari awal di Cython.
Cython memang memiliki beberapa kelemahan juga. Hal ini masih dalam pengembangan lebih awal. Ini berarti Anda akan menemukan bug di penerjemah serta kode yang dihasilkan. Hal ini juga tidak memiliki dukungan untuk fitur Python beberapa, seperti sebagian besar menggunakan generator. Secara umum saya tidak punya banyak masalah dengan masalah ini, tapi pengalaman Anda mungkin berbeda.
Masih ada alasan utama untuk benar-benar kode dalam C + + ketika bekerja dengan Panda, tapi sebagai seseorang yang tidak melakukan coding di C + +, saya tidak akan berbicara tentang hal itu banyak. Jika Anda ingin langsung memperpanjang atau berkontribusi Panda3D, ingin menghindari berlebihan menetapkan impor Anda dari file header (Cython akan meminta Anda untuk menentukan kembali bagian-bagian dari API yang Anda gunakan bukan hanya menggunakan file header dikirimkan dengan Panda), atau Anda hanya memilih C + +, C + + mungkin menjadi pilihan yang lebih baik. Aku terutama melihat Cython sebagai pilihan yang nyaman ketika Anda berakhir perlu mempercepat bagian dari Python kode-dasar; bagaimanapun, adalah praktis untuk melaksanakan proyek-proyek besar dari awal di Cython.
Cython memang memiliki beberapa kelemahan juga. Hal ini masih dalam pengembangan lebih awal. Ini berarti Anda akan menemukan bug di penerjemah serta kode yang dihasilkan. Hal ini juga tidak memiliki dukungan untuk fitur Python beberapa, seperti sebagian besar menggunakan generator. Secara umum saya tidak punya banyak masalah dengan masalah ini, tapi pengalaman Anda mungkin berbeda.
Cython tidak menawarkan manfaat sisi menarik juga. Hal ini memungkinkan
Anda untuk opsional statis jenis variabel dan dengan demikian dapat mendeteksi
lebih banyak kesalahan pada waktu kompilasi daripada Python.
Untuk memulai, pertama-tama Anda perlu menginstal Cython 0,13 (atau mungkin
versi yang lebih baru). Jika Anda memiliki Cython menginstal Anda dapat
memeriksa versi dengan perintah-V. Anda dapat mengambil sumber dari situs
Cython, dan menginstalnya dengan menjalankan "python setup.py install"
dari direktori sumber Cython. Anda juga akan perlu memiliki sebuah kompiler.
Situs Cython akan membantu Anda mendapatkan setup segalanya jika Anda
membutuhkan bimbingan tambahan.
Maka Anda harus mencoba sampel untuk memastikan bahwa Anda memiliki semua
yang Anda butuhkan, dan bahwa itu semua bekerja. Ada bagus C + + sampel untuk
Cython pada Cython Wiki. (Ini bekerja untuk saya pada Mac, dan Windows
menggunakan MinGW atau MSVC sebagai kompilator).
Seperti untuk bekerja dengan Panda3D, ada beberapa hal yang saya temukan:
Ada keuntungan kinerja yang signifikan yang bisa
didapat dengan hanya menyusun modul Python yang ada sebagai Cython. Dengan
pekerjaan tambahan sedikit menambahkan variabel diketik statis, Anda dapat
memiliki keuntungan kinerja yang lebih besar bahkan tanpa pindah ke Panda C + +
API (Yang berarti Anda tidak perlu khawatir tentang menghubungkan terhadap
Panda3D yang dapat menjadi masalah).
Panda3D sudah memiliki binding python dengan manajemen
memori yang baik, jadi saya sarankan instancing semua benda menggunakan python
API, dan hanya beralih ke C + + satu sesuai kebutuhan.
Anda dapat menggunakan 'ini' properti pada objek Python
Panda3D untuk mendapatkan pointer ke C + + objek yang mendasari. Pada mac, Anda perlu memastikan
libpanda (dan beberapa kasus, mungkin orang lain juga) dimuat sebelum mengimpor
modul ekstensi Anda jika Anda menggunakan salah satu perpustakaan Panda3D itu.
Pada Windows, Anda perlu menentukan perpustakaan Anda butuhkan ketika kompilasi (dalam kasus saya, hanya libpanda). The C + + kelas dan kelas Python cenderung memiliki nama yang sama. Untuk mengatasi ini, Anda dapat menggunakan "dari x impor y sebagai z" ketika mengimpor yang python, atau Anda hanya dapat mengimpor panda3d.core, dan menggunakan nama lengkap dari kelas (seperti panda3d.core.Geom). Mungkin ada cara untuk mengubah nama C + + kelas pada impor juga. Jika menggunakan Panda3D C + + API pada Windows, Anda akan perlu menggunakan compiler MSVC. Anda bisa mendapatkan Microsoft Visual Studio 2008 Express Edition secara gratis yang meliputi dibutuhkan compiler.
Dengan menggunakan teknik ini saya mendapat peningkatan kinerja 10x pada kode saya untuk memperbarui posisi vertex di Geom saya. Ini menghindari keharusan untuk membuat objek python untuk semua vertexes dan melewati mereka melalui API Python yang diterjemahkan mereka kembali ke C + + objek. Itu hanya masalah bergerak lebih satu panggilan di dalam loop ke API lain. Ini, bagaimanapun, dilakukan dalam sudah dioptimalkan kode Cython yang hanya memuat posisi vertex disimpan dalam blok memori ke dalam Geom. Kebanyakan kasus penggunaan mungkin akan melihat sedikit manfaat. Keseluruhan meskipun, saya mendapatkan banyak kinerja baik dari perubahan ke Cython, dan dari perubahan ke C + + API. Perubahan ini hanya diperlukan perubahan yang relatif kecil untuk bagian kritis kecepatan kode python saya yang sudah ada.
Pada Windows, Anda perlu menentukan perpustakaan Anda butuhkan ketika kompilasi (dalam kasus saya, hanya libpanda). The C + + kelas dan kelas Python cenderung memiliki nama yang sama. Untuk mengatasi ini, Anda dapat menggunakan "dari x impor y sebagai z" ketika mengimpor yang python, atau Anda hanya dapat mengimpor panda3d.core, dan menggunakan nama lengkap dari kelas (seperti panda3d.core.Geom). Mungkin ada cara untuk mengubah nama C + + kelas pada impor juga. Jika menggunakan Panda3D C + + API pada Windows, Anda akan perlu menggunakan compiler MSVC. Anda bisa mendapatkan Microsoft Visual Studio 2008 Express Edition secara gratis yang meliputi dibutuhkan compiler.
Dengan menggunakan teknik ini saya mendapat peningkatan kinerja 10x pada kode saya untuk memperbarui posisi vertex di Geom saya. Ini menghindari keharusan untuk membuat objek python untuk semua vertexes dan melewati mereka melalui API Python yang diterjemahkan mereka kembali ke C + + objek. Itu hanya masalah bergerak lebih satu panggilan di dalam loop ke API lain. Ini, bagaimanapun, dilakukan dalam sudah dioptimalkan kode Cython yang hanya memuat posisi vertex disimpan dalam blok memori ke dalam Geom. Kebanyakan kasus penggunaan mungkin akan melihat sedikit manfaat. Keseluruhan meskipun, saya mendapatkan banyak kinerja baik dari perubahan ke Cython, dan dari perubahan ke C + + API. Perubahan ini hanya diperlukan perubahan yang relatif kecil untuk bagian kritis kecepatan kode python saya yang sudah ada.
Saya membuat contoh yang agak minimal menggunakan panggilan Panda3D C + +
API dari Cython. Tempatkan setup.py dan file testc.pyx dalam direktori yang
sama, dan dari direktori tersebut, jalankan setup.py dengan Python Anda
menginstal Anda gunakan dengan Panda3D. Jika semuanya sudah dikonfigurasi
dengan benar, ini harus mengkompilasi contoh Cython modul, testc.pyx, untuk
modul ekstensi python dan menjalankannya. Jika berhasil, ia akan mencetak
beberapa baris diakhiri dengan "selesai". Kemungkinan Anda mungkin
perlu men-tweak jalan di setup.py. Jika tidak pada Mac atau Windows, Anda akan
mendapatkan error menunjukkan di mana Anda harus memasukkan pengaturan compiler
Anda (kebanyakan hanya jalan untuk perpustakaan Panda3D s).
Saya ingin mengucapkan terima kasih Lisandro Dalcin dari Cython-Pengguna
mailing list yang membantu saya mendapatkan ini bekerja pada Windows.
Hardware Geometri Instancing
Baru-baru ini, saya telah bekerja pada demo Medan Tak Terbatas kecil yang
menjelaskan bagaimana untuk mengambil keuntungan penuh dari kemampuan daerah
Panda3D itu. Dalam proses ini saya telah menambahkan berbagai fitur untuk
Panda3D yang akan membuat lebih mudah bagi saya, termasuk banyak perbaikan
untuk Shader Generator. (Pada sidenote, saya tidak berakhir membutuhkan setiap
shader untuk medan.)
Senin lalu, saya menambahkan pohon untuk medan. Karena ini merupakan demo
medan tak terbatas, saya perlu untuk menambahkan cukup jumlah pohon yang. Tapi
saya menemukan bahwa (bahkan dengan kemampuan merata Panda3D s) GPU saya dengan
cepat let me down setelah beberapa ribu pohon. Jadi, aku sadar aku butuh untuk
menambahkan geometri dukungan instancing ke Panda3D.
Dan jadi saya lakukan. Ternyata cukup sepele untuk melaksanakan dan hanya
membawa saya satu atau dua jam. Hasilnya cukup menyenangkan! Saya telah
berhasil membuat lebih dari 100000 pohon (dan medan besar) pada saat yang sama
pada framerate yang wajar! Berikut adalah screenshot dari apa yang tampak
seperti sekarang: screenshot-Tue-Dec-22-14-52-54-2009-67
Tentu saja, adegan WIP bisa menggunakan banyak perbaikan, tetapi Anda
mendapatkan poin saya. Dan dengan beberapa pemusnahan yang tepat dan LOD, aku
bisa mendorong jumlah pohon yang lebih tinggi.Tapi tidak Panda3D sudah
mendukung instancing?
Saat ini, Panda3D mendukung instancing model animasi. Itu sama sekali tidak
terkait geometri instancing. Sistem instancing yang ada hanya ada untuk
meningkatkan kinerja jika Anda memiliki banyak model animasi, dengan mengurangi
jumlah pemindahan titik yang dilakukan oleh sistem animasi Panda3D itu.
Geometri instancing, di sisi lain, ada untuk mengurangi jumlah data yang
dilewatkan ke kartu video. Apakah model animasi atau tidak adalah tidak relevan
dengan sistem instancing baru.Bagaimana cara kerjanya?
Sebelum kemarin, jika Anda ingin membuat beberapa contoh model, Anda akan
baik memuat model beberapa kali atau menggunakan CopyTo. Saya telah melihat
bahwa banyak orang menggunakan instanceTo dalam hal ini, tapi itu tidak akan
berpengaruh positif pada kinerja untuk model statis. Geometri masih akan
melewati banyak kali untuk GPU, yang merupakan proses yang lambat.
Dengan sistem baru, Anda tetap hanya satu salinan dari model dan memanggil setInstanceCount
(n) di atasnya. Ini berarti bahwa itu akan tetap diteruskan ke GPU hanya
sekali, tetapi akan diberikan n kali.
Anda mungkin bertanya-tanya, bagaimana cara memberikan setiap parameter
yang berbeda node atau posisi yang berbeda? Nah, yang bisa dilakukan di shader.
Anda dapat mengakses instance ID di shader dan menghitung posisi, warna, dll
berdasarkan itu, atau hanya menggunakan berbeda model proyeksi matriks dari
array mengubah matriks yang lolos ke shader. Hal ini memungkinkan Anda untuk melakukan
dasarnya apapun. Anda dapat mengirim bola tunggal untuk GPU, melewati tekstur
3D dengan peta perpindahan di setiap lapisan, dan mengatur misalnya menghitung
sampai 1024. Itu akan menghasilkan 1.024 batu yang unik dengan menggunakan
hanya satu batch panggilan dan jumlah yang sangat terbatas geometri upload .
Ini meninggalkan pertanyaan apakah ini benar-benar akan bekerja tanpa menggunakan shader. Jawabannya adalah tidak, aku takut. Ada ekstensi OpenGL yang memungkinkan Anda untuk menggunakan geometri instancing dengan pipa tetap-fungsi, tetapi sangat sedikit video card mendukungnya. Karena itu akan sangat rumit untuk menerapkan itu, saya memutuskan untuk tidak melakukannya.
Ini meninggalkan pertanyaan apakah ini benar-benar akan bekerja tanpa menggunakan shader. Jawabannya adalah tidak, aku takut. Ada ekstensi OpenGL yang memungkinkan Anda untuk menggunakan geometri instancing dengan pipa tetap-fungsi, tetapi sangat sedikit video card mendukungnya. Karena itu akan sangat rumit untuk menerapkan itu, saya memutuskan untuk tidak melakukannya.
Catatan bahwa ini hanya didukung dalam OpenGL sejauh ini. Mungkin seseorang
akan menambahkan dukungan untuk ini untuk DirectX sisi Panda suatu hari nanti.
Sistem Impor untuk C + + modul
Saya baru saja memeriksa dukungan untuk baru 'panda3d' modul mengkilap yang
lebih baik mengatur C + + kelas Panda3D. Fitur ini telah diminta untuk
sementara waktu sekarang karena banyak yang terganggu dengan panjang,
terorganisir dan impor melalui pandac.PandaModules. Pada dasarnya, sekarang
memungkinkan Anda untuk mengimpor kelas Panda3D seperti ini:
dari panda3d.egg EggData impor
dari panda3d.egg EggData impor
dari panda3d.ode impor OdeJoint
dari panda3d.core impor *
Sistem saat ini
Ada sejumlah Panda3D pustaka dinamis yang berisi modul Python, misalnya
libp3direct, libpandaexpress, libpanda, libpandaegg dan libpandaode. Anda dapat
langsung mengimpor mereka dari Python dengan mengimpor mereka dengan nama
perpustakaan mereka, dan dengan demikian mengakses kelas dibungkus dan fungsi
perpustakaan ini menghadapkan ke CPython.
Namun, tidak semua fungsi untuk kelas-kelas diimplementasikan dalam C + +. Ada banyak fungsi yang diimplementasikan dalam Python yang menyediakan fungsi tambahan ke C + + kelas. Metode tersebut hanya metode kemudahan untuk membuat hidup Anda lebih mudah, atau ada untuk membuat antarmuka yang lebih Pythonic. Beberapa metode ini telah usang dalam mendukung pelaksanaan itu pada C + + sisi (atau alat pembungkus pembangkit, menginterogasi.)
Fungsi ekstensi ini didefinisikan dalam pandac / libnameModules.py, di mana 'libname' adalah nama dari perpustakaan yang bersangkutan. Setelah Anda mengimpor pandac / PandaModules.py, kode Python diimpor dari semua perpustakaan Panda3D, dan fungsi ekstensi ditambahkan ke kelas.
Namun, tidak semua fungsi untuk kelas-kelas diimplementasikan dalam C + +. Ada banyak fungsi yang diimplementasikan dalam Python yang menyediakan fungsi tambahan ke C + + kelas. Metode tersebut hanya metode kemudahan untuk membuat hidup Anda lebih mudah, atau ada untuk membuat antarmuka yang lebih Pythonic. Beberapa metode ini telah usang dalam mendukung pelaksanaan itu pada C + + sisi (atau alat pembungkus pembangkit, menginterogasi.)
Fungsi ekstensi ini didefinisikan dalam pandac / libnameModules.py, di mana 'libname' adalah nama dari perpustakaan yang bersangkutan. Setelah Anda mengimpor pandac / PandaModules.py, kode Python diimpor dari semua perpustakaan Panda3D, dan fungsi ekstensi ditambahkan ke kelas.
Fungsi ekstensi bukan satu-satunya alasan mengapa 'pandac' pohon ada. Saya
baru saja mengatakan bahwa Anda dapat langsung mengimpor perpustakaan yang
dinamis dari Python, tapi itu tidak sepenuhnya benar - tidak mungkin lagi,
karena dari Python 2.5, pada Mac dan Windows. (Pada Windows, Anda masih dapat
mengimpor dengan mengubah nama dll ke dalam PYD, tapi trik itu tidak bekerja
untuk Mac OSX dylibs.)
Oleh karena itu, kita perlu secara manual mengimpor perpustakaan dengan
menempatkan terlebih dahulu dan kemudian langsung memuatnya melalui fungsi
load_dynamic dalam modul imp Python. Kode untuk melakukan ini telah ditambahkan
ke 'pandac', karena itu adalah tempat di mana perpustakaan Panda3D biasanya
diimpor.
Sistem baru
Sistem baru
Dalam sistem yang baru, bukannya mengimpor kelas yang bersangkutan dari
pandac.PandaModules, Anda akan mengimpor kelas dari submodule dari modul
'panda3d'.
Kami tidak kelompok kelas oleh direktori source mereka, seperti yang diusulkan. Pengorganisasian modul 'panda3d' sedemikian rupa bahwa sub-paket merupakan direktori sumber akan membuatnya sia-sia rumit. Sebaliknya, kami memilih untuk kelas kelompok oleh C + + perpustakaan dinamis. Nama submodule didefinisikan dengan nama perpustakaan tanpa "libpanda" atau "libp3" awalan. Misalnya, peta libpandaegg untuk panda3d.egg, dan libp3direct peta untuk panda3d.direct.
Kami tidak kelompok kelas oleh direktori source mereka, seperti yang diusulkan. Pengorganisasian modul 'panda3d' sedemikian rupa bahwa sub-paket merupakan direktori sumber akan membuatnya sia-sia rumit. Sebaliknya, kami memilih untuk kelas kelompok oleh C + + perpustakaan dinamis. Nama submodule didefinisikan dengan nama perpustakaan tanpa "libpanda" atau "libp3" awalan. Misalnya, peta libpandaegg untuk panda3d.egg, dan libp3direct peta untuk panda3d.direct.
Ada satu pengecualian untuk libpanda dan libpandaexpress perpustakaan,
mereka tergabung dalam satu modul, panda3d.core. Kami memilih untuk melakukan
ini karena libpanda dan libpandaexpress berisi pembungkus Python untuk inti
Panda3D - Anda akan perlu perpustakaan ini untuk melakukan sesuatu yang berguna
dengan Panda3D. Selain itu, perbedaan antara libpanda dan libpandaexpress
adalah sewenang-wenang dan tidak berarti bagi pengembang.
Ketika lebih banyak perpustakaan yang ditambahkan kemudian, seperti libpandaphysx, dan libpandaai, kita hanya bisa menambahkan mereka ke dalam daftar.
Adapun pohon langsung, kami telah meninggalkannya di tempat itu. Ia telah mengemukakan bahwa digabung ke dalam modul panda3d, tapi kami memutuskan untuk tidak melakukannya, karena akan menjadi sia-sia rumit dan membingungkan. Selain itu, saya pikir ada manfaat dalam menjaga modul Python Panda3D dan C + + modul terpisah.
Kami melakukan mengakui penamaan malang pohon langsung, dan kami mungkin mengubah bahwa untuk masa mendatang, tapi itu akan menjadi perubahan besar.
Sistem impor baru semua dibundel ke dalam satu file, panda3d.py. Ini ganjil dari Python ilmu hitam tidak semua yang diperlukan - ini menempatkan perpustakaan Panda3D, menambahkan lokasi mereka ke jalur perpustakaan sistem, modul register palsu, dan dinamis beban perpustakaan diperlukan ketika seseorang mulai menggunakan kelas dari itu.
Adapun fungsi ekstensi Python, mereka tidak didukung dalam sistem yang baru. Alasan untuk ini adalah bahwa kita mencoba untuk fase keluar, dan mencoba untuk memindahkan sebagian besar fungsi ke C + + sisi Panda3D.
Ketika lebih banyak perpustakaan yang ditambahkan kemudian, seperti libpandaphysx, dan libpandaai, kita hanya bisa menambahkan mereka ke dalam daftar.
Adapun pohon langsung, kami telah meninggalkannya di tempat itu. Ia telah mengemukakan bahwa digabung ke dalam modul panda3d, tapi kami memutuskan untuk tidak melakukannya, karena akan menjadi sia-sia rumit dan membingungkan. Selain itu, saya pikir ada manfaat dalam menjaga modul Python Panda3D dan C + + modul terpisah.
Kami melakukan mengakui penamaan malang pohon langsung, dan kami mungkin mengubah bahwa untuk masa mendatang, tapi itu akan menjadi perubahan besar.
Sistem impor baru semua dibundel ke dalam satu file, panda3d.py. Ini ganjil dari Python ilmu hitam tidak semua yang diperlukan - ini menempatkan perpustakaan Panda3D, menambahkan lokasi mereka ke jalur perpustakaan sistem, modul register palsu, dan dinamis beban perpustakaan diperlukan ketika seseorang mulai menggunakan kelas dari itu.
Adapun fungsi ekstensi Python, mereka tidak didukung dalam sistem yang baru. Alasan untuk ini adalah bahwa kita mencoba untuk fase keluar, dan mencoba untuk memindahkan sebagian besar fungsi ke C + + sisi Panda3D.
Fitur lain yang keren adalah bahwa modul 'panda3d' menerapkan sistem
malas-loading untuk itu perpustakaan. Itu berarti bahwa perpustakaan hanya akan
di-load ketika Anda benar-benar menggunakan salah satu kelas itu. Hal ini
memiliki keuntungan bahwa perpustakaan Anda tidak menggunakan tidak akan
dimuat, yang dapat mengakibatkan kecepatan sedikit dan mendapatkan memori.
Alasan
Sekarang, mengapa kita melakukannya? Selain fakta bahwa telah diminta beberapa kali, ada beberapa manfaat untuk itu. Pertama-tama, itu lebih terorganisir, memungkinkan orang untuk mengetik lebih cepat dan lebih mudah, dan itu mengarah pada kode bersih. Selain itu, Anda tidak mengimpor perpustakaan Anda tidak perlu, yang mengarah ke sedikit lebih cepat kali impor, dan penggunaan memori yang lebih sedikit. Tapi yang lebih penting lagi, karena kita membutuhkannya untuk sistem plugin / runtime.
Eh, apa, mengapa? Aku akan menjelaskan. Ketika Anda mendistribusikan game yang dapat digunakan dengan runtime Panda3D (baik itu plugin browser, atau baik itu runtime mandiri), Anda pak ke file P3D.. File P3D. Akan menunjukkan versi Panda3D itu dibangun untuk. Ketika seseorang menjalankan file P3D. Melalui runtime, runtime mendownload membangun ultra-dioptimalkan kecil Panda3D untuk menjalankan paket P3D disediakan..
Paket Panda3D ini yang di-download oleh runtime harus sekecil mungkin. Karena seluruh Panda3D membangun akan mengandung komponen besar yang tidak setiap pertandingan akan menggunakan, kita telah memisahkan mereka ke dalam paket terpisah. Misalnya, "panda3d" paket berisi inti, "telur" paket berisi libpandaegg (biasanya, permainan dikemas hanya akan berisi file. Bam, jadi ini biasanya tidak diperlukan), libpandaode, sebuah "model" paket berisi default model, satu paket per perpustakaan audio, dll file P3D. dapat menunjukkan yang paket itu tergantung pada, sehingga ukuran download disimpan ke minimum.
Yang memberikan masalah dengan sistem lama impor pandac.PandaModules-gaya, meskipun. Pertama-tama, pandac.PandaModules impor setiap perpustakaan tunggal, sementara itu tidak menjamin bahwa semua perpustakaan pada sistem (seperti file P3D. Mungkin tidak perlu beberapa dari mereka). Kami harus menempatkan Hacky penangan ImportError pengecualian dalam PandaModules.py untuk bekerja di sekitar itu.
Selain itu, dengan sistem lama, kita tidak memiliki kontrol lagi atas kelas diimpor. Mengapa kita perlu itu? Nah, game ini memiliki kemampuan untuk men-download dan menginstal komponen lebih Panda3D ketika sedang berjalan. Dengan sistem baru, ketika misalnya komponen "telur" terinstal, kita dapat dengan mudah menambahkan hook ke dalam 'panda3d.egg' modul secara otomatis diperbarui dengan perpustakaan libpandaegg diinstal baru. Hal ini memungkinkan developer game untuk menjaga waktu pra-Upload untuk minimum dengan menginstal paket pada permintaan (misalnya, jika hanya bagian dari permainan menggunakan ODE fisika, pengembang dapat memilih untuk memiliki paket 'ode' diinstal setiap kali akhir-the pengguna memilih untuk menjalankan bagian dari permainan.)
Bagaimana hal itu mempengaruhi Anda
Jika Anda masih terjaga setelah membaca semua itu, Anda mungkin bertanya-tanya apa yang akan terjadi pada semua kode yang sudah ada. Apakah ini memecahkan apa pun? Jawabannya adalah, tidak. Sekarang, itu hanya file Python kecil yang saya menambahkan, yang memungkinkan Anda untuk mengimpor kelas Panda3D menggunakan konvensi yang berbeda. Ini masih eksperimental, sehingga 'pandac' pohon masih ada, dan bahkan tidak ditinggalkan. Ketika, mungkin setelah seri 1.7 rilis, sistem baru telah diuji secara menyeluruh dan terbukti bekerja lebih baik, kita bisa beralih kode Python dan contoh program ke sistem baru, dan merekomendasikan orang untuk menggunakannya.
Tapi jika Anda tidak merasa seperti switching, jangan khawatir. Seperti kita peduli tentang kompatibilitas ke belakang, dan karena sebagian besar dari kode ini sangat tergantung pada struktur lama, struktur 'pandac' mungkin akan sekitar untuk waktu loooong.
Contoh
Last but not least, beberapa contoh impor menunjukkan Anda sedikit cara kerjanya:
dari panda3d.egg EggData impor
dari panda3d impor ode
bersama = ode.OdeJoint
dari panda3d.core impor *
tex = Tekstur ()
tex.read (Filename ("img.png"))
impor panda3d.directival = panda3d.direct.CInterval ()
Plugin Browser dan samping
manfaatnya
Kebanyakan orang tahu bahwa ada proyek dilakukan untuk membangun sebuah
plugin browser untuk Panda3D. Saya telah bekerja keras pada proyek itu selama
beberapa minggu terakhir, dan sekarang sudah hampir selesai, meskipun masih ada
lebih banyak pekerjaan untuk pergi. Kami akan menargetkan 1.7.0, atau
setidaknya 1.7.1, dengan rilis pertama dari upaya ini.
Saya pikir ini akan menjadi waktu yang baik untuk menjelaskan apa, tepatnya, Panda akan mendapatkan sebagai hasil dari semua ini.
Saya pikir ini akan menjadi waktu yang baik untuk menjelaskan apa, tepatnya, Panda akan mendapatkan sebagai hasil dari semua ini.
Plugin browser
Pertama, ada yang sudah jelas: Anda akan dapat menjalankan aplikasi Panda3D
Anda sebagai jendela tertanam dalam browser. Cukup menanamkan jendela Panda3D
di browser secara teknis sangat mudah; kami memiliki kerja ini dalam beberapa
hari setelah memulai proyek. Kita dapat berjalan pada setiap browser utama pada
platform Panda3D didukung: IE pada Windows, atau Firefox pada Windows, Mac, dan
Linux, belum lagi Safari, Chrome, Opera, dan mungkin beberapa browser yang
lebih fiddly bahwa saya belum diuji belum. Pada setiap browser, dan pada setiap
platform, menggunakan kemampuan hardware penuh kartu grafis Anda, dan berjalan
pada frame rate penuh; tidak perlu terbatas pada software rendering. (Mungkin
ada sedikit dampak pada kinerja kecil pada platform tertentu, tetapi masih, itu
cara yang lebih cepat daripada perangkat lunak rendering.)
Tapi kemudian ada pertanyaan besar tentang bagaimana Anda
mendapatkan kode Anda ke sebuah halaman web di tempat pertama?
File P3D
Untuk mengatasi itu, kita perlu alat untuk paket aplikasi Anda menjadi sebuah file download yang nyaman. Kami telah memiliki dasar-dasar alat tersebut untuk sementara waktu sekarang, tapi sekarang itu jauh lebih fleshed keluar. Ia bekerja semacam packpanda tidak, tapi bukannya membangun file exe, itu paket aplikasi Anda ke dalam sebuah file P3D. Pikirkan hal ini seperti Flash file swf dikompilasi. Sekarang, Anda dapat menanamkan file P3D Anda dalam halaman web dengan beberapa baris HTML sintaks, sangat mirip dengan cara Anda menanamkan file Flash swf, dan ada aplikasi Panda3D Anda bermain di halaman web!
File P3D berisi semua yang anda butuhkan untuk menjalankan aplikasi Anda. Jadi mengapa kita harus membatasi diri untuk menjalankan file P3D hanya pada web browser? Mari kita tidak. Kami juga akan mendistribusikan executable mandiri yang disebut panda3d.exe (atau hanya panda3d pada Mac dan Linux), yang dapat digunakan untuk menjalankan file P3D pada desktop Anda, tidak ada browser yang diperlukan.
Untuk mengatasi itu, kita perlu alat untuk paket aplikasi Anda menjadi sebuah file download yang nyaman. Kami telah memiliki dasar-dasar alat tersebut untuk sementara waktu sekarang, tapi sekarang itu jauh lebih fleshed keluar. Ia bekerja semacam packpanda tidak, tapi bukannya membangun file exe, itu paket aplikasi Anda ke dalam sebuah file P3D. Pikirkan hal ini seperti Flash file swf dikompilasi. Sekarang, Anda dapat menanamkan file P3D Anda dalam halaman web dengan beberapa baris HTML sintaks, sangat mirip dengan cara Anda menanamkan file Flash swf, dan ada aplikasi Panda3D Anda bermain di halaman web!
File P3D berisi semua yang anda butuhkan untuk menjalankan aplikasi Anda. Jadi mengapa kita harus membatasi diri untuk menjalankan file P3D hanya pada web browser? Mari kita tidak. Kami juga akan mendistribusikan executable mandiri yang disebut panda3d.exe (atau hanya panda3d pada Mac dan Linux), yang dapat digunakan untuk menjalankan file P3D pada desktop Anda, tidak ada browser yang diperlukan.
Panda3D runtime
Lihatlah apa yang terjadi! Tiba-tiba, packpanda tidak lagi diperlukan.
Bahkan jika Anda tidak pernah berencana untuk menanamkan aplikasi Anda pada
halaman web, Anda dapat pak ke file P3D, dan mendistribusikan file bukan
executable yang packpanda akan diproduksi. File P3D lebih baik dari file exe,
karena (a) itu jauh lebih kecil, yang berisi aplikasi Anda saja, dan bukan
salinan lain dari Panda, dan (b) itu platform-independen (disediakan aplikasi
Anda ditulis dengan Python murni).
Siapapun yang menerima berkas P3D Anda bisa klik dua kali pada icon
tersebut, dan jika mereka telah menginstal runtime Panda3D, tidak peduli apa OS
mereka berjalan, akan meluncurkan dan menjalankan dengan salinan lokal mereka
panda3d.exe. Jika Anda ingin mendistribusikannya kepada orang-orang yang
mungkin belum memiliki runtime Panda3D, Anda dapat mengarahkan mereka link pada
panda3d.org untuk menginstalnya, atau (jika Anda mendistribusikan judul CD-Rom,
misalnya), Anda dapat mengirim salinan runtime Panda3D bersama dengan permainan
dan menginstalnya secara otomatis. Hal ini mirip dengan cara permainan
mendistribusikan runtime DirectX dari Microsoft. Pengguna yang menerima
permainan Anda pada CD tidak perlu tahu bahwa mereka menjalankan Panda3D,
meskipun mereka masih menjalankan permainan Anda dari file P3D.
Integrasi iPhone
Ini layak disebutkan secara sepintas, juga, bahwa ketika upaya plugin
browser ini dilakukan dan saya mendapatkan kesempatan untuk meninjau kembali
dukungan iPhone, maka saya akan dapat menulis Panda3D ini runtime untuk iPhone
juga, yang akan memutar file P3D yang sama yang bermain di desktop Anda.
(Realistis, Anda masih perlu untuk menyempurnakan permainan untuk membuatnya
bekerja dengan baik pada iPhone. Kinerja Rendering dan antarmuka persyaratan
yang sangat berbeda pada iPhone daripada mereka pada PC Anda. Tapi teknologi yang
mendasari akan sama, dan beberapa game sederhana dapat bekerja tidak berubah
pada kedua platform.) Sayangnya, Apple memiliki aturan lucu tentang aplikasi
yang menjalankan aplikasi lain, jadi ini aplikasi Panda3D runtime tidak akan
diizinkan pada iPhone non-Jailbroken. Untuk tinggal di dalam saluran yang sah,
kami juga akan menyediakan cara untuk mengkompilasi file P3D menjadi benar, app
iPhone benar-benar mandiri yang dapat didistribusikan melalui App Store dan
diinstal ke setiap iPhone. (Ini juga akan mengharuskan Anda untuk membayar
biaya Apple $ 100 pengembang, tentu saja.)
Keamanan web
Sekarang, kembali ke plugin browser, dan file P3D. Saya belum berbicara
tentang keamanan: salah satu hal yang Flash dan Java sangat baik di (dan
ActiveX sangat buruk at) dengan aman menjalankan kode yang tidak dipercaya pada
halaman web. Ketiga teknologi ini memungkinkan sebuah program pada halaman web
untuk segera mulai berjalan segera setelah Anda mengunjungi halaman. Hal ini
memiliki implikasi yang jelas untuk hacker menginstal malware ke komputer Anda:
sedangkan Flash dan Java keduanya pergi melalui lingkaran untuk membuat tidak
mungkin untuk melakukan hal ini, ActiveX pada dasarnya membuka seluruh komputer
Anda untuk program apa pun halaman web ingin lari. Untuk mengatasi dampak dari
hal ini, Microsoft telah secara bertahap menutup berjalan otomatis aplikasi
ActiveX, dan sekarang secara default meminta Anda sebelum menjalankan program
ActiveX untuk pertama kalinya.
Jelas, kita lebih suka menjadi seperti Flash dan Java dalam hal ini daripada seperti ActiveX. Sayangnya, ternyata bahwa Python tidak benar-benar meminjamkan dirinya untuk menjalankan kode yang tidak dipercaya aman. Tidak seperti Flash ActionScript, atau Java, Python tidak pernah dirancang dari awal untuk menjadi bahasa yang aman, dan itu ridiculously penuh lubang. Ini hampir mustahil untuk mencegah kode Python melakukan cukup banyak apa pun suka dengan perangkat keras komputer. Benar-benar. Ada orang-orang di internet yang berpikir Python dapat dibuat aman (saya pernah menjadi salah satu dari mereka), dan beberapa orang yang berpikir mereka sudah melakukannya, tetapi untuk sebagian besar mereka keliru.
Ada beberapa solusi yang mungkin untuk ini. Sebagai contoh, kita bisa menjalankan interpreter Python sepenuhnya pada mesin virtual. Itu sulit, karena beberapa alasan, tetapi mungkin lebih mudah di masa depan, sebagai teknologi yang matang. Zope memiliki python aman yang saya pikir benar-benar dapat mencapai keamanan, tetapi juga sulit untuk digunakan, dan saya tidak yakin apa efeknya terhadap kinerja runtime. Juga, mungkin IronPython memegang janji, karena itulah dasarnya Python berjalan dalam lingkungan yang sudah aman; tapi sekali lagi ini adalah perubahan besar dari CPython kita semua datang untuk mengetahui dan cinta.
Sebagai pengganti salah satu dari mereka, saya akan menerapkan sesuatu seperti model keamanan ActiveX, seperti lumpuh seperti itu. Apa ini berarti bagi Anda adalah bahwa Anda akan harus menandatangani file P3D Anda ketika Anda menempatkan mereka pada sebuah situs web. ("Penandatanganan" file berarti menandai dengan kunci unik yang mengidentifikasi Anda sebagai pengembang Tidak apa-apa jika itu anonim,. Satu-satunya titik adalah bahwa itu unik.) Anda dapat mendaftar semua file P3D Anda dengan kunci yang sama. Ketika plugin web Panda3D datang di file P3D ditandatangani dengan kunci baru itu tidak mengakui, itu akan menawarkan pengguna pilihan apakah akan menyetujui kunci yang sebelum menjalankan aplikasi. Jika pengguna menyetujui kunci-yang berarti ia memberi Anda izin untuk menjalankan kode pada mesin-nya maka akan menjalankan file P3D, dan akan mengingat persetujuan pengguna untuk file P3D masa depan ditandatangani dengan kunci yang sama. Ini pada dasarnya adalah jenis yang sama dari persetujuan pengguna harus memberikan untuk men-download exe, sehingga tidak benar-benar mengganggu distribusi aplikasi, meskipun itu tidak membuatnya sedikit canggung jika Anda ingin memiliki berkas P3D Anda bermain secara otomatis yang pertama kali seseorang datang ke website Anda.
Ada kemungkinan lain untuk model keamanan yang berbeda di jalan, tapi saya pikir ini akan membahas masalah ini secara memadai untuk jangka pendek.
Jelas, kita lebih suka menjadi seperti Flash dan Java dalam hal ini daripada seperti ActiveX. Sayangnya, ternyata bahwa Python tidak benar-benar meminjamkan dirinya untuk menjalankan kode yang tidak dipercaya aman. Tidak seperti Flash ActionScript, atau Java, Python tidak pernah dirancang dari awal untuk menjadi bahasa yang aman, dan itu ridiculously penuh lubang. Ini hampir mustahil untuk mencegah kode Python melakukan cukup banyak apa pun suka dengan perangkat keras komputer. Benar-benar. Ada orang-orang di internet yang berpikir Python dapat dibuat aman (saya pernah menjadi salah satu dari mereka), dan beberapa orang yang berpikir mereka sudah melakukannya, tetapi untuk sebagian besar mereka keliru.
Ada beberapa solusi yang mungkin untuk ini. Sebagai contoh, kita bisa menjalankan interpreter Python sepenuhnya pada mesin virtual. Itu sulit, karena beberapa alasan, tetapi mungkin lebih mudah di masa depan, sebagai teknologi yang matang. Zope memiliki python aman yang saya pikir benar-benar dapat mencapai keamanan, tetapi juga sulit untuk digunakan, dan saya tidak yakin apa efeknya terhadap kinerja runtime. Juga, mungkin IronPython memegang janji, karena itulah dasarnya Python berjalan dalam lingkungan yang sudah aman; tapi sekali lagi ini adalah perubahan besar dari CPython kita semua datang untuk mengetahui dan cinta.
Sebagai pengganti salah satu dari mereka, saya akan menerapkan sesuatu seperti model keamanan ActiveX, seperti lumpuh seperti itu. Apa ini berarti bagi Anda adalah bahwa Anda akan harus menandatangani file P3D Anda ketika Anda menempatkan mereka pada sebuah situs web. ("Penandatanganan" file berarti menandai dengan kunci unik yang mengidentifikasi Anda sebagai pengembang Tidak apa-apa jika itu anonim,. Satu-satunya titik adalah bahwa itu unik.) Anda dapat mendaftar semua file P3D Anda dengan kunci yang sama. Ketika plugin web Panda3D datang di file P3D ditandatangani dengan kunci baru itu tidak mengakui, itu akan menawarkan pengguna pilihan apakah akan menyetujui kunci yang sebelum menjalankan aplikasi. Jika pengguna menyetujui kunci-yang berarti ia memberi Anda izin untuk menjalankan kode pada mesin-nya maka akan menjalankan file P3D, dan akan mengingat persetujuan pengguna untuk file P3D masa depan ditandatangani dengan kunci yang sama. Ini pada dasarnya adalah jenis yang sama dari persetujuan pengguna harus memberikan untuk men-download exe, sehingga tidak benar-benar mengganggu distribusi aplikasi, meskipun itu tidak membuatnya sedikit canggung jika Anda ingin memiliki berkas P3D Anda bermain secara otomatis yang pertama kali seseorang datang ke website Anda.
Ada kemungkinan lain untuk model keamanan yang berbeda di jalan, tapi saya pikir ini akan membahas masalah ini secara memadai untuk jangka pendek.
JavaScript integrasi
Kembali ke hal yang baik. Menjalankan sebuah aplikasi di sebuah kotak kecil
pada halaman web adalah menyenangkan untuk sementara waktu, tapi itu tidak
benar-benar membeli Anda banyak kecuali dapat berinteraksi dengan halaman web
di sekitarnya.
Untuk menempatkan ini dalam konteks: Python dan JavaScript adalah bahasa yang sangat mirip; baik dukungan terlambat mengikat, penciptaan objek dinamis, dan mengetik bebek. Panda sudah cukup bagus di membungkus C + + objek untuk keuntungan Python; dibandingkan dengan ganjil itu, membungkus objek JavaScript adalah angin musim panas yang hangat. Jadi mengapa tidak melakukannya dengan benar, dan sepenuhnya mengekspos seluruh JavaScript ruang objek untuk mengarahkan manipulasi oleh Python?
Jadi, kita lakukan. Plugin Panda3D memungkinkan Anda untuk menulis kode Python yang terlihat seperti "document.getElementById ('form'). Greeting.value = 'hello'", yang tentu saja mengubah nilai bentuk pada halaman web, menggunakan model JavaScript DOM. Tapi kau menulis di Python. Bahkan, apa pun yang dapat melakukan JavaScript, program Python Anda bisa melakukan terlalu. Dan sebaliknya adalah benar juga: kami memungkinkan Anda untuk mengekspos objek Python pilihan Anda JavaScript, untuk memungkinkan halaman web untuk langsung menyodok nilai-nilai ke dalam aplikasi Anda, atau bahkan memanggil metode Python Anda!
Ini berarti Anda dapat dengan mudah mengintegrasikan Program web Panda3D Anda dengan program web lainnya, yang ditulis dalam JavaScript atau bahasa web-lain yang didukung. Sebagai contoh, saya telah menyediakan halaman demo yang menggambarkan Panda3D berinteraksi dengan Flash pada halaman yang sama bersama-sama, mengirim benda bolak-balik antara Panda dan Flash. Ketika plugin lebih selesai, saya akan memberikan ini halaman demo dan lain-lain untuk pemeriksaan umum.
Untuk menempatkan ini dalam konteks: Python dan JavaScript adalah bahasa yang sangat mirip; baik dukungan terlambat mengikat, penciptaan objek dinamis, dan mengetik bebek. Panda sudah cukup bagus di membungkus C + + objek untuk keuntungan Python; dibandingkan dengan ganjil itu, membungkus objek JavaScript adalah angin musim panas yang hangat. Jadi mengapa tidak melakukannya dengan benar, dan sepenuhnya mengekspos seluruh JavaScript ruang objek untuk mengarahkan manipulasi oleh Python?
Jadi, kita lakukan. Plugin Panda3D memungkinkan Anda untuk menulis kode Python yang terlihat seperti "document.getElementById ('form'). Greeting.value = 'hello'", yang tentu saja mengubah nilai bentuk pada halaman web, menggunakan model JavaScript DOM. Tapi kau menulis di Python. Bahkan, apa pun yang dapat melakukan JavaScript, program Python Anda bisa melakukan terlalu. Dan sebaliknya adalah benar juga: kami memungkinkan Anda untuk mengekspos objek Python pilihan Anda JavaScript, untuk memungkinkan halaman web untuk langsung menyodok nilai-nilai ke dalam aplikasi Anda, atau bahkan memanggil metode Python Anda!
Ini berarti Anda dapat dengan mudah mengintegrasikan Program web Panda3D Anda dengan program web lainnya, yang ditulis dalam JavaScript atau bahasa web-lain yang didukung. Sebagai contoh, saya telah menyediakan halaman demo yang menggambarkan Panda3D berinteraksi dengan Flash pada halaman yang sama bersama-sama, mengirim benda bolak-balik antara Panda dan Flash. Ketika plugin lebih selesai, saya akan memberikan ini halaman demo dan lain-lain untuk pemeriksaan umum.
Paket alat
Masih ada lebih terlibat di sini. Kemasan aplikasi Anda ke dalam sebuah
file P3D tunggal semua baik dan bagus untuk aplikasi kecil, tapi bagaimana
dengan aplikasi yang benar-benar besar seperti MMO, untuk yang Panda3D berutang
asli raison d'ĂȘtre-nya? Pengguna Anda tidak akan ingin men-download file 200 MB
P3D setiap kali mereka ingin bermain. Jadi, kita perlu sistem untuk kemasan
potongan-potongan kecil dari kode, dan men-download mereka secara individu, dan
/ atau berbagi potongan-potongan ini di antara aplikasi yang berbeda.
Masukkan sistem paket umum. Alat yang sama yang dapat membuat file P3D juga dapat membangun paket umum: koleksi kode Python, modul ekstensi dikompilasi, dan model, yang bukan aplikasi per se, tetapi dapat diminta oleh aplikasi saat runtime dan di-download pada permintaan. Sekarang ketika aplikasi Anda mendapatkan besar, Anda memiliki dua pilihan: Anda dapat bundel menjadi satu file P3D monolitik, dan membiarkan pengguna men-download semuanya di depan; atau Anda dapat membuat satu file P3D kecil yang diunduh pengguna pertama untuk mendapatkan ke dalam permainan-yang mungkin tidak lebih dari layar-dan judul maka Anda strategis dapat men-download seluruh kode dalam berbagai paket, sementara pengguna terus bermain bagian (s) yang telah Anda download.
Sistem paket juga akan secara otomatis mengintegrasikan dengan Panda built-in mekanisme patchfile, memungkinkan Anda untuk memberikan update tanpa memaksa pengguna untuk men-download benar-ulang seluruh aplikasi.
Masukkan sistem paket umum. Alat yang sama yang dapat membuat file P3D juga dapat membangun paket umum: koleksi kode Python, modul ekstensi dikompilasi, dan model, yang bukan aplikasi per se, tetapi dapat diminta oleh aplikasi saat runtime dan di-download pada permintaan. Sekarang ketika aplikasi Anda mendapatkan besar, Anda memiliki dua pilihan: Anda dapat bundel menjadi satu file P3D monolitik, dan membiarkan pengguna men-download semuanya di depan; atau Anda dapat membuat satu file P3D kecil yang diunduh pengguna pertama untuk mendapatkan ke dalam permainan-yang mungkin tidak lebih dari layar-dan judul maka Anda strategis dapat men-download seluruh kode dalam berbagai paket, sementara pengguna terus bermain bagian (s) yang telah Anda download.
Sistem paket juga akan secara otomatis mengintegrasikan dengan Panda built-in mekanisme patchfile, memungkinkan Anda untuk memberikan update tanpa memaksa pengguna untuk men-download benar-ulang seluruh aplikasi.
Juga, kita dapat menggunakan sistem ini paket yang sama untuk memberikan
beberapa perpustakaan ekstensi, seperti pygame atau wx, hal-hal yang tidak
ketat bagian dari Panda tetapi banyak aplikasi akan ingin mengambil keuntungan
dari.
Anda juga dapat, tentu saja, model beban dan seperti langsung dari URL
sewenang-wenang. Tapi Anda bisa melakukan itu hari ini, dengan menggunakan
vfs-mount-url Config.prc setting; itu bukan fitur baru dari Panda (meskipun
tidak mengambil relevansi baru dalam pengaturan berbasis web).
Versi Panda3D
Kami belum berbicara tentang berbagai versi Panda3D. Di sinilah ia mendapat yang baik: setiap file P3D tahu
versi Panda3D yang digunakan untuk memproduksinya, dan hanya akan mencoba untuk
menjalankan dengan versi yang sama dari Panda. Tapi runtime Panda3D itu sendiri
versi-independen. Ketika Anda menjalankan file P3D khusus, runtime Panda3D akan
mencari tahu apa versi Panda diperlukan. Jika versi yang belum diinstal pada
komputer pengguna, ia akan pergi dan men-download terlebih dahulu. Ini adalah
pekerjaan dari runtime Panda3D untuk mengelola berbagai versi Panda, dan untuk
menjaga mereka semua terpisah dari satu sama lain; dan hal ini secara otomatis,
tanpa pengguna bahkan perlu tahu bahwa hal itu terjadi. Bahkan, Anda bahkan
dapat menjalankan dua versi yang berbeda dari Panda pada saat yang sama pada
halaman web yang sama.
Ini berarti bahwa sekali Anda, atau pengguna, telah terinstal runtime
Panda3D, Anda tidak perlu khawatir tentang memperbarui ketika versi baru dari
Panda datang. Secara otomatis update sendiri sesuai kebutuhan. Hal ini berlaku
untuk panda3d.exe mandiri serta untuk plugin browser. (Setiap sesekali mungkin
ada update ke runtime itu sendiri, yang akan membutuhkan update eksplisit oleh
pengguna. Tetapi upgrade dasar Panda3D atau paket yang tidak akan membutuhkan
ini.)
Perhatikan bahwa runtime Panda3D akan cache semua ini paket download pada
hard disk pengguna. Harus ada batas untuk jumlah mengkonsumsi ruang Panda,
sehingga runtime akan memiliki untuk mengelola ruang ini dan secara otomatis
menghapus yang lama, paket yang tidak terpakai dan versi. Tapi ruang yang
digunakan dapat cukup besar dengan standar web browser (disk saat ini cukup
besar untuk menyimpan ratusan megabyte terselip di sudut), dan tidak ada alasan
untuk menjejalkan semua ini dalam direktori cache yang relatif kecil web
browser. Bahkan masih, jika Anda membutuhkan lebih banyak ruang untuk aplikasi
Anda dari Panda biasanya menyediakan, Anda dapat mengambil-ingat, pengguna
telah memberikan izin aplikasi Anda. :)
Kami juga akan menyediakan halaman web yang pengguna dapat mengunjungi
mengelola / nya instalasi Panda3D nya, pemantauan file cache dan semacamnya,
dan tweaking file konfigurasi global untuk / nya dia sukai.
0 komentar:
Posting Komentar