a mutex added to TempMods which hopefully fixes rare segfaults on client
parent
71948dbf96
commit
03d67af9e8
29
Makefile
29
Makefile
|
@ -26,18 +26,12 @@ CXXFLAGS = -O2 -ffast-math -Wall -g -pipe
|
|||
#CXXFLAGS = -O1 -ffast-math -Wall -g
|
||||
#CXXFLAGS = -Wall -g -O0
|
||||
|
||||
#FAST_CXXFLAGS = -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops -mtune=i686
|
||||
|
||||
#Default target
|
||||
|
||||
all: all_linux
|
||||
all: fast_linux
|
||||
|
||||
ifeq ($(HOSTTYPE), x86_64)
|
||||
LIBSELECT=64
|
||||
endif
|
||||
|
||||
# Target specific settings
|
||||
|
||||
all_linux fast_linux: LDFLAGS = -L/usr/X11R6/lib$(LIBSELECT) -L$(IRRLICHTPATH)/lib/Linux -L$(JTHREADPATH)/src/.libs -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -ljthread -lz
|
||||
all_linux fast_linux: CPPFLAGS = -I$(IRRLICHTPATH)/include -I/usr/X11R6/include -I$(JTHREADPATH)/src
|
||||
fast_linux server_linux: CXXFLAGS = -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops -mtune=i686
|
||||
|
@ -45,20 +39,13 @@ server_linux: LDFLAGS = -L$(JTHREADPATH)/src/.libs -ljthread -lz -lpthread
|
|||
server_linux: CPPFLAGS = -I$(IRRLICHTPATH)/include -I/usr/X11R6/include -I$(JTHREADPATH)/src -DSERVER
|
||||
all_linux fast_linux clean_linux: SYSTEM=Linux
|
||||
|
||||
# These are out of date
|
||||
all_win32: LDFLAGS = -L$(IRRLICHTPATH)/lib/Win32-gcc -L$(JTHREADPATH)/Debug -lIrrlicht -lopengl32 -lm -ljthread
|
||||
all_win32 clean_win32: SYSTEM=Win32-gcc
|
||||
all_win32 clean_win32: SUF=.exe
|
||||
|
||||
# Name of the binary - only valid for targets which set SYSTEM
|
||||
|
||||
DESTPATH = bin/$(TARGET)$(SUF)
|
||||
FAST_DESTPATH = bin/$(FAST_TARGET)$(SUF)
|
||||
SERVER_DESTPATH = bin/$(SERVER_TARGET)$(SUF)
|
||||
DESTPATH = bin/$(TARGET)
|
||||
FAST_DESTPATH = bin/$(FAST_TARGET)
|
||||
SERVER_DESTPATH = bin/$(SERVER_TARGET)
|
||||
|
||||
# Build commands
|
||||
|
||||
all_linux all_win32: $(BUILD_DIR) $(DESTPATH)
|
||||
all_linux: $(BUILD_DIR) $(DESTPATH)
|
||||
fast_linux: $(FAST_BUILD_DIR) $(FAST_DESTPATH)
|
||||
server_linux: $(SERVER_BUILD_DIR) $(SERVER_DESTPATH)
|
||||
|
||||
|
@ -87,13 +74,13 @@ $(FAST_BUILD_DIR)/%.o: src/%.cpp
|
|||
$(SERVER_BUILD_DIR)/%.o: src/%.cpp
|
||||
$(CXX) -c -o $@ $< $(CPPFLAGS) $(CXXFLAGS)
|
||||
|
||||
clean: clean_linux clean_win32 clean_fast_linux clean_server_linux
|
||||
clean: clean_linux clean_fast_linux clean_server_linux
|
||||
|
||||
clean_linux clean_win32:
|
||||
clean_linux:
|
||||
@$(RM) $(OBJECTS) $(DESTPATH)
|
||||
|
||||
clean_fast_linux:
|
||||
@$(RM) $(OBJECTS) $(FAST_DESTPATH)
|
||||
@$(RM) $(FAST_OBJECTS) $(FAST_DESTPATH)
|
||||
|
||||
clean_server_linux:
|
||||
@$(RM) $(SERVER_OBJECTS) $(SERVER_DESTPATH)
|
||||
|
|
29
src/main.cpp
29
src/main.cpp
|
@ -91,6 +91,7 @@ SUGG: Implement a "Fast check queue" (a queue with a map for checking
|
|||
|
||||
SUGG: Signs could be done in the same way as torches. For this, blocks
|
||||
need an additional metadata field for the texts
|
||||
- This is also needed for item container chests
|
||||
|
||||
SUGG: Precalculate lighting translation table at runtime (at startup)
|
||||
|
||||
|
@ -99,6 +100,15 @@ SUGG: A version number to blocks, which increments when the block is
|
|||
- This can then be used to make sure the most recent version of
|
||||
a block has been sent to client
|
||||
|
||||
SUGG: Make the amount of blocks sending to client and the total
|
||||
amount of blocks dynamically limited. Transferring blocks is the
|
||||
main network eater of this system, so it is the one that has
|
||||
to be throttled so that RTTs stay low.
|
||||
|
||||
TODO: Untie client network operations from framerate
|
||||
- Needs some input queues or something
|
||||
- Not really necessary?
|
||||
|
||||
TODO: Combine MapBlock's face caches to so big pieces that VBO
|
||||
gets used
|
||||
- That is >500 vertices
|
||||
|
@ -106,11 +116,7 @@ TODO: Combine MapBlock's face caches to so big pieces that VBO
|
|||
TODO: Better dungeons
|
||||
TODO: Cliffs, arcs
|
||||
|
||||
TODO: Menus
|
||||
|
||||
TODO: Moving players more smoothly. Calculate moving animation
|
||||
in a way that doesn't make the player jump to the right place
|
||||
immediately when the server sends a new position
|
||||
TODO: Startup and configuration menu
|
||||
|
||||
TODO: There are some lighting-related todos and fixmes in
|
||||
ServerMap::emergeBlock
|
||||
|
@ -119,16 +125,10 @@ TODO: Proper handling of spawning place (try to find something that
|
|||
is not in the middle of an ocean (some land to stand on at
|
||||
least) and save it in map config.
|
||||
|
||||
TODO: Make the amount of blocks sending to client and the total
|
||||
amount of blocks dynamically limited. Transferring blocks is the
|
||||
main network eater of this system, so it is the one that has
|
||||
to be throttled so that RTTs stay low.
|
||||
|
||||
TODO: Server to load starting inventory from disk
|
||||
|
||||
TODO: Players to only be hidden when the client quits.
|
||||
TODO: - Players to be saved on disk, with inventory
|
||||
TODO: Players to be saved as text in map/players/<name>
|
||||
TODO: Player inventory to be saved on disk
|
||||
|
||||
TODO: Make fetching sector's blocks more efficient when rendering
|
||||
sectors that have very large amounts of blocks (on client)
|
||||
|
@ -149,9 +149,6 @@ Block object server side:
|
|||
TODO: Copy the text of the last picked sign to inventory in creative
|
||||
mode
|
||||
|
||||
TODO: Untie client network operations from framerate
|
||||
- Needs some input queues or something
|
||||
|
||||
TODO: Get rid of GotSplitPacketException
|
||||
|
||||
TODO: Check what goes wrong with caching map to disk (Kray)
|
||||
|
@ -168,7 +165,7 @@ TODO: Better handling of objects and mobs
|
|||
- Make other players utilize the same framework
|
||||
|
||||
TODO: Draw big amounts of torches better (that is, throw them in the
|
||||
same meshbuffer (can the meshcombiner class be used?))
|
||||
same meshbuffer (can the meshcollector class be used?))
|
||||
|
||||
Doing now:
|
||||
======================================================================
|
||||
|
|
|
@ -47,6 +47,7 @@ MapBlock::MapBlock(NodeContainer *parent, v3s16 pos, bool dummy):
|
|||
m_mesh_expired = false;
|
||||
mesh_mutex.Init();
|
||||
mesh = NULL;
|
||||
m_temp_mods_mutex.Init();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -584,47 +585,52 @@ void MapBlock::updateMesh(u32 daynight_ratio)
|
|||
|
||||
NOTE: This is the slowest part of this method.
|
||||
*/
|
||||
|
||||
{
|
||||
// Lock this, as m_temp_mods will be used directly
|
||||
JMutexAutoLock lock(m_temp_mods_mutex);
|
||||
|
||||
/*
|
||||
Go through every y,z and get top faces in rows of x+
|
||||
*/
|
||||
for(s16 y=0; y<MAP_BLOCKSIZE; y++){
|
||||
/*
|
||||
Go through every y,z and get top faces in rows of x+
|
||||
*/
|
||||
for(s16 y=0; y<MAP_BLOCKSIZE; y++){
|
||||
for(s16 z=0; z<MAP_BLOCKSIZE; z++){
|
||||
updateFastFaceRow(daynight_ratio, posRelative_f,
|
||||
v3s16(0,y,z), MAP_BLOCKSIZE,
|
||||
v3s16(1,0,0), //dir
|
||||
v3f (1,0,0),
|
||||
v3s16(0,1,0), //face dir
|
||||
v3f (0,1,0),
|
||||
fastfaces_new);
|
||||
}
|
||||
}
|
||||
/*
|
||||
Go through every x,y and get right faces in rows of z+
|
||||
*/
|
||||
for(s16 x=0; x<MAP_BLOCKSIZE; x++){
|
||||
for(s16 y=0; y<MAP_BLOCKSIZE; y++){
|
||||
updateFastFaceRow(daynight_ratio, posRelative_f,
|
||||
v3s16(x,y,0), MAP_BLOCKSIZE,
|
||||
v3s16(0,0,1),
|
||||
v3f (0,0,1),
|
||||
v3s16(1,0,0),
|
||||
v3f (1,0,0),
|
||||
fastfaces_new);
|
||||
}
|
||||
}
|
||||
/*
|
||||
Go through every y,z and get back faces in rows of x+
|
||||
*/
|
||||
for(s16 z=0; z<MAP_BLOCKSIZE; z++){
|
||||
updateFastFaceRow(daynight_ratio, posRelative_f,
|
||||
v3s16(0,y,z), MAP_BLOCKSIZE,
|
||||
v3s16(1,0,0), //dir
|
||||
v3f (1,0,0),
|
||||
v3s16(0,1,0), //face dir
|
||||
v3f (0,1,0),
|
||||
fastfaces_new);
|
||||
}
|
||||
}
|
||||
/*
|
||||
Go through every x,y and get right faces in rows of z+
|
||||
*/
|
||||
for(s16 x=0; x<MAP_BLOCKSIZE; x++){
|
||||
for(s16 y=0; y<MAP_BLOCKSIZE; y++){
|
||||
updateFastFaceRow(daynight_ratio, posRelative_f,
|
||||
v3s16(x,y,0), MAP_BLOCKSIZE,
|
||||
v3s16(0,0,1),
|
||||
v3f (0,0,1),
|
||||
v3s16(1,0,0),
|
||||
v3f (1,0,0),
|
||||
fastfaces_new);
|
||||
}
|
||||
}
|
||||
/*
|
||||
Go through every y,z and get back faces in rows of x+
|
||||
*/
|
||||
for(s16 z=0; z<MAP_BLOCKSIZE; z++){
|
||||
for(s16 y=0; y<MAP_BLOCKSIZE; y++){
|
||||
updateFastFaceRow(daynight_ratio, posRelative_f,
|
||||
v3s16(0,y,z), MAP_BLOCKSIZE,
|
||||
v3s16(1,0,0),
|
||||
v3f (1,0,0),
|
||||
v3s16(0,0,1),
|
||||
v3f (0,0,1),
|
||||
fastfaces_new);
|
||||
for(s16 y=0; y<MAP_BLOCKSIZE; y++){
|
||||
updateFastFaceRow(daynight_ratio, posRelative_f,
|
||||
v3s16(0,y,z), MAP_BLOCKSIZE,
|
||||
v3s16(1,0,0),
|
||||
v3f (1,0,0),
|
||||
v3s16(0,0,1),
|
||||
v3f (0,0,1),
|
||||
fastfaces_new);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -399,15 +399,30 @@ public:
|
|||
<<", mod.type="<<mod.type
|
||||
<<", mod.param="<<mod.param
|
||||
<<std::endl;*/
|
||||
JMutexAutoLock lock(m_temp_mods_mutex);
|
||||
m_temp_mods[p] = mod;
|
||||
}
|
||||
// Returns true if there was one
|
||||
bool getTempMod(v3s16 p, struct NodeMod *mod)
|
||||
{
|
||||
JMutexAutoLock lock(m_temp_mods_mutex);
|
||||
core::map<v3s16, NodeMod>::Node *n;
|
||||
n = m_temp_mods.find(p);
|
||||
if(n == NULL)
|
||||
return false;
|
||||
if(mod)
|
||||
*mod = n->getValue();
|
||||
return true;
|
||||
}
|
||||
void clearTempMod(v3s16 p)
|
||||
{
|
||||
JMutexAutoLock lock(m_temp_mods_mutex);
|
||||
if(m_temp_mods.find(p))
|
||||
m_temp_mods.remove(p);
|
||||
}
|
||||
void clearTempMods()
|
||||
{
|
||||
JMutexAutoLock lock(m_temp_mods_mutex);
|
||||
m_temp_mods.clear();
|
||||
}
|
||||
#endif
|
||||
|
@ -517,6 +532,7 @@ private:
|
|||
// Temporary modifications to nodes
|
||||
// These are only used when drawing
|
||||
core::map<v3s16, NodeMod> m_temp_mods;
|
||||
JMutex m_temp_mods_mutex;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue