mirror of
https://github.com/Relintai/godot_voxel.git
synced 2024-12-22 01:26:50 +01:00
Sort thread updates only when necessary
This commit is contained in:
parent
e79dd98d69
commit
bca6a72edd
@ -20,6 +20,8 @@ VoxelMeshUpdater::VoxelMeshUpdater(Ref<VoxelLibrary> library, MeshingParams para
|
|||||||
_thread_exit = false;
|
_thread_exit = false;
|
||||||
_semaphore = Semaphore::create();
|
_semaphore = Semaphore::create();
|
||||||
_thread = Thread::create(_thread_func, this);
|
_thread = Thread::create(_thread_func, this);
|
||||||
|
|
||||||
|
_needs_sort = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
VoxelMeshUpdater::~VoxelMeshUpdater() {
|
VoxelMeshUpdater::~VoxelMeshUpdater() {
|
||||||
@ -75,6 +77,10 @@ void VoxelMeshUpdater::push(const Input &input) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(_shared_input.priority_position != input.priority_position || input.blocks.size() > 0) {
|
||||||
|
_needs_sort = true;
|
||||||
|
}
|
||||||
|
|
||||||
_shared_input.priority_position = input.priority_position;
|
_shared_input.priority_position = input.priority_position;
|
||||||
should_run = !_shared_input.is_empty();
|
should_run = !_shared_input.is_empty();
|
||||||
}
|
}
|
||||||
@ -202,6 +208,7 @@ void VoxelMeshUpdater::thread_sync(int queue_index, Stats stats) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
stats.remaining_blocks = _input.blocks.size();
|
stats.remaining_blocks = _input.blocks.size();
|
||||||
|
bool needs_sort;
|
||||||
|
|
||||||
{
|
{
|
||||||
// Get input
|
// Get input
|
||||||
@ -212,6 +219,9 @@ void VoxelMeshUpdater::thread_sync(int queue_index, Stats stats) {
|
|||||||
|
|
||||||
_shared_input.blocks.clear();
|
_shared_input.blocks.clear();
|
||||||
_block_indexes.clear();
|
_block_indexes.clear();
|
||||||
|
|
||||||
|
needs_sort = _needs_sort;
|
||||||
|
_needs_sort = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!_output.blocks.empty()) {
|
if(!_output.blocks.empty()) {
|
||||||
@ -226,7 +236,7 @@ void VoxelMeshUpdater::thread_sync(int queue_index, Stats stats) {
|
|||||||
_output.blocks.clear();
|
_output.blocks.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_input.blocks.empty()) {
|
if (!_input.blocks.empty() && needs_sort) {
|
||||||
// Re-sort priority
|
// Re-sort priority
|
||||||
|
|
||||||
SortArray<VoxelMeshUpdater::InputBlock, BlockUpdateComparator> sorter;
|
SortArray<VoxelMeshUpdater::InputBlock, BlockUpdateComparator> sorter;
|
||||||
|
@ -70,6 +70,8 @@ private:
|
|||||||
private:
|
private:
|
||||||
Input _shared_input;
|
Input _shared_input;
|
||||||
Mutex *_input_mutex;
|
Mutex *_input_mutex;
|
||||||
|
HashMap<Vector3i, int, Vector3iHasher> _block_indexes;
|
||||||
|
bool _needs_sort;
|
||||||
|
|
||||||
Output _shared_output;
|
Output _shared_output;
|
||||||
Mutex *_output_mutex;
|
Mutex *_output_mutex;
|
||||||
@ -78,7 +80,6 @@ private:
|
|||||||
Ref<VoxelMesherSmooth> _smooth_mesher;
|
Ref<VoxelMesherSmooth> _smooth_mesher;
|
||||||
|
|
||||||
Input _input;
|
Input _input;
|
||||||
HashMap<Vector3i, int, Vector3iHasher> _block_indexes;
|
|
||||||
Output _output;
|
Output _output;
|
||||||
Semaphore *_semaphore;
|
Semaphore *_semaphore;
|
||||||
Thread *_thread;
|
Thread *_thread;
|
||||||
|
Loading…
Reference in New Issue
Block a user