2016-04-11 37 views
1

Çalıştığım ancak ışıklandırmayan bir ışın izleyici yapıyorum (henüz). Bilmeyenler için, ışın izleyicileri, ekranın her bir pikselinden kameradan (görüntüleyici) gelen ışınları göndererek, 3B alanda nesnelerin çarpışmalarını test ederek ve ışın bir nesneyi vuruyorsa pikseli boyayarak çalışır.Java: Çok iş parçacıklı ve 2 boyutlu iş parçacıkları

Her bir piksel için hesaplamaları çalıştırmalısınız, bu da birçok hesaplamadır. Bu yüzden her bir piksel sütunu için bir iş parçacığım var. Şu anda Runnable'ı uyguluyorum. Bu, programın hızını artırır ve harici işlemlerde (ki bu iyidir) genel işlem hızı üzerinde dikkate değer bir etkiye sahip değildir.

Aydınlatma için, fotoğraf makinesinin ışınının nesneyi kesiştiği ve bu noktanın yakılması gerektiğinden emin olun (buradaki tüm ışık kaynaklarının hesaba katılması yeterli olacaktır).) çoklu iş parçacığı.

Konuların daha fazla iş parçacığı (2D iş parçacığı) oluşturmasının kötü bir uygulama olduğunu düşünürüm, ancak bunu gerçekleştiren bazı kitaplık veya uygulama yöntemi var mıdır? Bunun sonsuz bir tekrarlamaya yol açmayacağını biliyorum, fakat ayrıca CPU'yu aşırı yüklemek istemiyorum. Esasen "2D diş çekme" gerektiren bir işlemi nasıl güvenli bir şekilde halledebilirim?

+2

Bir ['RecursiveAction'] kullanabilirsiniz (https://docs.oracle.com/javase/8/docs/api/java /util/concurrent/RecursiveAction.html). "ForkJoinPool ışın izleme" için googling deneyin. –

cevap

2

Konularınızı yönetmek için sadece ExecutorService kullanabilirsiniz. Belki Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()) kullanmayı deneyin.

Sizin Runnable uygulamanız daha fazla Runnable örneğini oluşturabilir ve bunları aynı ExecutorService adresine gönderebilir. Sonsuz bir yineleme oluşturmayacağından eminseniz, tamamlanmaya çalışmalı ve donanımınız mevcut olduğundan daha fazla iş parçacığı kullanmamalıdır. Dikkat etmeniz gereken tek şey, bellekte kaldığınız kadar çok Runnable örneğini oluşturmamanızdır. Ayrıca, tüm Runnable örneklerinin tamamlandığı zamanı izlemeniz gerekir, ancak hizmet yalnızca bunu yapmak için mekanizmalar sağlar (Java API'sında Future'a bakın).

1

Her iş parçacığı için bir sütun yapıyorsanız, döşeme - ışını tutarlılığının avantajlarından birini kaybediyorsunuz. Her ne kadar dürüst olmak gerekirse, onu hiç bu kadar avantajlı bulmamıştım ama yine de, Arnold ya da Zihinsel Ray üzerinde çalışmıyorum ... Tek bir ışınla başlamayı ve kaliteyi ve ppsi almayı deneyeceğim. Mümkün olduğu kadar yüksek ve görüntünüzün karelerini farklı iş parçacıklarına ...