Reduced threadpool threads to keep render thread smooth

This commit is contained in:
Joshua Barretto 2019-06-05 14:13:24 +01:00
parent 13197a741e
commit cd630b0816
11 changed files with 58 additions and 23 deletions

View File

@ -76,11 +76,15 @@ impl Client {
postbox.send_message(ClientMsg::Ping);
let mut thread_pool = threadpool::Builder::new()
.thread_name("veloren-worker".into())
.build();
// We reduce the thread count by 1 to keep rendering smooth
thread_pool.set_num_threads((thread_pool.max_count() - 1).max(1));
Ok(Self {
client_state,
thread_pool: threadpool::Builder::new()
.thread_name("veloren-worker".into())
.build(),
thread_pool,
server_info,
postbox,
@ -97,6 +101,12 @@ impl Client {
})
}
#[allow(dead_code)]
pub fn with_thread_pool(mut self, thread_pool: ThreadPool) -> Self {
self.thread_pool = thread_pool;
self
}
/// Request a state transition to `ClientState::Registered`.
pub fn register(&mut self, player: comp::Player) {
self.postbox.send_message(ClientMsg::Register { player });
@ -434,7 +444,7 @@ impl Client {
/// computationally expensive operations that run outside of the main thread (i.e., threads that
/// block on I/O operations are exempt).
#[allow(dead_code)]
pub fn thread_pool(&self) -> &threadpool::ThreadPool {
pub fn thread_pool(&self) -> &ThreadPool {
&self.thread_pool
}

View File

@ -122,6 +122,12 @@ impl Server {
Ok(this)
}
#[allow(dead_code)]
pub fn with_thread_pool(mut self, thread_pool: ThreadPool) -> Self {
self.thread_pool = thread_pool;
self
}
/// Get a reference to the server's game state.
#[allow(dead_code)]
pub fn state(&self) -> &State {

View File

@ -171,5 +171,5 @@ void main() {
//hsva_color.z = 1.0 - 1.0 / (1.0 * hsva_color.z + 1.0);
vec4 final_color = vec4(hsv2rgb(hsva_color.rgb), hsva_color.a);
tgt_color = final_color;
tgt_color = vec4(final_color.rgb, 0.5);
}

View File

@ -14,6 +14,11 @@ uniform u_locals {
out vec4 tgt_color;
float fog() {
float half_vd = 0.95 * view_distance.x / 2.0;
return clamp(distance(f_pos, cam_pos.xyz) / half_vd - 1.0, 0.0, 1.0);
}
void main() {
// Calculate normal from packed data
vec3 f_norm;
@ -40,5 +45,9 @@ void main() {
vec3 light = vec3(static_light);
tgt_color = vec4(f_col * light, 1.0);
vec3 frag_color = f_col * light;
vec3 fog_color = vec3(0.0, 0.25, 0.55);
tgt_color = vec4(mix(frag_color, fog_color, fog()), 1.0);
}

View File

@ -38,7 +38,7 @@ impl Animation for RunAnimation {
next.head.offset = Vec3::new(0.0, 3.0, 12.0 + wave_cos * 1.3);
next.head.ori =
Quaternion::rotation_z(head_look.x) * Quaternion::rotation_x(head_look.y + 0.35);
Quaternion::rotation_z(head_look.x + wave * 0.1) * Quaternion::rotation_x(head_look.y + 0.35);
next.head.scale = Vec3::one();
next.chest.offset = Vec3::new(0.0, 0.0, 7.0 + wave_cos * 1.1);
@ -53,20 +53,20 @@ impl Animation for RunAnimation {
next.shorts.ori = Quaternion::rotation_z(wave * 0.6);
next.shorts.scale = Vec3::one();
next.l_hand.offset = Vec3::new(-8.0, 3.0 + wave_cos * 5.0, 9.0 - wave * 2.0) / 11.0;
next.l_hand.offset = Vec3::new(-9.0, 3.0 + wave_cos * 8.0, 12.0 - wave * 1.0) / 11.0;
next.l_hand.ori = Quaternion::rotation_x(wave_cos * 1.1);
next.l_hand.scale = Vec3::one() / 11.0;
next.r_hand.offset = Vec3::new(8.0, 3.0 - wave_cos * 5.0, 9.0 + wave * 2.0) / 11.0;
next.r_hand.offset = Vec3::new(9.0, 3.0 - wave_cos * 8.0, 12.0 + wave * 1.0) / 11.0;
next.r_hand.ori = Quaternion::rotation_x(wave_cos * -1.1);
next.r_hand.scale = Vec3::one() / 11.0;
next.l_foot.offset = Vec3::new(-3.4, 0.0 + wave * 1.0, 6.0);
next.l_foot.ori = Quaternion::rotation_x(-0.0 - wave * 1.5);
next.l_foot.offset = Vec3::new(-3.4, 0.0 + wave_cos * 1.0, 6.0);
next.l_foot.ori = Quaternion::rotation_x(-0.0 - wave_cos * 1.5);
next.l_foot.scale = Vec3::one();
next.r_foot.offset = Vec3::new(3.4, 0.0 - wave * 1.0, 6.0);
next.r_foot.ori = Quaternion::rotation_x(-0.0 + wave * 1.5);
next.r_foot.offset = Vec3::new(3.4, 0.0 - wave_cos * 1.0, 6.0);
next.r_foot.ori = Quaternion::rotation_x(-0.0 + wave_cos * 1.5);
next.r_foot.scale = Vec3::one();
next.weapon.offset = Vec3::new(-7.0, -5.0, 15.0);

View File

@ -4,6 +4,7 @@ use crate::{
PlayState, PlayStateResult,
};
use common::comp;
use client::Client;
use log::warn;
use std::net::SocketAddr;
@ -15,7 +16,7 @@ pub struct StartSingleplayerState {
impl StartSingleplayerState {
/// Create a new `MainMenuState`.
pub fn new() -> Self {
let (singleplayer, sock) = Singleplayer::new();
let (singleplayer, sock) = Singleplayer::new(None); // TODO: Make client and server use the same thread pool
Self { singleplayer, sock }
}

View File

@ -230,9 +230,9 @@ impl Renderer {
/// Queue the clearing of the color and depth targets ready for a new frame to be rendered.
/// TODO: Make a version of this that doesn't clear the colour target for speed.
pub fn clear(&mut self, col: Rgba<f32>) {
self.encoder.clear(&self.tgt_color_view, col.into_array());
//self.encoder.clear(&self.tgt_color_view, col.into_array());
self.encoder.clear_depth(&self.tgt_depth_view, 1.0);
self.encoder.clear(&self.win_color_view, col.into_array());
//self.encoder.clear(&self.win_color_view, col.into_array());
self.encoder.clear_depth(&self.win_depth_view, 1.0);
}

View File

@ -742,7 +742,8 @@ impl<S: Skeleton> FigureState<S> {
) {
let mat = Mat4::<f32>::identity()
* Mat4::translation_3d(pos)
* Mat4::rotation_z(-ori.x.atan2(ori.y)); // + f32::consts::PI / 2.0);
* Mat4::rotation_z(-ori.x.atan2(ori.y)) // + f32::consts::PI / 2.0);
* Mat4::scaling_3d(Vec3::from(0.8));
let locals = FigureLocals::new(mat, col);
renderer.update_consts(&mut self.locals, &[locals]).unwrap();

View File

@ -136,7 +136,7 @@ impl Scene {
proj_mat,
cam_pos,
self.camera.get_focus_pos(),
10.0,
client.view_distance().unwrap_or(0) as f32 * 32.0, // TODO: No magic numbers
client.state().get_time_of_day(),
client.state().get_time(),
renderer.get_resolution(),

View File

@ -1,4 +1,5 @@
use common::clock::Clock;
use client::Client;
use log::info;
use portpicker::pick_unused_port;
use server::{Event, Input, Server};
@ -23,7 +24,7 @@ pub struct Singleplayer {
}
impl Singleplayer {
pub fn new() -> (Self, SocketAddr) {
pub fn new(client: Option<&Client>) -> (Self, SocketAddr) {
let (sender, receiver) = channel();
let sock = SocketAddr::from((
@ -32,7 +33,13 @@ impl Singleplayer {
));
// Create server
let server = Server::bind(sock.clone()).expect("Failed to create server instance!");
let server = Server::bind(sock.clone())
.expect("Failed to create server instance!");
let server = match client {
Some(client) => server.with_thread_pool(client.thread_pool().clone()),
None => server,
};
let thread = thread::spawn(move || {
run_server(server, receiver);

View File

@ -57,8 +57,8 @@ impl WorldSim {
rock_nz: HybridMulti::new().set_persistence(0.3).set_seed(seed + 7),
warp_nz: BasicMulti::new().set_octaves(3).set_seed(seed + 8),
tree_nz: BasicMulti::new()
.set_octaves(8)
.set_persistence(0.75)
.set_octaves(12)
.set_persistence(0.9)
.set_seed(seed + 9),
cave_0_nz: SuperSimplex::new().set_seed(seed + 10),
cave_1_nz: SuperSimplex::new().set_seed(seed + 11),
@ -357,8 +357,9 @@ impl<'a> Sampler<'a> {
{
let tree_pos3d =
Vec3::new(tree_pos.x, tree_pos.y, tree_sample.alt as i32);
let rpos = wpos - tree_pos3d;
block.or(TREES[*tree_seed as usize % TREES.len()]
.get(wpos - tree_pos3d)
.get((rpos * 160) / 128) // Scaling
.map(|b| b.clone())
.unwrap_or(Block::empty()))
}