2D遊戲紋理渲染必須將『背景色』去除.JPEG格式不支持存儲像素點alpha值.將透明色alpha值設為零.需使用PNG格式.若紋理圖像沒有alpha通道時OpenGL ES自動將alpha設為1.但混合開銷很大而目前手機上GPU都不能對大量像素禁行混合.所以在需要時才啟用Blend『混合』.在OpenGL ES中啟動半透明混合處理
gl.glEnable(GL10.GL_BLEND);
設定『來源色』和『目標色』組合方程.
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
啟用2D紋理渲染
gl.glEnable(GL10.GL_TEXTURE_2D);
渲染三角形
…
禁用2D紋理渲染
gl.glDisable(GL10.GL_TEXTURE_2D);
結束渲染後禁用混合
gl.glDisable(GL10. GL_BLEND);
Android遊戲之入口『屏幕』
遊戲主選單 『屏幕』通常有 『圖標』『選單 』.所要做是『觸摸』選單 時切換『屏幕』.計算出選單 項『矩形區域』與觸碰點重疊時切換『屏幕』在這裡設定四個選單 項.你需要繪畫『文本紋理』寬高相等並是2倍數.背景色設為透明色.並且保存為『.PNG』. 『文本紋理』好在於研發時用英文文本之後再漢化.
你需定義『2D相機』屏幕原點在左下角、VECTOR2D『點』把觸碰座標轉換屏幕座標、渲染『圖標』區域.定義四個按鈕『新遊戲』『繼續遊戲』『高分榜』『遊戲設定』每當更新屏幕update()對四個選單 區域進行overlap()『矩形碰撞測試』.而渲染『屏幕』時則先渲染『背景』後渲染『選單』
選單項 | 簡介 |
NEW | 啟動新遊戲 |
PLAY | 繼續遊戲按扭 |
Highscores | 高分排名榜 |
Settings | 遊戲設定 |
public class ScreenMain extends SCREEN{
private CAMERA2D camera;
private VECTOR2D touchPoint;
private RECT2D Bounds_Logo;
private RECT2D Bounds_New;
private RECT2D Bounds_Play;
private RECT2D Bounds_Highscores;
private RECT2D Bounds_Settings;
購造入口屏幕
public ScreenMain(){
camera = new CAMERA2D(320, 480);// 相機
Bounds_Logo = new RECT2D(WORLD.PIXEL_WIDTH/2, WORLD.PIXEL_HEIGHT/2 + 160 , 256, 128);
Bounds_New = new RECT2D(WORLD.PIXEL_WIDTH/2, WORLD.PIXEL_HEIGHT/2 + 64, 128, 32);
Bounds_Play = new RECT2D(WORLD.PIXEL_WIDTH/2, WORLD.PIXEL_HEIGHT/2 + 32, 128, 32);
Bounds_Highscores = new RECT2D(WORLD.PIXEL_WIDTH/2, WORLD.PIXEL_HEIGHT/2 , 256, 32);
Bounds_Settings = new RECT2D(WORLD.PIXEL_WIDTH/2, WORLD.PIXEL_HEIGHT/2 – 32, 256, 32);
touchPoint = new VECTOR2D();// 觸碰點
}
更新屏幕都觸碰座標
@Override
public void update(float deltaTime){
for(int i = 0; i < TOUCH.Point_Count; i++){
int action = TOUCH.Point_Action[i];
if(action != TOUCH.ACTION_UP)
continue;
float x = TOUCH.Point_X[i];
float y = TOUCH.Point_Y[i];
touchPoint.set(x, y);
camera.TouchToWorld(touchPoint);//觸摸坐標轉世界坐標
if(Bounds_New.overlap(touchPoint)){// 新遊戲按扭
TOUCH.clear();// 清空
SOUND.Play(ASSETS.sound_click);// 點擊
GAME.setScreen(GAME.getGameScreen());// 遊戲按扭
return;
}
else
if(Bounds_Play.overlap(touchPoint)){// 遊戲按扭
SOUND.Play(ASSETS.sound_click);// 點擊
GAME.setScreen(GAME.getGameScreen());// 遊戲按扭
TOUCH.clear();// 清空
break;
}
else
if(Bounds_Highscores.overlap(touchPoint) ){// 高分按扭
SOUND.Play(ASSETS.sound_click);// 點擊
GAME.setCurrentScreen(GAME.getScoreScreen());
TOUCH.clear();// 清空
break;
}
else
if(Bounds_Settings.overlap(touchPoint)){// 設定按鈕
SOUND.Play(ASSETS.sound_click);// 點擊
GAME.setScreen(GAME.getSettingsScreen());
TOUCH.clear();// 清空
break;
}
}
TOUCH.clear();// 清空
}
渲染屏幕
@Override
public void present(float deltaTime){
GL10 gl = GRAPHICS.gl;
GLSurfaceView view = GRAPHICS.gl_View;
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
camera.SetViewportAndMatrices();
gl.glEnable(GL10.GL_TEXTURE_2D);
BATCHER.Begin(ASSETS.texture_background);
BATCHER.Draw(WORLD.PIXEL_WIDTH/2,WORLD.PIXEL_HEIGHT/2, WORLD.PIXEL_WIDTH, WORLD.PIXEL_HEIGHT, ASSETS.region_background);// 渲染背景
BATCHER.End();
// 設為透明
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
BATCHER.Begin(ASSETS.texture_text);
BATCHER.Draw(Bounds_Logo, ASSETS.region_logo);// 圖標按扭
BATCHER.Draw(Bounds_New, ASSETS.region_new);// 圖標按扭
BATCHER.Draw(Bounds_Play, ASSETS.region_play);// 主選單
BATCHER.Draw(Bounds_Highscores,ASSETS.region_highscores);// 高分按扭
BATCHER.Draw(Bounds_Settings, ASSETS.region_settings);// 設定按扭
BATCHER.End();
gl.glDisable(GL10.GL_TEXTURE_2D);// 禁用
}
暫停保存設置
@Override
public void pause(){
}
恢復
@Override
public void resume(){
}
清除/銷毀
@Override
public void dispose(){
}
返回鍵
@Override
public boolean back(){
return true;
}
}
Android遊戲之GLSurfaceView
遊戲設計中通常『更新』『渲染』放在同一線程中.在Windows可以在主線程將『消息驅動』改為『實時驅動』.把『更新』『渲染』放在主線程中.而Android卻無法做到這點.但提供GLSurfaceView可建立獨立線程在背後實現『更新』『渲染』.你需要實現監聽接口GLSurfaceView.Renderer.並註冊到GLSurfaceView中.監聽接口需要分別重寫『創建』『調整大細』『渲染』.GLSurfaceView.Renderer可獲得GL10.通過它方可訪問OpenGL ES API.而GL10中10代表OpenGL ES 1.0標準.可以將GLSurfaceView封裝成獨立控件.從而在layout『佈局』中嵌入.
public class RenderView extends GLSurfaceView implements GLSurfaceView.Renderer {
每當Activity恢復或啟動創建. EGLConfig設置Surface顏色與深度
public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig);
當view尺寸發生改變時調用,傳入寬與高
public void onSurfaceChanged(GL10 gl10, int width, int height);
調用『渲染』『更新』完成幀繪製.但每秒不超過60幀.
public void onDrawFrame(GL10 gl10);
令外還需重寫『恢復』『暫停』
『恢復』重啟渲染線程,在Activity恢復顯示時在Activity.onResume()中調用
public void onResume();
『暫停』退出渲染線程,當Activity進入後臺時在Activity.onPause()中調用
public void onPause();
}
編輯layout『佈局』文檔main.xml添加
<net.bookcard.aa.RenderView
android:id=”@+id/render_view”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent” />
定義view狀態
public static final int STATE_INIT = 0;// 初此
public static final int STATE_RUN = 1;// 運行
public static final int STATE_PAUSED = 2;// 暫停
public static final int STATE_FINISHED = 3;// 結束
public static final int STATE_IDLE = 4;// 閒置
int view_width,view_height;// 寬與高
int state = STATE_INIT;// 初此狀態
long startTime ;// 啟動時間
創建Surface獲取屏幕
public void onSurfaceCreated(GL10 gl, EGLConfig eglConfig){
SCREEN screen = GAME.getCurrentScreen();// 當前屏幕
if(state == STATE_INIT) {// 初此
Init(gl, this);
screen = GAME.getMainScreen();
GAME.setCurrentScreen(screen);
}
else {// 重新載入資源
ASSETS.reload();
}
screen = GAME.getCurrentScreen();
state = STATE_RUN;// 運行
startTime = System.nanoTime();// 獲取啟動時間
}
大小發生改變
public void onSurfaceChanged(GL10 gl, int width, int height){
this.view_width = width;// 寬
this.view_height = height;// 高
}
更新並渲染.System.nanoTime()返回納秒, 1000000000納秒=1秒.通過兩次時間測量計算間隔時間
public void onDrawFrame(GL10 gl){
SCREEN screen = GAME.getCurrentScreen();
if(state == STATE_RUN){// 運行
float deltaTime = (System.nanoTime()-startTime) / 1000000000.0f;
startTime = System.nanoTime();// 獲取當前時間
screen.update(deltaTime);// 更新
screen.present(deltaTime);// 渲染
}
else
if(state == STATE_PAUSED) {// 暫停
}
else
if(state == STATE_FINISHED) {// 結束
}
}
恢復渲染在Activity.onResume()中調用
public void onResume(){
super.onResume();
}
暫停渲染在Activity.onPause()中調用
public void onPause(){
state = STATE_PAUSED;// 暫停
super.onPause();
}
初此遊戲系統個部件
void Init(GL10 gl, GLSurfaceView view){
GRAPHICS.Init(gl,view);
SYSTEM.Init(context);// 系統
FileIO.Init(context);// 文件讀寫
BITMAP.Init(context);// 位圖
SOUND.Init(context,100);// 聲音
MUSIC.Init(context,100);// 音樂
TOUCH.Init(this);// 觸摸模塊
GAME.Init();// 屏幕切換系統
BATCHER.Init(1500);// 精靈批處理
ASSETS.load();// 資源
}
Android遊戲之設定讀寫與得分
在遊戲啟動需從磁盤讀取遊戲選項與得分.在GLSurfaceView.Renderer.onSurfaceCreated()中讀取讀取.首先確立文檔名
String filename = “settings.dat”;
打開文檔並返回輸入流
InputStream file = FileIO.ReadFile(filename);
打開讀取器
InputStreamReader stream = new InputStreamReader(file);
打開讀取緩存
BufferedReader in = new BufferedReader(stream);
String text;
讀取遊戲前五個最高得分
int[] highscores = new int[] {0,0,0,0,0};// 高分榜
for(int i=0;i<5;++i){
讀取一行文本,並轉換為得分.
text = in.readLine();
highscores[i] = Integer.parseInt(text);
}
用戶可能關閉音量
text = in.readLine();
boolean soundEnabled = Boolean.parseBoolean(text);
讀取遊戲音量.值為浮點數(0~1)
text = in.readLine();
float soundVolume = Float.parseFloat(text);
遊戲關卡整數值大於1
text = in.readLine();
int level = Integer.parseInt(text);
道具量整數值大於或等於零
text = in.readLine();
int bombs = Integer.parseInt(text);
讀取完畢關閉讀取緩存
in.close();
在遊戲退出時需將所有選項與得分寫入磁盤.在GLSurfaceView.onPause()中保存.打開文檔並返回輸出流
OutputStream file = FileIO.WriteFile(filename);
打開寫入器
OutputStreamWriter stream = new OutputStreamWriter(file);
打開寫入緩存
BufferedWriter out = new BufferedWriter(stream);
寫入遊戲五個最高得分
for(int i=0;i<5; i++){
out.write(Integer.toString(highscores[i]));
寫入換行
out.write(“\r”);
}
寫入聲音開關
out.write(Boolean.toString(soundEnabled));
out.write(“\r”);
寫入音量值(0~1)浮點數
out.write(Float.toString(soundVolume));
out.write(“\r”);
寫入當前關卡整數值
out.write(Integer.toString(level));
out.write(“\r”);
寫入道具量整數值
out.write(Integer.toString(bombs));
out.write(“\r”);
關閉寫入緩存
out.close();
加入得分並進行高分排序
public static void addScore(int score){
for(int i=0;i<5; ++i){
if(highscores[i] < score){
for(int j=4; j>i; –j)
highscores[j] = highscores[j-1];// 往後移
highscores[i] = score;// 插入分數
break;
}
}
Android遊戲之抽象『屏幕』
設計抽象『屏幕』SCREEN類.為以後屏幕設計提供模板.update()更新所有對像.而present()則負責渲染. deltaTime為每次調用時間間隔. pause()與resume()當遊戲『暫停』與『恢復』時調用. 而dispose()則在遊戲退出時銷毀所有資源.釋放『記憶體』並保存設置.
public abstract class SCREEN {
public abstract void update(float deltaTime);// 更新
public abstract void present(float deltaTime);// 渲染
public abstract void pause();// 暫停
public abstract void resume();// 恢復
public abstract void dispose();// 清除/銷毀
public abstract boolean back();//檢查返會鍵
}
另需要『屏幕切換系統』GAME.每當設換屏幕時首先『暫停』然後『銷毀』資源並保存設置.然後設定新屏幕並『恢復』與『更新』.
public class GAME {
static private SCREEN screen = null;// 當前屏幕
設置當前屏幕
static public void setCurrentScreen(SCREEN newScreen){
if(screen != null){
screen.pause();// 暫停
screen.dispose();// 銷毀
}
screen = newScreen;
screen.resume();// 恢復
screen.update(0);// 更新
}
獲取當前屏幕
static public SCREEN getCurrentScreen() {
return screen;
}
}
WordPress之啟用Jetpack後控制臺載入慢
近日Wordpress進入控制臺極慢.經常出現:
『正在連線到www.gstatic.com…』
但Android手機無此問題.此現像是更新Jetpack後出現. Jetpack版本是6.3.3解卻方法有二.禁用Jetpack或使用舊版.
- 手工下載Jetpack 6.3.2
- 手工刪除Jetpack 6.3.3
- 安裝外掛->上傳外掛->『指定路徑』->立即安裝
- 啟用外掛.使用com帳號登入
Android遊戲之紋理區域
『紋理區域』指『紋理』中『矩形區域』.2D紋理通常尺寸較小.可以將多個2D紋理放在單一個紋理圖中.以提升OpenGL ES渲染性能.將其像素座標到紋理座標轉進行封裝.u1,v1為紋理座標左上角.u2,v2為紋理座標右下角.以確定紋理區域.值範圍0~1
public class REGION {
public TEXTURE texture;// 紋理
public float u1,v1,u2,v2;// 紋理坐標
像素坐標轉紋理坐標.輸入『像素』左上角與『寬和高』
public REGION(TEXTURE texture,float x,float y,float width,float height){
u1 = x/(float)texture.width;
v1 = y/(float)texture.height;
u2 = u1 + width/(float)texture.width;
v2 = v1 + height/(float)texture.height;
this.texture = texture;
}
}
Android遊戲之精靈批處理
OpenGL ES盡可能每次渲染多個精靈.以提高渲染性能.為此需要知道精靈『位置』『尺寸』『紋理區域』.『批處理』將多個渲染合拼在一起.這對GPU有利.批處理設立浮點數『緩存』保存頂點.該緩存區初此時需清空.定義『批處理』結構BATCHER.
public class BATCHER {
成員Buffer為浮點型數組用於存儲頂點.
private static float[] buffer;
成員indices為短整形索引.以三角形排列用於儲存頂點.
public static short[] indices ;
頂點列表用於批處理渲染
private static VERTICES vertices;
緩存寫入索引初此為零
private static int index = 0;
精零數量初此為零
public static int num = 0;
初次批處理.max精靈為最大量.
public static void Init(int max){
分配2D精靈頂點緩存,每個精靈有4頂點,每頂點要4個浮點數(空間坐標x,y兩個,紋理坐標u,v兩個)
buffer = new float[max44];
分配頂點緩存.『頂點』『紋理座標』『索引』
vertices = new VERTICES(max * 4, max*6, false,true);
分配索引每個精靈6個索引
indices = new short[max*6];
int len = indices.length;// 索引數組長度
index = 0;// 緩存寫入索引
num = 0;// 精零數量
生成頂點索引
for (int i=0,j=0; i < len; i += 6, j += 4) {
indices[i + 0] = (short)(j + 0);
indices[i + 1] = (short)(j + 1);
indices[i + 2] = (short)(j + 2);
indices[i + 3] = (short)(j + 2);
indices[i + 4] = (short)(j + 3);
indices[i + 5] = (short)(j + 0);
}
設置頂點索引
vertices.SetIndices(indices, 0, indices.length);
}
準備進行批處理渲染.首先綁定紋理.並將『精零數量』『緩存索引』置零
public static void Begin(TEXTURE texture){
texture.Bind();// 綁定紋理
num = 0;// 精零數量
index = 0;// 緩存寫入索引
}
結束批處理渲染.將頂點提交給OpenGL數組並觸發.綁定頂點數據後進形三角形渲染.然後取消數據綁定.每次調用繪畫時.向緩存區中添加4個頂點參數為『位置』『顏色』『索引』『紋理區域』
public void boolean End(){
vertices.SetVertices(buffer,0,index);
vertices.Draw(GL10.GL_TRIANGLES, 0, num * 6);
}
批處理繪畫計算精靈中心『位置』及『寬和高』.和『紋理區域』.生成精靈『左下角』與『右上角』『空間座標』與『紋理座標』
public static void Draw(float x,float y,float width,float height,REGION region){
float halfWidth = width/2.0f;// 寬度一半
float halfHeight = height/2.0f;//高度一半
float x1 = x – halfWidth;
float y1 = y – halfHeight;
float x2 = x + halfWidth;
float y2 = y + halfHeight;
buffer[index++] = x1;
buffer[index++] = y1;
buffer[index++] = region.u1;
buffer[index++] = region.v2;
buffer[index++] = x2;
buffer[index++] = y1;
buffer[index++] = region.u2;
buffer[index++] = region.v2;
buffer[index++] = x2;
buffer[index++] = y2;
buffer[index++] = region.u2;
buffer[index++] = region.v1;
buffer[index++] = x1;
buffer[index++] = y2;
buffer[index++] = region.u1;
buffer[index++] = region.v1;
++num;
}
}
在調用時首先清理緩存並存入紋理.但只能對使用同一紋理精靈進行批處理.最後結束渲染.如下:
BATCHER.Begin(Texture);
BATCHER.Draw(X,Y,WIDTH,HEIGHT,Region);
BATCHER.End();
Android遊戲之頂點索引
OpenGL均採用三角形列表進行渲染.每個三角形都有三個頂點.在有些情況下兩個或多個三角形會共用頂點.如上圖有兩個頂點具有相同『位置』『顏色』『紋理座標』.但甘浪費空間.更好解卻方法是將所有頂點保存在列表.而三角形頂點保存索引.OpenGL ES要求索引值使用短整數或字節.即OpenGL ES每次最多渲染65536個頂點.
我地需要一個Vertices類,用於存儲每個頂點『位置』『顏色』與『紋理座標』,並且它需要兩個選項.頂點是否『顏色』與『紋理座標』
public class VERTICES {
boolean color_have = false;// 擁有顏色
boolean texture_have =false;// 擁有紋理坐標
int vertex_size = 0;// 每個頂點所占大小
使用FloatBuffer保存頂點
FloatBuffer vertex_array = null;
使用ShortBuffer頂點索引
ShortBuffer index_array = null;
頂點隊列分配記憶體,vertex_max為最大頂點量, index_max為最大索引量
VERTICES(int vertex_max,int index_max,boolean color_have,boolean texture_have){
this.color_have = color_have;// 擁有頂點顏色
this.texture_have = texture_have;// 擁有紋理坐標
計算每頂點所占大小.顏色占4單元.紋理座標占2單元.2D座標占2單元.每個整數占4字節
int vertex_size = (2 + (color_have?4:0) + (texture_have?2:0) ) * 4;
因為OpenGL ES是以C API結口提供.無法直接使用JAVA數組.因此你需要C數組系統堆棧記憶體.而非JAVA虛擬機記憶體.需要 FloatBuffer分配頂點記憶體.
vertex_max為最大頂點量.
ByteBuffer buffer = ByteBuffer.allocateDirect(vertex_size * vertex_max);
將『網絡字節』改為『主機字節』或稱為『CPU字節』
buffer.order(ByteOrder.nativeOrder());
獲取整數數組
vertex_array = buffer.asIntBuffer();
每個短整形占兩個字節.index_max為最大索引量
buffer = ByteBuffer.allocateDirect(index_max * Short.SIZE/8);
將『網絡字節』改為『主機字節』
buffer.order(ByteOrder.nativeOrder());
頂點短整數數組
index_array = buffer.asShortBuffer();
}
將頂點提交給OpenGL數組並觸發
public void SetVertices(float[] vertices,int offset,int count){
vertex_array.clear();// 清空緩存.設定當前位置
int len = offset + count;
for(int i=offset, j=0; i < len; i++, j++)
vertex_Buffer[j] = Float.floatToRawIntBits(vertices[i]);
vertex_array.put(vertex_Buffer, 0, count); // 寫入數據.移動當前位置
vertex_array.flip();// 觸發
}
將頂點索引提交給OpenGL數組
public void SetIndices(short[] indices,int offset,int count) {
index_array.clear();// 清空緩存.設定當前位置
index_array.put(indices, offset, count); // 寫入數據.移動當前位置
index_array.flip();// 觸發
}
綁定數據
public void Bind(){
GL10 gl = GRAPHICS.gl;
啟用頂點數組
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
設置當前寫入位置0
vertex_array.position(0);
設置頂點指針,每個頂點兩個元素.xy兩分量
gl.glVertexPointer(2, GL10.GL_FLOAT, vertex_size, vertex_array);
if(color_have == true){//顏色
啟用頂點顏色數組
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
設置當前寫入位置2
vertex_array.position(2);
設置顏色指針,RGBA四分量
gl.glColorPointer(4, GL10.GL_FLOAT, vertex_size, vertex_array);
}
if(texture_have ){// 紋理坐標
啟用紋理坐標數組
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
vertex_array.position(color_have?6:2);// 寫入位置
設置紋理坐標指針,UV兩分量
gl.glTexCoordPointer(2, GL10.GL_FLOAT, vertex_size, vertex_array);
}
}
取消綁定數據
public void Unbind(){
GL10 gl = GRAPHICS.gl;
關閉頂點紋理數組
if(color_have)
gl.glDisableClientState(GL10.GL_COLOR_ARRAY );
關閉頂點顏色數組
if(texture_have)
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}
繪畫三角形
public void Draw(int mode,int offset,int count){
GL10 gl = GRAPHICS.gl;
繪畫頂點
if(index_array != null){// 繪畫
index_array.position(offset);//
gl.glDrawElements(mode, count, GL10.GL_UNSIGNED_SHORT, index_array);
}
else{
gl.glDrawArrays(mode, offset, count);
}
}
}
投幣式淨水機之濾芯效果分析
投幣式淨水機不但擁有七個以上濾芯.而且還裝有紫外線殺菌燈.只要定期更換濾芯制水品質便有保正.
過濾層級 | 濾芯 |
1 | 『5微米中空棉濾芯』也稱『PP棉濾芯』 |
2/3 | 『壓縮活性碳芯』兩個 |
4 | 『1微米中空棉濾芯』也稱『PP棉濾芯』 |
5 | 『反滲透膜濾芯』也稱『PR膜』 |
6 | 『後置活性碳慮芯』 |
7 | 『礦化慮芯』 |
8 | 紫外線殺菌燈 |
濾芯 | 功能簡介 |
『5微米中空棉濾芯』也稱『PP棉濾芯』 | 去除水中大於5微米懸浮物如『鐵銹』『砂石』 |
『壓縮活性碳芯』兩個 | 去除水中氯氣、異味、異色、有機物、改善水質口感. |
『1微米中空棉濾芯』也稱『PP棉濾芯』 | 去除水中大於1微米懸浮物和雜質. |
『反滲透膜濾芯』也稱『PR膜』 | 『PR膜』孔徑為0.0001微米,需經高壓泵進入『PR膜』.去除『細菌』『病毒』『有機物』『重金屬』『農藥』『膠體』只有純水能透過『PR膜』而廢水則被排出,廢水不能飲用. |
『後置活性碳慮芯』 | 去除水中異味,水質甘甜. |
『礦化慮芯』 | 加入各種微量礦物元素.並進入水箱存儲 |
『紫外線殺菌燈』 | 殺菌後出水 |
濾芯 | 更換週期 |
『5微米中空棉濾芯』 | 1到2個月或PP濾棉變褐色 |
『壓縮活性碳芯』兩個 | 2到3個月或水質有異味 |
『1微米中空棉濾芯』 | 2到3個月或水質有異味 |
『反滲透膜濾芯』也稱『PR膜』 | 18到24個月或PP濾棉變褐色 |
『後置活性碳慮芯』 | 夏季每月更換,東季每2個月更換.更換越頻繁口感 |
『礦化慮芯』 | 每半年更換.各種微量礦物元素含量越高. |
你必須登入才能發表留言。